Apka na arduino i xbee
- luki
- Kierowca
- Posty: 1630
- Rejestracja: 03 lip 2012, 15:18
Re: Apka na arduino i xbee
Sprawdź ten kawałek
if (servo_val2 < (drive_center-10)){ // These if functions leave a buffer zone of 15 bits above and below the drive center value
move2=map(servo_val2,0,128,255,100);
digitalWrite(motorcon2, HIGH); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
else if (servo_val2 > (drive_center+10)){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
}
if (servo_val2 < (drive_center-10)){ // These if functions leave a buffer zone of 15 bits above and below the drive center value
move2=map(servo_val2,0,128,255,100);
digitalWrite(motorcon2, HIGH); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
else if (servo_val2 > (drive_center+10)){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
}
- kisielt
- Kierowca
- Posty: 74
- Rejestracja: 01 maja 2015, 20:48
- luki
- Kierowca
- Posty: 1630
- Rejestracja: 03 lip 2012, 15:18
Re: Apka na arduino i xbee
Kod jest jakiś nieprzejrzysty:
void loop() {
i = i+1;
if (i>=4000) i=0;
powinno być
for (int i = 0; i >= 4000 ; i ++) {
po drugie jak mapujesz operuj np . (0 , 1023 , 0 , 360 )
if (servo_val2 < (drive_center-10)){ // These if functions leave a buffer zone of 15 bits above and below the drive center value
move2=map(servo_val2,0,128,255,100);
digitalWrite(motorcon2, HIGH); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
else if (servo_val2 > (drive_center+10)){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
do tego spróbuj ten kod bez transmisji xbee ,będzie Ci łatwiej wyłapać coś , może to błąd z transmisją .
void loop() {
i = i+1;
if (i>=4000) i=0;
powinno być
for (int i = 0; i >= 4000 ; i ++) {
po drugie jak mapujesz operuj np . (0 , 1023 , 0 , 360 )
if (servo_val2 < (drive_center-10)){ // These if functions leave a buffer zone of 15 bits above and below the drive center value
move2=map(servo_val2,0,128,255,100);
digitalWrite(motorcon2, HIGH); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
else if (servo_val2 > (drive_center+10)){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
do tego spróbuj ten kod bez transmisji xbee ,będzie Ci łatwiej wyłapać coś , może to błąd z transmisją .
- Sławek
- Site Admin
- Posty: 14530
- Rejestracja: 21 gru 2011, 22:12
- Has thanked: 15 times
- Been thanked: 21 times
Re: Apka na arduino i xbee
Dla PWM wartosci sygnału to przedział 0-255
Co do petli to jest prawidłowa, leci do 4000 a potem jest zerowanie i od nowa tylko nie rozumiem idei po co ona jest, być może xbee tego wymaga, nie miałem to sie nie wypowiem
Pozdr
Co do petli to jest prawidłowa, leci do 4000 a potem jest zerowanie i od nowa tylko nie rozumiem idei po co ona jest, być może xbee tego wymaga, nie miałem to sie nie wypowiem
Pozdr
- kisielt
- Kierowca
- Posty: 74
- Rejestracja: 01 maja 2015, 20:48
Re: Apka na arduino i xbee
Przyszedł mi do głowy mały test. Wygrzebałem XBee z traktora, podłączyłem do kompa i patrzyłem co mi przychodzi. Okazuje się, że kontroler wysyła prawidłowo po trzy znaki. Zastanawiam się tylko, czy odbiornik rozpoznaje początek i koniec tego trzyznakowego przekazu.
Nie mniej chyba dostrzegam problem w traktorze. Sprawdzę zmianę na pętlę for i sprawdzę warunek złożony w "if". Zobaczymy
To nie do końca jest to samo. W pierwszym przypadku wykonuję 4000 razy pętlę loop(), w drugim w czasie jednej pętli loop() wykonuję 4000 pętlę for. W sumie z punktu widzenia funkcjonalności nie ma to większego znaczenia, więc i tego spróbujęluki pisze:Kod jest jakiś nieprzejrzysty:
void loop() {
i = i+1;
if (i>=4000) i=0;
powinno być
for (int i = 0; i >= 4000 ; i ++) {
To mapowanie jest OK, to akurat sprawdziłem. Tutaj zakres jest odwrócony bo i mapowanie musi być odwrócone. Gdy z joystickiem schodzę od połowy zakresu do zera, to traktor przyspiesza na cofaniu. Jedna wartość spada, druga wzrasta.luki pisze: po drugie jak mapujesz operuj np . (0 , 1023 , 0 , 360 )
if (servo_val2 < (drive_center-10)){ // These if functions leave a buffer zone of 15 bits above and below the drive center value
move2=map(servo_val2,0,128,255,100);
digitalWrite(motorcon2, HIGH); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
else if (servo_val2 > (drive_center+10)){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
do tego spróbuj ten kod bez transmisji xbee ,będzie Ci łatwiej wyłapać coś , może to błąd z transmisją .
Nie mniej chyba dostrzegam problem w traktorze. Sprawdzę zmianę na pętlę for i sprawdzę warunek złożony w "if". Zobaczymy
- kisielt
- Kierowca
- Posty: 74
- Rejestracja: 01 maja 2015, 20:48
Re: Apka na arduino i xbee
Zgadza się, jednak w przedziale od 0 do 100 prąd silnika nie jest w stanie nim zakręcić.Sławek pisze:Dla PWM wartosci sygnału to przedział 0-255
Pozdr
- luki
- Kierowca
- Posty: 1630
- Rejestracja: 03 lip 2012, 15:18
Re: Apka na arduino i xbee
Też mi jest trudno cokolwiek powiedzieć bo nie posiadam tego modułu ,a do tego jestem na etapie nauki ale z doświadczenia wiem jedno, że wklejanie całego kodu i doklejanie własnych kolumn często prowadzi do komplikacji .Spróbuj od komunikacji zobacz czy ustawiłeś poprawne dane w komunikacji obu xbbe (ustawień jest sporo) może coś przeoczyłeś jeśli gadają ze sobą dodawaj stopniowo resztę kodu ,to tylko moja sugestia.. Tak PWM to 0-255 ,a czytanie drążka to 0-1023.
- kisielt
- Kierowca
- Posty: 74
- Rejestracja: 01 maja 2015, 20:48
Re: Apka na arduino i xbee
Podłączyłem XBee z odbiornika do komputera, żeby zobaczyć co przychodzi... i przychodzi ok, nawet po skróceniu częstotliwości wysyłania z 1 na 4000 cykli do 1 na 50 cykli, szybciej też by pewnie dał radę. Apka więc OK,
Zastąpiłem moduły XBee kabelkami i to samo, nie były więc to też moduły XBee.
Wywaliłem z kodu co się dało skracając go do:
i dalej lipa.
Zacząłem podejrzewać różnice w działaniu mikrokontrolerów (jeden 16MHz, drugi 8), bufor danych przeładowany i zacząłem się zastanawiać, czy Arduino na odbiorze mi dobrze rozpoznaje kiedy się pakiet zaczyna i kiedy kończy. Zastąpiłem więc:
Tym;
I mamy pełny sukces. I nawet boudrate na poziomie 9600 jest w zupełności wystarczający.
Zastąpiłem moduły XBee kabelkami i to samo, nie były więc to też moduły XBee.
Wywaliłem z kodu co się dało skracając go do:
Kod: Zaznacz cały
void setup() {
// initialize serial:
Serial.begin(115200);
inputString.reserve(3);
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
pinMode(15, OUTPUT);
}
void loop() {
servo_val = map(data_val, 0x00, 0xFF, drive_min, drive_max); // scale the data value for use with the motor
servo_val2=servo_val;
if (servo_val2 > idle_high){
move2=map(servo_val2,128,255,100,255);
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, HIGH);
}
else { // If within the buffer turn off the motor
move2=100;
digitalWrite(motorcon2, LOW); // Set the direction with pins 7 and 8
digitalWrite(motorcon1, LOW);
}
while (Serial.available()) {
inputString=Serial.readString();
dat1=inputString[0];
dat2=inputString[1];
data_val=inputString[2];
}
}
Zacząłem podejrzewać różnice w działaniu mikrokontrolerów (jeden 16MHz, drugi 8), bufor danych przeładowany i zacząłem się zastanawiać, czy Arduino na odbiorze mi dobrze rozpoznaje kiedy się pakiet zaczyna i kiedy kończy. Zastąpiłem więc:
Kod: Zaznacz cały
while (Serial.available()) {
inputString=Serial.readString();
dat1=inputString[0];
dat2=inputString[1];
data_val=inputString[2];
}
Kod: Zaznacz cały
while(Serial.available() > 0)
{
char inChar = Serial.read();
if(inChar == SOP)
{
index = 0;
inData[index] = '\0';
started = true;
ended = false;
}
else if(index == 3)
{
ended = true;
break;
}
else
{
if(index < 79)
{
inData[index] = inChar;
index++;
inData[index] = '\0';
}
}
}
// We are here either because all pending serial
// data has been read OR because an end of
// packet marker arrived. Which is it?
if(started && ended)
{
// The end of packet marker arrived. Process the packet
// Reset for the next packet
started = false;
ended = false;
index = 0;
inData[index] = '\0';
}
data_val=inData[1];