Go Down

Topic: Communication Arduino Raspberry (Read 2490 times) previous topic - next topic

dadycoke

Bonjour tt le monde ,
j'essai de faire communiquer ma raspy avec mon arduino uno. En gros mon arduino est connecté a 3 capteur et je veux que ma raspberry recupere les données des trois capteurs une par une pour faire un traitement la dessus. La connexion est faite par le port USB et j'utilise coté raspy un programme en C pour l'uart.

L'objectif est que :

Raspy envoie "US1" pour ultrason 1 et l'arduino lui retourne la valeur de l'ultrason 1 ( 3 byte exemple 435).

Cependant j'ai un problème de synchro lorsque arduino répond. Coté Raspy je recois les 3 bytes soit 2 bytes ou 1 bytes ( en gros ca varie).
Si quelqu'un a une idée pour synchroniser  ça je suis preneur . Merci d'avance


dadycoke

ook Merci, j vai me mettre a la lecture tt de suite

dadycoke

j'ai lu le tuto il est très intérressent  cependant il traite que du coté arduino. Moi je reçois bien sur l'arduino, c'est la réponse de l'arduino que je ne parviens pas a lire convenablement sur la raspberry ( soit je recois la réponse en entier soit je ne lis que la moitié ... et des fois je ne lis rien du tout :smiley-eek: )

Mon problème se situe au niveau de la reception je crois ( en C pr l' uart ):

int rx_length = read (fd, (void*)rx_buffer, 255).

Quand j'ouvre le port /dev/ttyACM0 sans le mode O_NDELAY=> le programme reste la à attendre des donnée et n'en sort pas.
Quand j'ouvre le port en mode O_NDELAY  il sort immédiatemment et rx_lenght < 0

voici le code pr plus de précision
Code: [Select]

int fd = -1;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY);
if (fd != -1){
// Read up to 255 characters from the port if they are there
      unsigned char rx_buffer[256];
      int rx_length = read(fd, (void*)rx_buffer, 255);

      if (rx_length < 0){
              //An error occured
              printf("UART RX error\n");
      }
      else if (rx_length == 0){
              //No data waiting
      }
      else
      {
             //Bytes received
             rx_buffer[rx_length] = '\0';
            printf("%i bytes read : %s\n", rx_length, rx_buffer);
       }
}

alb12

Je viens aussi de commander un arduino dans le but de communiquer avec mon raspberry (qui ferra office de serveur web)
uart = usb ?
pour ma part je communiquerai que par du php je pense.
L'arduino enverra toute les minutes l'état des capteurs au raspberry qui enregistrera en base de donnée.

dadycoke

euhh pas vraiment.

uart = composant pour communiquer  via port serie

sur raspberry tu peux utiliser le port usb ( ou les gpio) pour communiquer en serie.

De meme que arduino utilise son port usb pour communiquer en serie ou  ses ports d'entrées sortie numérique

alb12

ok, je pense que pour une utilisation via une page web l'usb est préférable non?
Auriez vous un schéma explication votre connexion entre l'arduino et le Rpi?
merci d'avance

dadycoke

j'ai pas de schéma mais j'utilise une connection avec  cable usb c'est tout.

dadycoke

#8
Feb 18, 2013, 04:39 pm Last Edit: Feb 18, 2013, 04:44 pm by dadycoke Reason: 1
Regarde ce tuto il va t'aider pour ton projet
http://alexandre.alapetite.fr/doc-alex/raspberrypi-nodejs-arduino/index.fr.html

alb12

ok, je pensais que tu utilisé les ports gpio comme tu parlais de uart.
J'ai déjà regardé ce tuto mais étant habitué au php j'hésite entre les deux.

dadycoke

tu peux utiliser l' usb et communiquer par serie ( avec uart ) sur la raspberry et sur l'arduino aussi

fdufnews


j'ai lu le tuto il est très intérressent  cependant il traite que du coté arduino. Moi je reçois bien sur l'arduino, c'est la réponse de l'arduino que je ne parviens pas a lire convenablement sur la raspberry ( soit je recois la réponse en entier soit je ne lis que la moitié ... et des fois je ne lis rien du tout :smiley-eek: )

Mon problème se situe au niveau de la reception je crois ( en C pr l' uart ):

int rx_length = read (fd, (void*)rx_buffer, 255).

Quand j'ouvre le port /dev/ttyACM0 sans le mode O_NDELAY=> le programme reste la à attendre des donnée et n'en sort pas.
Quand j'ouvre le port en mode O_NDELAY  il sort immédiatemment et rx_lenght < 0

voici le code pr plus de précision
Code: [Select]

int fd = -1;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY);
if (fd != -1){
// Read up to 255 characters from the port if they are there
      unsigned char rx_buffer[256];
      int rx_length = read(fd, (void*)rx_buffer, 255);

      if (rx_length < 0){
              //An error occured
              printf("UART RX error\n");
      }
      else if (rx_length == 0){
              //No data waiting
      }
      else
      {
             //Bytes received
             rx_buffer[rx_length] = '\0';
            printf("%i bytes read : %s\n", rx_length, rx_buffer);
       }
}


Le morceau de code sortie de son contexte ne permet pas de juger s'il fonctionne ou non. Ce qu'il faut bien voir c'est que les caractères que tu envoies par l'arduino arrivent relativement lentement par rapport à la vitesse ou ton code est exécuté. Donc si tu attends 3 caractères par exemples il faudrait faire une boucle d'attente non bloquante. Tu boucles sur le read jusqu'à avoir 3 caractères dans le buffer ou si un hors temps s'est écoulé.

dadycoke

"Ce qu'il faut bien voir c'est que les caractères que tu envoies par l'arduino arrivent relativement lentement par rapport à la vitesse ou ton code est exécuté."

@fdufnews : Tu a tout a fait raison sur ce point. Je vais essayer de boucler sur le read et je vous tiendrais au courant

dadycoke

@fdufnews : Merci ca marche je recois bien les 3 octets

dadycoke

Bonjour le monde

Bonjour fdufnews

voila j'utilise le meme code de la derniere fois qui m'a permis de recuperer 3 octet sur une répnse envoyé par d'arduino
en utilisant une boucles sur le read jusqu'à avoir 3 caractères dans le buffer sans utilisé un hors temps ( donc mon programme rest la a attendre une réponse d'arduino qui vient jamais )
Mon probleme je crois savoir ou il se situe : c'est une question de timing entre arduino et raspy.
Quelqun aurai t il une astuce ?
Merci

Go Up