Skocz do zawartości

[C] [arduino Leonardo] komunikacja z komputerem...


cepelia

Pomocna odpowiedź

Witam

Zaobserwowałem pewien problem podczas komunikacji z kontrolerem w robocie.

Mianowicie chodzi o płytkę Romeo all in one, na której pokładzie siedzi Mega32u4 i jest kompatybilna z Arduino Leonardo, otóż problem polega na tym że nie mogę odebrać żadnych danych z kontrolera w terminalu... ale żeby nie było łatwo, terminal z Arduino (dokładnie monitor portu szeregowego) działa prawidłowo, terminal windowsowy (obojętnie czy napisany przeze mnie czy jakiś inny) nie odbiera niczego, natomiast komunikacja komputer -> sterownik przy użyciu terminala działa prawidłowo. Zauważyłem jeszcze jedną rzecz, mianowicie podczas wysyłania do programu Arduino (monitor portu szeregowego) zapala się lampka transmisji natomiast przy otwartym porcie w terminalu windowsowym lampka nie błyska...

schemat płytki Romeo Jak widać na schemacie led pokazujący transmisję jest niezależny od programu, błyska jak płynie prąd...

W terminalu windowsowym ustawiam najpierw parametry połączenia, później otwieram port i słucham handlera SerialPort1.DataReceived, bomba ustawiona na wywołanie tego handlera nie pokazuje niczego tak jak by nie zostały przesłane żadne dane. Po stronie kontrolera używam komendy Serial.print, Serial.write i nic...

Spotkaliście się z czymś takim ??? może to kwestia innego zainicjowania portu ??? nie mam zbyt dużego doświadczenia z Arduino...

Pozdrawiam i z góry dziękuję za podpowiedzi 🙂

Link do komentarza
Share on other sites

void setup(void) 
{ 
 int i;
 for(i=4;i<=7;i++)
   pinMode(i, OUTPUT);  //wyjścia do mostka 

 Serial.begin(57600);      //Baud Rate próbowałem na różnych prędkościach

 Serial.println("Start!");  

//deklaracja czujników 3xIR i 3x Bumper
 pinMode(srodekIR,INPUT);
 pinMode(prawyIR,INPUT);
 pinMode(lewyIR,INPUT);

 pinMode(prawyB,INPUT);
 pinMode(lewyB,INPUT);
 pinMode(srodekB,INPUT);


} 

tak jak opisałem wyżej, loop nawet najbardziej minimalny nie działa ze zwykłym terminalem, z arduino bez problemu...

void loop(void) 
{
 adc_key_in = analogRead(0);    // odczyt adc z linii z przyciskami  
 /* get the key */
 key = get_key(adc_key_in);    // skok do procedury rozpoznawania przycisku
 if (key != oldkey) 
 {   // if keypress is detected
   delay(50);                                // prosty debouncer
   adc_key_in = analogRead(0);    //   
   key = get_key(adc_key_in);      // 
   if (key != oldkey) 
   {         
     oldkey = key;
     if (key >=0)
     {
       switch(key)                           // założenie jest takie że chciałem napisać coś w 
       {                                          // rodzaju prostej maszyny stanów i wysyłać tylko 
       case 0: stan = 'w';                 // rozkaz z danym stanem z programu komputerowego
       break;                                  // ale do tego celu muszę mieć info z czujników 
       case 1: stan = 'a';                 // a nie mam bo nie mogę odczytać uart'u
       break;
       case 2: stan = 's';
       break;
       case 3: stan = 'd';
       break;
       case 4: stan = 'x';
       }


//        Serial.println(key);               
                                                    // choć by tutaj w terminalu arduino 
                                                    //działa ok w zwykłym nie
      }                                            // i obojętnie czy zastosuję print, println czy write 
   }                                               // jest to samo
 }



 if(Serial.available())                      // tu odczytuję przychodzące znaki z terminala
 {
  char val = Serial.read();
   if(val != -1)
   {
     switch(val)
     {
     case 'w'://Move Forward
       stan = 'w';
       break;
     case 's'://Move Backward
       stan = 's';
       break;
     case 'a'://Turn Left
       stan = 'a';
       break;       
     case 'd'://Turn Right
       stan = 'd';
       break;
     case 'z':
       Serial.println("Hello");
       break;
     case 'x':
       stan = 'x';
       stop();
       break;
     }
   }

   else stop();
 }
                                                          // tutaj skaczę bezpośrednio do procedur 
                                                          // które zadają określone stany na mostku
 if(stan == 'w') Move_Forward(); 
 else if(stan == 's') Move_Backward(); 
 else if(stan == 'a') Move_turn_L();
 else if(stan == 'd') Move_turn_R();
 else if((stan == 'x') && (digitalRead(srodekB)) || (digitalRead(lewyB)) || (digitalRead(prawyB))) back_off (low_speed,low_speed); 
 else stop();
 }

opisy są w kodzie

Link do komentarza
Share on other sites

Nie pokazałeś całego kodu, szkoda.

Czy testowałeś to na najprostszych przypadkach typu odsyłanie echa znaku który właśnie przyszedł?

Czy w tym szczególnym przypadku "stan" dostał atrybut volatile? Jeżeli nie, optymalizator mógł uznać, że podstawienie do zmiennej, której później w tej samej funkcji nie używasz można sobie darować i wywalił wszystkie podstawienia w ciele switch(key).

EDIT: Nie, to przecież ta sama funkcja...

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Czy jesteś pewien, że w terminalu ustawisz właściwe parametry transmisji? Próbowałeś wgrać na Romeo jakiś inny kod komunikujący się z komputerem i przetestować?

Link do komentarza
Share on other sites

proszę bardzo cały kod z arduino...

int adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
char stan = 'x';

void setup(void) 
{ 
 Serial.begin(57600);      
} 

void loop(void) 
{
 adc_key_in = analogRead(0);      
 /* get the key */
 key = get_key(adc_key_in);    
 if (key != oldkey) 
 {   // if keypress is detected
   delay(50);      
   adc_key_in = analogRead(0);      
   key = get_key(adc_key_in);    
   if (key != oldkey) 
   {         
     oldkey = key;
     if (key >=0)
     {
       switch(key)
       {
       case 0: stan = 'w'; 
       break;
       case 1: stan = 'a';
       break;
       case 2: stan = 's';
       break;
       case 3: stan = 'd';
       break;
       case 4: stan = 'x';
       }
       Serial.println(key);
       Serial.write(stan);
      }
   }
 }}


 int get_key(unsigned int input)
{   
 int k;
 for (k = 0; k < NUM_KEYS; k++)
 {
   if (input < adc_key_val[k])
   {  
     return k;  
   }
 }
 if (k >= NUM_KEYS)
   k = -1;     
 return k;
}

tak jak mówiłem w terminalu programu arduino to działa bez problemu w zwykłym nie...

komunikacja w stronę arduino ze zwykłego terminala jest ok...

nie odbieram żadnych danych w zwykłym terminalu...

//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(20,21); // RX, TX
void setup()  
{
 // Open serial communications and wait for port to open:
 Serial.begin(57600);
 while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }
 Serial.println("Goodnight moon!");
 // set the data rate for the SoftwareSerial port
 //mySerial.begin(4800);
 //mySerial.println("Hello, world?");
}

void loop() // run over and over
{
 //if (mySerial.available())
 //  Serial.write(mySerial.read());
 if (Serial.available()) Serial.write(Serial.read());
   //mySerial.write(Serial.read());
}

to też działa w terminalu arduino w zwykłym nie...

Link do komentarza
Share on other sites

No dobra, w sumie to nie ma co tu być źle. Piszesz, że a terminalu Arduino działa, ale nie działa w innym. Jakim? Z opisu sądząc tworzysz własną aplikację komunikującą się przez port szeregowy. Może tu jest błąd?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.