IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Communication raspberry UART avec arduino


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 128
    Par défaut Communication raspberry UART avec arduino
    Bonjour,

    Je teste la communication entre 1 raspberry et 1 arduino mega 2560.
    Avec ces 2 codes, codes d'exemple j'ai des résultats satisfaisants, démontrant bien que les 2 équipements sont bien cablés.

    voici les codes :
    python pour raspberry:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python3
    import serial
    import time
     
    if __name__ == '__main__':
    	ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
    	ser.reset_input_buffer()
    	while True:
    		ser.write(b"Hello from Raspberry Pi!\n")
    		line = ser.readline().decode('utf-8').rstrip()
    		print(line)
            time.sleep(1)

    pour arduino:

    Code Arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void setup() {
    	Serial.begin(9600);
    	}
     
    void loop() {
    	if (Serial.available() > 0) {
    		String data = Serial.readStringUntil('\n');
    		Serial.print("You sent me: ");
    		Serial.println(data);
    	}
    	}

    Le truc c'est que maintenant je veux transmettre une variable; data = 65000 par exemple, mais je n'y arrive pas, et comme l'arduino à déjà sont usb d'utilisé j'ai pas le moniteur et c'est encore plus difficile d'analyser ce qui se passe.
    Merci pour votre aide.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 191
    Billets dans le blog
    47
    Par défaut
    Salut,

    Synchroniser le Pi (avec Python) et l'Arduino sur une transmission série n'est pas si évident.
    Voir Communication Arduino - Python via le port série

    Et si tu veux utiliser un 2ème port série : comment obtenir un deuxième port série sur Arduino Uno ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 128
    Par défaut Communication Raspberry UART avec Arduino
    Bonjour,

    merci pour les infos, j'ai trouvé l'astuce de renvoyer vers le Raspberry les valeurs reçues par l'Arduino (ça se mort la queue !!), ça semble plutôt marcher.
    J'ai donc gratté un peu sur ma problématique, et avec les codes suivants, j'arrive à envoyer des valeurs en utilisant une variable. Par contre coté Arduino, ça relie mais chiffre par chiffre. Comment puis faire pour reconstruire le nombre initial (porté par la variable) ?

    code Raspberry :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python3
    import serial
    import time
     
    if __name__ == '__main__':
    	ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
    	ser.reset_input_buffer()
    	while True:
                    data = 6500
    		ser.write(str(data).encode('utf-8'))                        # ici on envoie la valeur de la variable data
    		line = ser.readline().decode('utf-8').rstrip()             # ici on affiche les valeurs reçues par l'arduino et renvoyée au raspberry
    		print(line)
            time.sleep(1)

    Code Arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void setup() {
      Serial.begin(9600);
    }
     
    void loop() {
      if (Serial.available() > 0) {
          int data = Serial.read() - '0';
          Serial.println(data);
         }
    }


    Et quand je lance les codes, le résultat (visible sur le Raspberry) est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    6
    5
    0
    0
    6
    5
    0
    0
    6
    5
    0
    0
    ce qui n'est pas déconnant !!

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 128
    Par défaut Communication raspberry UART avec Arduino
    Bon, après relecture de tout ça, je me dis que je suis trop bête... car effectivement coté Raspberry je convertis mon nombre en string, mais coté arduino le code original était déjà prêt pour récupérer du string !!!!!

    Donc je pense que ça devrait aller en mixant les différents postes..

    Sauf si vous pensez qu'il y a des améliorations à faire !!

  5. #5
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonsoir,

    côté python termine ta chaîne par un caractère spécial comme le \n par exemple. Comme l'a fait remarqué f-leb, dans ton code Python, n'oublie pas d'initialiser ton Arduino avec un setDTR et ajoute une tempo pour attendre la fin de l'initialisation de la carte. Le Mega 2560 est un peu plus lent que le UNO pour s'initialiser.

    Côté Arduino utilise la fonction Serial.readBytesUntil
    Code Arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    int BUF_SIZE = 32;
    size_t n;
    char *pch;
    char buf[BUF_SIZE];
    String strData;
    int intData:
     
    //................
     
    if (Serial.available) 
    {
        n = Serial.readBytesUntil('\n', buf, BUF_SIZE);
        if (n > 0)
        {
              pch = strtok(buf, ",");        
              strData = pch;
              intData = strData.toInt(); 
              //......
        }
    }

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2021
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2021
    Messages : 128
    Par défaut raspberry protocole I2C smbus2 communication vers arduino
    Bonjour,

    il y a un truc que je n'arrive pas a m'expliquer.. pour avec le code suivant :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python3
    import serial
    import time
     
    if __name__ == '__main__':
    	ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
    	ser.reset_input_buffer()
    	while True:
                    data = 6500
    		ser.write(str(data).encode('utf-8')+b"\n")                        # ici on envoie la valeur de la variable data
    		line = ser.readline().decode('utf-8').rstrip()             # ici on affiche les valeurs reçues par l'arduino et renvoyée au raspberry
    		print(line)
            time.sleep(1)

    j'arrive à utiliser / piloter correctement l'Arduino mais pas lorsque je simplifie le code en enlevant la ligne de relecture ??

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python3
    import serial
    import time
     
    if __name__ == '__main__':
    	ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
    	while True:
                    data = 6500
    		ser.write(str(data).encode('utf-8')+b"\n")                        # ici on envoie la valeur de la variable data
            time.sleep(1)

    Faut-il ajouter une ligne de fin de transmission ?? ou quelquechose du genre ? Merci pour votre aide.

Discussions similaires

  1. Communication usb entre raspberry pi et arduino
    Par college62137 dans le forum Arduino
    Réponses: 5
    Dernier message: 27/04/2019, 11h28
  2. Aide Ecran Nextion communication avec Arduino Mega2560
    Par Aegnor1975 dans le forum Arduino
    Réponses: 5
    Dernier message: 13/04/2017, 17h14
  3. Réponses: 2
    Dernier message: 19/03/2016, 11h55
  4. Communication avec Arduino
    Par Stéphanie.Gautier dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 23/05/2013, 22h07
  5. Bug communication serie avec arduino (busy)
    Par Invité dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/07/2012, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo