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 :

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 :

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 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 :

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.

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:

Branchement LED Arduino

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);
  }
  }
  }
view rawledCommArduino.ino hosted with ❤ by GitHub

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))
view rawlecCommRasp.py hosted with ❤ by GitHub

LED Arduino commandées par Raspberry

IV. Communication bidirectionnelle entre Arduino et Raspberry Pi

 

Source : http://espace-raspberry-francais.fr/Tutoriels-Arduino/Communication-serie-entre-Raspberry-Pi-et-Arduino-Uno/

En poursuivant votre navigation sur mon site, vous acceptez l’utilisation des Cookies et autres traceurs  pour réaliser des statistiques de visites et enregistrer sur votre machine vos activités pédagogiques. En savoir plus.