Aller au contenu


Photo
- - - - -

Raspberry Pi -> Arduino USB C++

rs232 Tx Rx Arduino Raspberry Pi 3 C++

44 réponses à ce sujet

#1 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 03:20

Bonjour les Maker's, nouvelle étape, maintenant que j'ai réussi (et avec l'aide des Maker's du forum) à connecter l'Arduino sur la Pi et ainsi me servir de l'IDE Arduino pour programmer direct sur celui ci, ma nouvelle mission et d'utiliser un programme sur la Pi qui va communiquer avec l'Arduino en passant par l'USB en utilisant un programme test en C, pour ce faire j'ai suivi ce tuto : 

 

https://www.monocili...sing-usb-and-c/

 

En utilisant cette librairie pour la communication USB :

 

https://www.teuniz.net/RS-232/

 

 

Par la suite j'ai eu des petits soucis, donc, si vous avez un problème de Comport en exécutant le programme en C, ouvrez le terminal sur la Pi et tapez ceci : 

 

ls /dev/tty*

 

Dans les infos données on doit retrouver normalement une de ces lignes voir les deux : 

 

/dev/ttyACM0

/dev/ttyAMA0

 

Une des deux lignes correspond à votre Arduino, mais là on a besoin du port, regardez sur ce lien https://www.teuniz.net/RS-232/ et tout en bas on retrouve les infos nécessaire pour ma part je suis sur le port 24.

 

Je vous met la liste des ports les plus fréquents via USB :

 

16 ttyUSB0

17 ttyUSB1

18 ttyUSB2

19 ttyUSB3

20 ttyUSB4

21 ttyUSB5

22 ttyAMA0

23 ttyAMA1

24 ttyACM0

25 ttyACM1

 

 

Coter Arduino

 

Copier coller ce bout de code, il va nous permettres d'ouvrir le port pour renvoyer l'information à la Pi :

Il n'y a pas besoin de toucher à quoi que ce soit, on Téleverse.

void setup() {
  Serial.begin(57600); // opens serial port, sets data rate to 57600 baud
}
void loop() {
  while (Serial.available() > 0) { // if any data available
    char incomingByte = Serial.read(); // read byte
    Serial.write(incomingByte); // send it back
  }
}

Coter Pi :

 

On colle ce code avec le bon port :

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "rs232.h"
#define BUF_SIZE 128

int main()
{
  int i=0;
  int cport_nr=16; /* /dev/ttyUSB0 */  //<------- ici, la valeur par défaut sera surement à changer on retrouve le 16, pour ma part je devais mettre le 24 comme port.
  int bdrate=57600; /* 9600 baud */
  char mode[]={'8','N','1',0}; // 8 data bits, no parity, 1 stop bit
  char str_send[2][BUF_SIZE]; // send data buffer
  unsigned char str_recv[BUF_SIZE]; // recv data buffer
  strcpy(str_send[0], "This is a test string.");
  strcpy(str_send[1], "This is another test string.");

  if(RS232_OpenComport(cport_nr, bdrate, mode))
  {
    printf("Can not open comport\n");
    return(0);
  }
  usleep(2000000);  /* waits 2000ms for stable condition */
  while(1)
  {
    RS232_cputs(cport_nr, str_send[i]); // sends string on serial
printf("Sent to Arduino: '%s'\n", str_send[i]);
usleep(1000000);  /* waits for reply 1000ms */
int n = RS232_PollComport(cport_nr, str_recv, (int)BUF_SIZE);
if(n > 0){
      str_recv[n] = 0;   /* always put a "null" at the end of a string! */
      printf("Received %i bytes: '%s'\n", n, (char *)str_recv);
}
i++;
    i %= 2;
    usleep(5000000);  /* sleep for 5 Second */
  }
  return(0);
}

Compilez et exécutez, et si vous retrouvez ce genre d'infos à votre écran coté Pi (programme C) c'est que c'est bon, le dialogue s’effectue...

Perso je suis passé par Code::Blocks pour compiler le programme, je n'ai pas la même fenêtre que le screen ci dessous, mais, les infos bien entendu sont les mêmes.

 

Arduino_serial_08.png

 

Voili voilou, j'espère que cela vous aura aidé ^^

 

Je vais essayer de "remanier" le code en version C++, je m'avance peut être, mais bon, ça ne coûte rien d'essayer. ;)


Modifié par Oliver17, 09 décembre 2017 - 06:12 .

signature_01.png -->

 

Mon Tipeee
 


#2 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 03:44

tu n'as pas oublié de rajouter rs232.c dans la commande gcc ?



