Aller au contenu


Photo
- - - - -

Raspberry Pi -> Arduino USB C++

rs232 Tx Rx Arduino Raspberry Pi 3 C++

44 réponses à ce sujet

#21 Oliver17

Oliver17

    Pilier du forum

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

Posté 20 octobre 2017 - 10:34

En fait, ce que j'ai compris, c'est que le programme Arduino était déjà occupé à exécuter un programme pour l'affichage du OLED et donc, comme aucun port n'était ouvert sur Arduino, il ne risquait pas de renvoyer quoi que ce soit.


signature_01.png -->

 

Mon Tipeee
 


#22 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 20 octobre 2017 - 10:39

En fait, ce que j'ai compris, c'est que le programme Arduino était déjà occupé à exécuter un programme pour l'affichage du OLED et donc, comme aucun port n'était ouvert sur Arduino, il ne risquait pas de renvoyer quoi que ce soit.

 

Ah je pensais que là tu utilisais le même code arduino du tuto tout simplement. 



#23 Oliver17

Oliver17

    Pilier du forum

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

Posté 20 octobre 2017 - 10:39

Désolé Arobasseb, c'est moi qui et chier dans la colle si je puis dire :(


signature_01.png -->

 

Mon Tipeee
 


#24 arobasseb

arobasseb

    Membre chevronné

  • Administrateur
  • PipPipPipPip
  • 737 messages
  • Gender:Male
  • Location:BORDEAUX (33)

Posté 20 octobre 2017 - 10:44

Désolé Arobasseb, c'est moi qui et chier dans la colle si je puis dire :(

 

Pas grave :) , mais c'est vrai qu'en debug distant on ne fait qu'avec les informations données et donc des hypothèses qui peuvent paraître saugrenues. Mais le plus important finalement, après le fait que ça fonctionne maintenant, c'est que tu ais partagé tout les points où tu as bloqué et leur résolution, sachant que toutes ces erreurs arrivent à n'importe qui, donc que du positif ;)



#25 Oliver17

Oliver17

    Pilier du forum

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

Posté 20 octobre 2017 - 12:56

Bon, j'ai modifier mon premier post, j'espère que je n'ai rien oublié ^^

 

Edit : par contre je me suis rendu compte d'un truc, c'est que je perd des caractères à la fin sur le retour de l'Arduino.

j'ai testé à plusieurs bauds différents de 9600 à 115200 mais c'est toujours pareil...


Modifié par Oliver17, 20 octobre 2017 - 01:10 .

signature_01.png -->

 

Mon Tipeee
 


#26 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 22 octobre 2017 - 04:45

Comment le Rpi détecte un message reçu sur l'usb, le format du message Rpi <-> Arduino comprends t'il un marqueur de début et de fin de message comme ceci " <message> " ?

Pura vida

 

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

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


#27 Oliver17

Oliver17

    Pilier du forum

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

Posté 22 octobre 2017 - 04:51

Houla, je ne suis plus sur cette lib, j'essaye la lib fstream en c++.


signature_01.png -->

 

Mon Tipeee
 


#28 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 08 novembre 2017 - 09:01

J'ai fait un test avec ta lib rs-232.

 

Code arduino : 


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


void loop() {
  while (Serial.available() > 0) { // if any data available
    char incomingByte = Serial.read(); // read byte
    Serial.print(incomingByte); // send it back
  }
}

Code cpp sur le raspberry :

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "rs232.h"


int main()
{
  int counter=0, i, n,
      cport_nr=16,  
      bdrate=115200; 

  unsigned char buf[4096];
  char str[1024];
  char mode[]={'8','N','1',0};


  if(RS232_OpenComport(cport_nr, bdrate, mode))
  {
    printf("Can not open comport\n");

    return(0);
  }
  printf("Comport opened\n");

  while(1)
  {
    n = RS232_PollComport(cport_nr, buf, 4095);

    if(n > 0)
    {
      buf[n] = 0;   /* always put a "null" at the end of a string! */

      for(i=0; i < n; i++)
      {
        if(buf[i] < 32)  /* replace unreadable control-codes by dots */
        {
          buf[i] = '.';
        }
      }

      printf("received %i bytes: %s\n", n, (char *)buf);
    }

    sprintf(str, "Hello %d", counter++);
    RS232_cputs(cport_nr, str);
    printf("sent: %s\n", str);
    usleep(1000000);  /* sleep for 100 milliSeconds */
  }

  return(0);
}


Ben ... ça fonctionne bien :

root@raspberrypi2b:/home/pi/testserial/RS-232# gcc demo_rx.c rs232.c -Wall -Wextra -o2 -o test_rx
root@raspberrypi2b:/home/pi/testserial/RS-232# ./test_rx 
Comport opened
sent: Hello 0
received 7 bytes: Hello 0
sent: Hello 1
received 7 bytes: Hello 1
sent: Hello 2
received 7 bytes: Hello 2
sent: Hello 3
received 7 bytes: Hello 3
sent: Hello 4
received 7 bytes: Hello 4
sent: Hello 5
received 7 bytes: Hello 5
sent: Hello 6
received 7 bytes: Hello 6
sent: Hello 7
received 7 bytes: Hello 7
sent: Hello 8
received 7 bytes: Hello 8
sent: Hello 9
received 7 bytes: Hello 9
sent: Hello 10
received 8 bytes: Hello 10
sent: Hello 11
received 8 bytes: Hello 11
sent: Hello 12
^C
root@raspberrypi2b:/home/pi/testserial/RS-232# 

