Communication USB entre Arduino UNO et Raspberry Pi


14 mars 2019 • 15 • 4.4

Dans certains projets, nombreuses sont les raisons qui peuvent nous mener à utiliser Raspberry Pi et Arduino ensemble. En effet, chaque carte possède ses avantages et ses inconvénients. Certains modules seront plus faciles à utiliser sur l'Arduino, alors que d'autres fonctions seront plus facilement implémentables sur un Raspberry Pi. Pour tirer l'avantage de chaque carte, le mieux est d'établir une communication entre les deux.

Communication USB entre Arduino et Raspberry Pi

Nous allons donc voir dans ce tutoriel comment mettre en place les 3 types de communication suivants :

Prérequis

Pour faire communiquer les deux cartes, il faut :

Et c'est tout ! Une fois tous les éléments réunis, on peut passer au vif du sujet.

Communication unidirectionnelle de l'Arduino vers le Raspberry Pi

Pour commencer, voyons comment pourrait-on envoyer un message depuis l'Arduino vers le au Raspberry.
Côté Arduino, c'est très simple : il suffit juste de lui demander d'écrire sur la sortie série Serial le message que l'on souhaite transmettre. Le code ci dessous envoie un message toutes les deux secondes de type : Message #i, "i" s'incrémentant à chaque envoie.

Ne branchez pas encore l'Arduino au Raspberry Pi.

Côté Raspberry, rien de bien compliqué non plus. On va écrire un programme en Python qui va utiliser la fonction serial.Serial. Cependant, on va avoir besoin pour utiliser cette fonction, du port utilisé par l'Arduino sur le Raspberry Pi.
Il suffit d'entrer la commande Linux suivante :

  ls /dev/tty*

Vous devriez obtenir une liste à peu près de ce type :

Capture d'écran ls /dev/tty* sans Arduino Branché

Branchez l'Arduino au port USB et entrez à nouveau la commande. Un nouvel élément devrait apparaître dans la liste, et cet élément porte le nom que prend notre Arduino !

Capture d'écran ls /dev/tty* sans Arduino Branché

Dans ce cas, l'Arduino est détecté en tant que /dev/ttyACM0 (sûrement parce que j'utilise un cable d'imprimante).

Regardons maintenant le programme qui sera exécuté sur le Raspberry :

On obtient à l'execution ceci :

Moniteur Série Arduino sur Raspberry Pi Moniteur Série Arduino sur PC

C'est tout pour la communication de l'Arduino vers le Raspberry. Voyons maintenant comment établir une communication Raspberry vers Arduino.

Communication unidirectionnelle du Raspberry Pi vers l'Arduino

Pour cette communication, je vais utiliser un exemple plus concret : Contrôler des LED connectées à l'Arduino à partir du Raspberry.
Commençons par brancher les LEDs à l'Arduino en suivant ce schéma par exemple :

Branchement LED Arduino

Programmons maintenant l'Arduino, qui va recevoir les ordres du Raspberry Pi :

Pour finir, on code l'envoi des ordres par le Raspberry Pi :

LED Arduino commandées par Raspberry

A lire

Branchement caméra - présentation

Accessoires indispensables pour bien démarrer avec le Raspberry Pi 4


Branchement caméra - présentation

Choisir et utiliser une caméra sur un Raspberry Pi






Ce tutoriel vous a plu ?

starstarstarstarstar

4.4/5 | 33 votes




Commentaires

15 commentaires publiés.