#3 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 03:55

Hum, suis pas sur d'avoir bien compris, mais j'ai rajouté les deux fichiers rs232.c et rs232.h à la racine du projet.

 

J'ai aussi essayé ceci via la console : 

 

cd /home/pi/Serial
gcc arduino_test.c rs232.c -Wall -Wextra -o2 -o arduino_test
./arduino_test

 

sans succès et en essayant ça : sudo gcc arduino_test.c

j'ai les mêmes messages obtenu plus haut.

 

Edit : ah, je viens de relire sur le site, c'est lier le rs232.c que je ne comprend pas comment faire.

En passant par Code Blocks

 

 

AAhhhh ça progresse :

 

la fenêtre de dialogue s'ouvre avec une erreur : "unable to open comport : No such file or directory, can not open comport.

 

Je dois être sur la bonne voie ^^


Modifié par Oliver17, 19 octobre 2017 - 04:16 .

signature_01.png -->

 

Mon Tipeee
 


#4 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 04:18

normalement il n'y a rien à faire de plus que la commande, si tous tes fichiers sont exactement dans le même répertoire, je ne vois pas pourquoi ça ne compile pas. vu que la commande est faire avec l'utilisateur pi je pense qu'il n'y pas de problème de droit de lecture. Peut-être un problème d'encodage.

sinon essai de retirer les deux fichiers rs232 du répertoire, et tu en créer de nouveau dans lesquels tu colleras leur contenu respectif (ça peut paraître bizarre mais j'ai déjà eu un cas similaire une fois)

 

Edit : Code Blocks sur le pi j'y crois moyen



#5 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 04:48

Et bien comme dis juste au dessus ;) j'ai un problème d'ouverture de port com apparemment maintenant, j'ai bien regardé la doc (sans être sur de mon coup), mais je ne vois pas d'ou peut venir le problème.


signature_01.png -->

 

Mon Tipeee
 


#6 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 05:03

Autant pour moi. Sinon tu es sûr que c'est le même numéro de port pour toi?

#7 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 05:14

J'ai essayé plusieurs numéros comme sur la doc, rien y fait :( ou alors je m'y prend mal.

 

Sur ce lien tu retrouves tous les ports tout en bas de la page :

 

https://www.teuniz.net/RS-232/


signature_01.png -->

 

Mon Tipeee
 


#8 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 05:18

Oui j'ai vu le tableau, mais comment sais tu si tu es en ttyUSB0. Que te retourne les commandes ls et lsusb ?

#9 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 05:32

Ça justement j'en sais rien si je suis bien en ttyUSB0, j'ai bien cherché mais je n'ai pas trouvé d'informations.

 

Pour la commande lsusb là ou se retrouve l'Arduino ça me retourne : Bus 001 Device 004 : ID 2a03:0043

 

Je pensais trouver la solution la dedans, mais non :'(


signature_01.png -->

 

Mon Tipeee
 


#10 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 05:35

Et cette commande. : setserial -g /dev/ttyS[0123456789]
Ou la commande ls

#11 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 06:05

C'est bon j'ai trouvé, il faut faire dans le terminal sur la Pi : 

 

cd /dev

ls *tty*

 

Regardez ce que vous avez dans la liste, genre si on retrouve une de/ ou ces indications :

 

ttyAMA0

ttyACM0

 

l'un des deux correspond à l'Arduino

 

 

Regardez à quoi cela correspond dans le tableau tout en bas de la page : https://www.teuniz.net/RS-232/

 

Pour ma part : 

 

22 = ttyAMA0

 

On relance le programme et hop, ça communique, maintenant reste plus qu'à comprendre un peu tous ça :)

 

Merci ;)


signature_01.png -->

 

Mon Tipeee
 


#12 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 19 octobre 2017 - 06:29

Franchement, c'est cool et merci du partage 🙂. A tout à l'heure dans un nouveau post 😁

#13 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 19 octobre 2017 - 06:47

Je me suis un peu avancé.

 

En fait je devrais avoir ça comme message : 

 

Arduino_serial_08.png

 

 

Et en fait je n'ai pas le début de ligne "Received 28 (ou autres valeurs) bytes : (message)", en fais j'ai tous le temps "Sent to Arduino : (message)"

 

Mais déjà ça envoi quelque chose  :)

 

Il y a juste le retour de l'Arduino qui ne fonctionne pas.


signature_01.png -->

 

Mon Tipeee
 


#14 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 20 octobre 2017 - 08:34

Plop all ^^

 