Notes : 

Pour trouver le device du port usb, tu débranche et tu branche le câble usb. tu lance la commande dmesg. La dernière ligne donne : 

FTDI USB Serial Device converter now attached to ttyUSB0

C'est donc (pour moi) /dev/ttyUSB0. Soit le 16 dans le programme.

 

Pour t'aider, il y a aussi la commande lsusb.

 

Si tu le fait (et tu fait bien de le faire) avec le user pi, il faut lui donner le droit d'aller sur le port usb :

sudo usermod -a -G dialout pi

J'ai fait ce test avec un raspberryPI 2 B et un arduino nano.


Modifié par Path, 08 novembre 2017 - 09:05 .
ajout de notes


#29 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 08 novembre 2017 - 09:24

Et à la demande de Mike sur le discord, ça fonctionne aussi pour des messages plus longs. Jusqu'à 1024 octets, parce que j'ai limité le buffer à cette taille. Mais on peut l'augmenter :)

 

Spoiler


#30 Oliver17

Oliver17

    Pilier du forum

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

Posté 09 novembre 2017 - 09:54

C'est un truc de dingue quand même, je viens de regarder ton code, c'est la même chose, bon, je test ça tout à l'heure si je peux.

 

PS : j'allais le dire pour les messages plus long lorsque j'ai vu le "Hello 1" :)

 

Edit : sinon pour trouver ton port sur pi tu fais ls /dev/tty*
Ça se retrouve assez facilement aussi ;)

 

Merci ;)


signature_01.png -->

 

Mon Tipeee
 


#31 Oliver17

Oliver17

    Pilier du forum

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

Posté 09 novembre 2017 - 12:57

Donc, voici ce que j'ai fais, 

 

Code Arduino :

void setup() {
  Serial.begin(115200); //opens serial ports, 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
 
   }
}

Code Raspberry C++ :

#include <iostream>
#include "rs232.h"

#define BUF_SIZE 128

using namespace std;

int main()
{

    int cport_nr(24); // dev/ttyACM0
    int bdrate(115200); // Baud
    char mode []={'8','N','1',0}; // 8 data bits, no parity, 1 stop bit
    char str_send[BUF_SIZE];
    
    unsigned char str_recv[BUF_SIZE]; // recv data buffer

    strcpy(str_send, "coucou robot maker plop plop.");

    if (RS232_OpenComport(cport_nr, bdrate, mode))
    {
        cout <<"Can not open comport"<< endl;
        return 0;
    }

    sleep(2); // waits 2s for stable condition
    cout << "Raspberry connecté : "<< endl;

    while(1)
    {
        RS232_cputs(cport_nr, str_send);// send string on serial
        cout <<"Envoie à Arduino : " << str_send << endl;
        sleep(1); // waits for reply 1s

        int n = RS232_PollComport(cport_nr, str_recv, BUF_SIZE);
        if (n > 0)
        {
            str_recv[n] = 0; // always put a "null" at the end of a string
            cout <<"Reçu : "<< n <<" bytes. " << endl;
            cout << str_recv << endl;

        }
    }
    return 0;
}

Le résultat : 

Raspberry connecté : 
Envoie à Arduino : coucou robot maker plop plop.
Reçu : 17 bytes
coucou robot makr

etc etc avec un rendu aléatoire du nombre de bytes par moment, cela peut être 16 comme 18 bytes.

 

 

 


signature_01.png -->

 

Mon Tipeee
 


#32 Oliver17

Oliver17

    Pilier du forum

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

Posté 09 novembre 2017 - 05:19

Bon et bien avec la patience de Path, on a trouvé mon problème après de multiples tests, ce serait la carte Arduino Uno qui a un défaut.
D'ou ma perte de données au retour.

 

Encore merci Path pour ta patience ;)


signature_01.png -->

 

Mon Tipeee
 


#33 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 09 novembre 2017 - 06:53

De rien, je vais devoir aller me faire un verre en terrasse pour oublier :)

Nan je plaisante. On a passé 4h sur discord mine de rien. Au passage, je suis content de t'avoir montré comment je fais pour programmer la pi. A distance avec ssh et sftp. On peut aussi passer par serveur git pour transférer les sources de ta machine vers le pi. Mais une autre fois ^^ En tout cas, ton pi pourra embarquer un linux headless, sans écran, ni clavier, ni souris, plus propice à son intégration dans un robot. On a vu aussi qu'on pouvait se passer d'un gros IDE pour faire ces petits programmes tout simples.

Et désolé pour ta uno ...



#34 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 25 novembre 2017 - 08:17

Résultat des courses, la liaison fonctionne entre PI2ou PI3 et arduino nano. Pas avec la mega ni avec le uno.