Noway, le 25/07/2022 à 13h52
Bonjour, Est-il possible de récupérer en direct, les données lues par les entrées analogiques de l'arduino, afin de les utiliser dans un programme python, sur notre raspberry pi ? En clair, se servir de l'arduino comme un module d'E/S branché en USB.
Pol, le 07/02/2022 à 10h30
Bonjour le Lab.
Une bouteille à la mer puisque tu ne sembles plus répondre.
Dans communication unidirectionnelle (la seule qui m'intéresse) les messages ne sont pas reçus convenablement, ils sont entourés de « b' » et de « \r\n' »
b'Un message va etre envoye toutes les deux secondes des maintenant !\r\n'
b'Message #0\r\n'
b'Message #1\r\n'
b'Message #2\r\n'
b'Message #3\r\n'
b'Message #4\r\n'

Burito, le 15/11/2022 à 16h54
Salut,
J'ai eu le même problème. Il faut juste décoder en UTF-8

# Ecriture de chaque message recu
while True :
msg = serialArduino.readline()
print(msg.decode('utf-8'))
maxibud, le 21/11/2020 à 08h13
Bonjour,
Tout fonctionne, jusqu'au moment où j'ouvre le moniteur série de l'aduino : ça fait planter la réception des info sur le RPi.
Quelqu'un a t'il le même pb ?
FranCastor, le 25/05/2020 à 10h04
Bonjour,
Merci pour le tuto, cependant j'aurais une question. Quelles bibliothèques utiliser pour controler des moteurs en position? Pour être plus clair, en fonction de l'entrée utilisateur, la raspberry compile un chemin et je dois le transmettre à l'arduino qui pilote mes moteurs. Des conseils?
DieuTopGun, le 04/04/2020 à 01h09
Bonjour, je connais pas beaucoup de monde de linux apart pour piloté mon imprimante 3D via octoprint.

Mais j'aimerai savoir le fichier de configuration coté Raspberry Pi est enregistré ou exactement ? Comment le faire executer automatiquement a chaque démarrage ? Ou le faire exécuté simplement aussi.

Merci d'avance pour votre réponse.
LCe, le 08/01/2020 à 19h18
Bonjour,

super, tout marche bien !
J'ai une question concernant le nom du port qui peut-être variable. Y'a t'il une meilleure solution que de parser la commande ls /dev/tty* ?
Mes ports se nomment toujours (à priori) /dev/ttyUSBx
Après, on peut imaginer un check de tous les noms récupérer et d'une réponse de l'Arduino pour signaler sa présence ?!
Une autre idée ?

Merci :)
STMW, le 27/11/2019 à 04h58
Bonjour à tous. Svp est-il possible d'implémenter une camera qui ne fonctionne que sur raspberry pi dans un projet arduino ? Je possède les deux carte et je sais pas comment m'y prendre
Thomasraynal, le 28/09/2019 à 22h19
Bonjour, j'aimerai pouvoir choisir quelle led allumer et en même temps choisir sont PWM, mais la arduino semble ne pas pouvoir faire deux serial.read() different dans le même code ?
jojo93, le 01/07/2019 à 21h02
Bonjour,
La commande "import serial" ne fonctionne pas et je ne trouve pas sur le net la librairie.
Raspberry Lab, le 02/07/2019 à 10h42
Bonjour @jojo93,
C'est peut être un oubli de ma part, pouvez-vous me dire si le code fonctionne après avoir installé la librairie en entrant ceci :

sudo apt-get install python-serial python3-serial


Et après avoir redémarré si nécessaire.

Cordialement,
RaspberryLab.
afterwind, le 19/04/2019 à 19h38
La partie bidirectionnelle a disparu?
Cordialement
whiteblock, le 23/06/2019 à 06h42
Bonjour pour la partie bidirectionnel le procédé est le même sauf que l'on vas utiliser a la fois
sur le PI :
ser.write()
ser.readline()

sur l'arduino :
Serial.println
Serial.read()

et le petit bonus
sur l'arduino :
if (Serial.available())
{
}
Par contre je n’ai pas trouver le même en python
Mat716, le 16/03/2019 à 22h27
bonjour, pour la communication dans le sens Arduino Raspberry je souhaite envoyer à ma carte raspberry plusieurs information différentes
(j'ai comme projet de faire un tableau de bord pour voiture) donc doit-je mettre plusieurs fois la ligne print(serialArduino.readline())

Raspberry Lab, le 17/03/2019 à 09h44
Bonjour Mat176,
pas besoin de mettre plusieurs fois la ligne print(serialArduino.readline()). En effet, elle se trouve dans une boucle infinie, donc va s’exécuter dès qu'un nouveau message est reçu.
D'ailleurs, lors de l’exécution du code sur le Raspberry, on se rend compte que le Raspberry reçoit bien tous les messages envoyés par l'Arduino un par un, et pas seulement le 1er.

Cordialement,
RaspberryLab.


Commenter
Votre adresse mail ne sera pas visible sur le site.

Les commentaires sous soumis à vérification avant publication.