voyons ici quelques bases pour la communication serie bidirectionnele entre un Raspberry PI et un arduino UNO .
ce sujet est abordé brièvement ici mais uniquement sur l’aspect communication unidirectionnelle de l’arduino vers le raspberry Pi pour la réception de données et l’enregistrement sur le raspberry PI . nous allons essayer, ici, de le compléter avec quelques exemples centrés sur la communication bidirectionnelle dans le but d’instaurer des échanges type action/réaction entre les deux , cela a un interet par exemple pour les dialogue RPI <=> station meteo Arduino, pour les interaction electromecaniques ( arduino pilote des actionneurs et RPI envoi les commandes et sert d’interface homme machine pour gerer les menus et interactions ecran/claviers/souris/etc..)

EXEMPLE 1:
le premier exemple sera très simple, le RPI envoie un message a l’Arduino qui lui réponds, pour cela installer les 2 programmes ci dessous respectivement sur votre ARDUINO et votre Raspberry PI :
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()>0) {
String data=Serial.readStringUntil('\n');
Serial.print("message reçu: ");
Serial.println(data);
}
}
import serial
import time
ser=serial.Serial(port='/dev/ttyACM0',baudrate=9600, timeout=0.2)
while True:
ser.write(b"Coucou du RPI4\n")
line=ser.readline().decode('utf-8').rstrip()
print(line)
time.sleep(1)
le programme C++ arduino , « ecoute » les données qui arrive sur le port série et renvoi sur celui ci le message « message reçu: » avec derriere le message reçu du RPI.
le programme Python du RPI , envoi sur le port USB le message « Coucou du RPI4 » avec un retour chariot (\n) puis met dans la variable « line » ce qu’il lit en retour de l’arduino puis l’imprime (print(line) et attends 1 seconde avant de recommencer. voici ci dessous petite copie d’ecran des 2 programmes ouverts sur le RPI4 avec le résultat du lancement du pgme python qui s’affiche dans la fenêtre shell de thonny python.

EXEMPLE 2:
a partir du meme programme arduino que plus haut , a titre didactique, nous allons reprendre les bases du deuxième exemple de la rubrique « evenement CLAVIER SOURIS » pour batir un programme qui envoi a l’arduino des valeurs de mouvements x et Y sous forme de chaine de caractères et lit en retour le message renvoyé par l’arduino (à savoir la commande envoyée qui est retournée par l’arduino)
import tkinter as tk
root=tk.Tk()
root.geometry("500x500+450+100")
canvas1=tk.Canvas(root, width=500, heigh=500)
canvas1.pack()
command='M00'
def keypressed(k):
x=0
y=0
global command
if k.keysym=='Up':
y=-1
if k.keysym=='Down':
y=1
if k.keysym=='Left':
x=-1
if k.keysym=='Right':
x=1
command='M'+str(x)+str(y)
ser.write(command.encode('utf-8'))
line=ser.readline().decode('utf-8').rstrip()
print(line)
root.bind('<KeyPress>', keypressed)
root.mainloop()
la commande envoyée est de la forme Mxy avec x et y des valeurs de déplacements valant +1 ou -1 sous forme de caractères . il est asses facile ensuite de demander au programme Arduino de décoder ces 2 valeurs et les transformer par exemple en valeur Step pour commander un moteur pas a pas branché sur l’Arduino. même principe pour commander la rotation d’un moteur . on pourrait également demander a l’Arduino de retourner une valeur de fin de course ou de capteur sous forme de chaine type Cab (C pour capteur et a/b pour les valeurs a prendre en compte). avec ce type de principe il est donc facile de mettre en place un protocole de communication aller/retour et traiter chaque information de chaque coté en fonction du code de commande associé a la première lettre …

