Pages: [1] 2   Go Down
Author Topic: Communication Arduino Raspberry  (Read 1877 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 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
Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3430
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un bon tuto
http://arduino.cc/forum/index.php/topic,102540.0.html
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Regarde ce tuto il va t'aider pour ton projet
http://alexandre.alapetite.fr/doc-alex/raspberrypi-nodejs-arduino/index.fr.html
« Last Edit: February 18, 2013, 10:44:19 am by dadycoke » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 175
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3430
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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é.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1] 2   Go Up
Jump to: