Apka na arduino i xbee

Regulatory, sterowniki, serwa, pakiety itp.
Awatar użytkownika
luki
Kierowca
Posty: 1630
Rejestracja: 03 lip 2012, 15:18

Re: Apka na arduino i xbee

Post autor: luki »

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);
}

Awatar użytkownika
kisielt
Kierowca
Posty: 74
Rejestracja: 01 maja 2015, 20:48

Re: Apka na arduino i xbee

Post autor: kisielt »

Chodzi Ci o złożoność warunków do "if"? Sprawdzę to.

Awatar użytkownika
griszaa
Złomiarz
Posty: 10987
Rejestracja: 22 sie 2012, 04:52
Been thanked: 2 times

Re: Apka na arduino i xbee

Post autor: griszaa »

Jak ja nienawidze programowania ... :zly

Awatar użytkownika
luki
Kierowca
Posty: 1630
Rejestracja: 03 lip 2012, 15:18

Re: Apka na arduino i xbee

Post autor: luki »

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ą .

Awatar użytkownika
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

Post autor: Sławek »

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

Awatar użytkownika
kisielt
Kierowca
Posty: 74
Rejestracja: 01 maja 2015, 20:48

Re: Apka na arduino i xbee

Post autor: kisielt »

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.
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 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: 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ą .
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.

Nie mniej chyba dostrzegam problem w traktorze. Sprawdzę zmianę na pętlę for i sprawdzę warunek złożony w "if". Zobaczymy

Awatar użytkownika
kisielt
Kierowca
Posty: 74
Rejestracja: 01 maja 2015, 20:48

Re: Apka na arduino i xbee

Post autor: kisielt »

Sławek pisze:Dla PWM wartosci sygnału to przedział 0-255 :)

Pozdr
Zgadza się, jednak w przedziale od 0 do 100 prąd silnika nie jest w stanie nim zakręcić. :eyes

Awatar użytkownika
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

Post autor: Sławek »

To było do postu lukiego :)

Awatar użytkownika
luki
Kierowca
Posty: 1630
Rejestracja: 03 lip 2012, 15:18

Re: Apka na arduino i xbee

Post autor: luki »

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.

Awatar użytkownika
kisielt
Kierowca
Posty: 74
Rejestracja: 01 maja 2015, 20:48

Re: Apka na arduino i xbee

Post autor: kisielt »

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:


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];
 }    
}
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:

Kod: Zaznacz cały

while (Serial.available()) {   
  inputString=Serial.readString();
  dat1=inputString[0];
  dat2=inputString[1];
  data_val=inputString[2];
 }
Tym;

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];
I mamy pełny sukces. I nawet boudrate na poziomie 9600 jest w zupełności wystarczający.

ODPOWIEDZ