Durant cette séance, nous sommes retournés dans la programmation en langage Python. Nous avons utilisé
des PC portables, car c'est beaucoup plus simple à mettre en place, il n'y a pas besoin d'utiliser
un clavier, une souris et un écran supplémentaires. La programmation prévue permet de faire dialoguer
un Arduino et un PC (ou un Raspberry PI) entre eux avec la liaison série (câble USB entre le PC/Raspberry PI
et l'Arduino).
Il y a plusieurs bibliothèques de fonctions (appelées "Modules") qui sont disponibles en langage Python,
c'est-à-dire qu'elles sont incluses dans le langage lors de son installation sur le PC ou Raspberry PI.
Ces modules permettent d'accéder facilement à plusieurs fonctionnalités : sur les maths, sur les fichiers,
sur les outils réseau, etc.
Les modules sont dits "standards" car il n'est pas nécessaire de les installer. Il est aussi possible
d'installer d'autres modules selon ses besoins pour obtenir des fonctionnalités plus avancées : calculs
scientifiques, interfaces graphiques, etc.
Pour avoir un aperçu des modules dits "standards" disponibles dans Python, vous pouvez aller voir
ce lien, il y en a beaucoup.
Dans notre cas, nous allons utiliser le module serial, ce module permet de communiquer
avec les liens séries. Ce module n'est pas directement disponible dans les modules standards de Python.
Il est cependant installé par défaut, lorsque l'on utilise un Raspberry PI : pas besoin de l'installer.
Pour installer un module Python supplémentaire, il existe un outil qui s'utilise en ligne de commande :
PIP. La syntaxe reste assez simple, par exemple, pour installer le module "serial",
il faut taper la ligne de commande suivante : pip3 install serial. L'outil va
chercher (à condition d'être connecté à Internet) la dernière version du module et l'installe sur la
machine.
La documentation du module "serial" est disponible sur ce lien, la documentation est exhaustive et inclut toutes les fonctionnalités du module ainsi que des exemples d'utilisation.
Coté Arduino, nous n'avons pas de nouvelle bibliothèque à installer pour la communication série.
Au final, nous avons 2 programmes :
Le programme en langage Python est le suivant :
# Programme qui permet selon ce qui est envoyé sur la liaison série : # - d'allumer la LED (PIN 13) Arduino quand il envoie la commande "ON", # - d'éteindre la LED (PIN 13) Arduino quand il envoie la commande "OFF". # Chargement du module "serial" (communication avec le port série) import serial # Ouverture du port série pour la communication : # - "/dev/ttyUSB0" : Port de communication utilisé sous Linux, ce serait plutôt "COM1" ou "COM2" ou ... sous Windows # - 9600 : Vitesse de communication avec la carte Arduino # - D'autres paramètres sont possibles pour cette fonction, ils permettent de régler précisément le protocole physique de # la communication : nb. bits données, nb. bibt stop, etc. Dans notre cas, comme ils ne sont pas réglés, ils sont à leur # valeur par défaut. port_serie = serial.Serial("/dev/ttyUSB0", 9600) # Envoie la commande "ON" : on termine la commande envoyée par "\n" (nouvelle ligne) port_serie.write("ON\n") # Attend un peu : 2 secondes time.sleep(2.0) # Envoie la commande "OFF" : on termine la commande envoyée par "\n" (nouvelle ligne) port_serie.write("OFF\n") # Ferme le port série de communication port_serie.close()
Le programme sur Arduino est le suivant :
// Programme qui permet selon ce qui arrive sur la liaison série : // - d'allumer la LED (PIN 13) quand il reçoit la commande "ON", // - d'éteindre la LED (PIN 13) quand il reçoit la commande "OFF". // Fonction d'initialisation void setup() { // Ouverture de la liaison série Serial.begin(9600); // LED (PIN 13) utilisée en sortie pinMode(13, OUTPUT); // On éteint la LED digitalWrite(13, LOW); } // Fonction qui est exécutée en boucle void loop() { // On lit la commande reçue sur la liaison série // On réceptionne une chaine de caractères jusqu'à ce que le caractère "\n" soit trouvé String cmd = Serial.readStringUntil(13); // On nettoie la chaine de caractères : on retire les espaces et le caractère "\n" reçu cmd.trim(); // On met en majuscule la chaine de caractères cmd.toUpperCase(); // Si la chaine de caractères commence par "ON" if (cmd.startsWith("ON")) { // On allume la LED digitalWrite(13, HIGH); } // Si la chaine de caractères commence par "OFF" else if (cmd.startsWith("OFF")) { // On éteint la LED digitalWrite(13, LOW); } // Attente de 100 ms avant de traiter la prochaine commande delay(100); }
Alors quand tout est programmé des deux cotés, tout doit dialoguer !
Nous avons aussi évoquer les manières de construire un protocole de communication qui utilise les chaines de caractères, nous reviendrons plus en détails prochainement, il est possible qu'un document (page web) soit créé pour cela.