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éniants. 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.
Nous allons donc voir dans ce tutoriel comment mettre en place les 3 types de communication suivants :
- Communication unidirectionnelle Arduino UNO → Raspberry Pi : Cette communication va permettre d'envoyer des données à partir de l'Arduino vers le Raspberry.
- Communication unidirectionnelle Raspberry Pi → Arduino UNO : Exactement la même communication que précédemment mais cette fois, dans le sens Raspberry vers Arduino.
- Communication bidirectionnelle Raspberry Pi ↔ Arduino UNO : Cette communication mélange les deux précédentes et permet d'à la fois envoyer et recevoir des données de l'autre carte sur chaque carte.
I. Prérequis
Pour faire communiquer les deux cartes, il faut :
- Un Raspberry Pi
- Un Arduino
- Un cable USB type B~ 6€
- Un kit cables / Breadboard (facultatif)~ 10€
- Des LEDs (facultatif)Kit complet ~12€
- Des résistances (facultatif)Kit complet ~10€
Et c'est tout ! Une fois tous les éléments réunis, on peut passer au vif du sujet.
II. 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'incémenant à chaque envoie.
int i=0; | |
void setup() { | |
Serial.begin(9600); | |
Serial.println("Un message va etre envoye toutes les deux secondes des maintenant !"); | |
} | |
void loop() { | |
Serial.println("Message #" + String(i)); | |
delay(2000); | |
i++; | |
} |
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 :
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 !
Dans ce cas, l'Arduino est detecté en temps que /dev/ttyACM0 (sûrement parce que j'utilise un cable d'imprimante).
Regardons maintenant le programme qui sera executé sur le Raspberry :
# Import de la librairie serial | |
import serial | |
# Ouverture du port serie avec : | |
# '/dev/ttyXXXX' : definition du port d ecoute (remplacer 'X' par le bon nom) | |
# 9600 : vitesse de communication | |
serialArduino = serial.Serial('/dev/ttyXXXX', 9600) | |
# Ecriture de chaque message recu | |
while True : | |
print(serialArduino.readline()) |
On obtient à l'execution ceci :
C'est tout pour la communication de l'Arduino vers le Raspberry. Voyons maintenant comment établir une communication Raspberry vers Arduino.
III. 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:
Programmons maintenant l'Arduino, qui va recevoir les ordres du Raspberry Pi :
#define Rouge A0 | |
#define Vert A1 | |
#define Bleu A2 | |
int message = 0; | |
int couleurs[] = {Rouge, Vert, Bleu}; | |
void setup() { | |
Serial.begin(9600); | |
pinMode(Rouge, OUTPUT); | |
pinMode(Vert, OUTPUT); | |
pinMode(Bleu, OUTPUT); | |
} | |
void loop() { | |
if (Serial.available()) { | |
message = Serial.read() - '0'; | |
if (message > 3) { | |
digitalWrite(couleurs[message-4], LOW); | |
} | |
else { | |
digitalWrite(couleurs[message-1], HIGH); | |
} | |
} | |
} |
Pour finir, on code l'envoi des ordres par le Raspberry Pi :
import serial | |
ser = serial.Serial('/dev/ttyXXXX', 9600) | |
print("CTRL + C pour arrêter") | |
while True : | |
led = int(input('Quelle LED souhaitez-vous allumer / eteindre ? (Rouge=1 / Vert=2 / Bleu=3)')) | |
action = input("Souhaitez-vous allumer ou Eteindre la LED ? (Allumer=1 / Eteindre=0)") | |
if (action == 1) : | |
ser.write(str(led)) | |
else : | |
msg = led+3 | |
ser.write(str(msg)) |
IV. Communication bidirectionnelle entre Arduino et Raspberry Pi
Source : http://espace-raspberry-francais.fr/Tutoriels-Arduino/Communication-serie-entre-Raspberry-Pi-et-Arduino-Uno/