Il n'y aurait pas un driver à installer sur la pi pour ces 2 arduino ? Ou est-ce que ça demande de passer un convertisseur du genre ftdi ? Ou alors c'est tout simplement un paramétrage de la lib rs232 qui nous échappe.



#35 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 29 novembre 2017 - 07:58

Mon robot est équipé d'un RPI3 et d'un Arduino Mega , la communicaion USB entre eux fonctionne parfaitement sans rien n'ajouter


Pura vida

 

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

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


#36 Oliver17

Oliver17

    Pilier du forum

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

Posté 29 novembre 2017 - 08:02

@Gerardosamara : avec quel langage ??

Là le but est d'utiliser C++ et de ne pas utiliser python.


signature_01.png -->

 

Mon Tipeee
 


#37 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 29 novembre 2017 - 08:19

Mon robot est équipé d'un RPI3 et d'un Arduino Mega , la communicaion USB entre eux fonctionne parfaitement sans rien n'ajouter


Moi aussi :) avec du python et accessoirement du nodeJS.

Ps. Je dis ça pour embêter Oliver, j’ ai pas pu me retenir ^^

#38 gerardosamara

gerardosamara

    Membre passionné

  • Membres
  • PipPipPip
  • 374 messages
  • Gender:Male
  • Location:Costa Rica & Bretagne

Posté 29 novembre 2017 - 08:21

Ma conclusion @Oliver17 est que ce montage ne demande pas de passer par un convertisseur du genre FTDI.

 

Pour le langage coté RPI3 , c'est en Python .  Coté Arduino , j'utilise l'IDE Arduino

Je ne maitrise pas le C++


Pura vida

 

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

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


#39 Oliver17

Oliver17

    Pilier du forum

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

Posté 08 décembre 2017 - 11:09

Plop les Maker's, j'ai enfin réussi (pas seul c'est clair), à faire communiquer Pi - Arduino Mega via TX/RX avec les programmes postés plus haut, en résumer, on ne passe plus par l'usb, trop le bordel, là le but en passant par un Convertisseur de niveau logique 3.3V 5V  et donc en utilisant le TX/RX et en gardant ce code : 

 

Code arduino :

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

void loop() {
  while (Serial.available() > 0) { // if any data available
    char incomingByte = Serial.read(); // read byte
    Serial.write(incomingByte); // send it back
  }
}

Code c sur le raspberry :

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "rs232.h"

int main()
{
  int counter=0, i, n,
      cport_nr=0, //0 = ttyS0
      bdrate=9600; 
  unsigned char buf[4096];
  char str[1024];
  char mode[]={'8','N','1',0};

  if(RS232_OpenComport(cport_nr, bdrate, mode))
  {
    printf("Can not open comport\n");
    return(0);
  }
  printf("Comport opened\n");
  while(1)
  {
    n = RS232_PollComport(cport_nr, buf, 4095);
    if(n > 0)
    {
      buf[n] = 0;   /* always put a "null" at the end of a string! */
      for(i=0; i < n; i++)
      {
        if(buf[i] < 32)  /* replace unreadable control-codes by dots */
        {
          buf[i] = '.';
        }
      }
      printf("received %i bytes: %s\n", n, (char *)buf);
    }
    sprintf(str, "Hello les makers, je fais un test avec beaucoup de caractére :) %d", counter++);
    RS232_cputs(cport_nr, str);
    printf("sent: %s\n", str);
    usleep(1000000);  /* sleep for 100 milliSeconds */
  }
  return(0);
}

Résultat : 

Comport opened
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 0
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 0
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 1
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 1
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 2
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 2
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 3
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 3
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 4
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 4
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 5
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére                      :) 5
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 6
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 6
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 7
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 7
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 8
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 8
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 9
received 66 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 9
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 10
received 67 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 10
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 11
received 67 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 11
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 12
received 67 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 12
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 13
received 67 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 13
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 14
received 67 bytes: Hello les makers, je fais un test avec beaucoup de caractére :) 14
sent: Hello les makers, je fais un test avec beaucoup de caractére :) 15

On peut donc dire que tout est là :)

J'ai donc utilisé le com ttyS0 (serial) dans la console faites : ls -l /dev  vous verrez ainsi si il y a bien 

 

serial0 -> ttyS0  (c'est surtout cette ligne pour le coup qui nous intéresses)

serial1 -> ttyAMA0

 

Par la suite, faites votre petit branchement avec le convertisseur de niveau logique cité plus haut, ou un convertisseur jouant le même rôle, et zou.

 

Mon prochain test, reprendre le programme en C++ que j'avais retranscris du C et voir si cela fonctionne.

 

Je remercie tout de même ceux à qui j'ai bien pris la tête pour m'aider ^^ Path, R1D1, Mike (même si Mike n'a rien foutue lol humour mange donc tes cordons bleu froids :) ) et autres personnes que j'aurais pu zapper (poisson rouge).

 

Merci


signature_01.png -->

 

Mon Tipeee
 


#40 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 504 messages
  • Gender:Male
  • Location:Paris

Posté 08 décembre 2017 - 12:45

GG !! On va enfin changer de sujet sur le discord !! :D
Plus sérieusement, merci d´avoir repporté ici.



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