Bon dans le code j'ai modifié la valeur du "if (n > 0)" à "if (n > -1)" pour forcer l'affichage du "Received (valeur) bytes" et le truc donc, le Receveid est toujours à 0 bytes et je n'ai pas les messages qui suit non plus, quelqu'un aurait il un avis, je ne pige pas le pourquoi du comment...

 

Edit : chose sur, l'Arduino reçoit bien quelque chose, une led clignote des quelle reçoit une information.

 

Merci


Modifié par Oliver17, 20 octobre 2017 - 09:00 .

signature_01.png -->

 

Mon Tipeee
 


#15 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 20 octobre 2017 - 09:19

et quand tu as essayé le programme arduino, en envoyant des données depuis la console ça fonctionnait bien ?



#16 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 20 octobre 2017 - 09:50

Tu parles du programme de test sur Arduino en passant par le moniteur série ?

Si c'est le cas, ça fonctionne bien.


signature_01.png -->

 

Mon Tipeee
 


#17 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 20 octobre 2017 - 10:03

Franchement, je trouve ça bizarre. 

Je vais peut-être dire une bêtise mais je me lance : 

hier tu as vue deux périphérique série ttyAMA0 et ttyACM0 tu  sais c'est quoi le deuxième ? si ça se trouve les deux pointe l'arduino mais un pour l'envoie et l'autre pour la réception si tel est le cas tu pourrai le vérifier en copiant ce block

 

 

  if(RS232_OpenComport(cport_nr, bdrate, mode))

  {
    printf("Can not open comport\n");
    return(0);
  }

 

mais avec l'autre numéro de port 

et modifier la ligne 

 

int n = RS232_PollComport(cport_nr, str_recv, (int)BUF_SIZE);

 

 

Mais bon, je ne sais pas si c'est vraiment possible et ça parait improbable mais bon ...



#18 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 758 messages
  • Gender:Male
  • Interests:Glenn

Posté 20 octobre 2017 - 10:16

Alors l'idée n'est pas mauvaise le second c'est tous simplement mon clavier.

 

J'ai fais le test de débrancher l'Arduino et lorsque je relance le programme il m'indique clairement que c'est pas bon qu'il ne peut pas ouvrir le port.

 

Par contre, si j’exécute le programme sur l'autre port, et bien il tourne de la même façon, c'est là que je trouve ça bizarre.

 

Edit : je ne comprend pas, je viens de tester à nouveau et ça fonctionne, pour infos (mode boulet), lorsque j'ai fais mes tests j'avais lancé auparavant un exemple avec la librairie sur l'arduino, et le programme en C ne fonctionné pas, là, j'ai lancé le test de communication sur l'Arduino avec le retour sur le Moniteur série, je relance le programme en C et il me dit que c'est Buzy, ok, je stop le programme Arduino, je relance le programme en C et là, miracle, ça fonctionne :)

 

Je vais refaire le test en créant la même erreur voir.

 

Edit : bravo olive, normal que ça fonctionné pas, lol, si je n'ouvre pas le port coter Arduino ça ne risque pas de fonctionner.

 

Dicton maison : Si tu lances une balle de Baseball à un copain imaginaire, ne t'attend pas à ce qu'il te la renvoi...

 

Comprendra qui pourra ^^

 

Merci beaucoup Arobasseb pour ton aide ;)

Maintenant me reste plus qu'à essayer de "maitriser" la chose ^^

 

Mais je vais essayer de faire ça en C++ plutôt que de le laisser en C dans un premier temps, enfin si c'est possible.

 

Merci :)

 

PS : je fais tout de même un résumer tout à l'heure.


signature_01.png -->

 

Mon Tipeee
 


#19 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 20 octobre 2017 - 10:21

Donc en gros le port série était déjà pris par la console arduino si j'ai bien compris ?



#20 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne
  • Interests:La vie sous les tropiques

Posté 20 octobre 2017 - 10:32

Oui c'est cela , le port USB ne peut pas etre utilisé simulanément par le RPI et le moniteur Arduino.

 

Il est possible d'envoyer des messages debug Arduino vers le Rpi via Usb par des "Serial.print("Debug = xxxxx ) moyennant le traitement de ces messages au niveau du code Rpi

 

Arduino ready.PNG

 

Le message "Arduino sent 'Arduino ready' " affiché au niveau Rpi a été envoyé par l'Arduino


Pura vida

 

Ma chaine youtube  https://www.youtube....EQ5MTR3A/videos

Tutoriel MIT Inventor2  https://www.robot-ma...e-robot-mobile/




Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : rs232, Tx Rx, Arduino, Raspberry Pi 3, C++

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users