Séance [Avancé] - 15/10/2022

Séances sur le langage Python N°2 et N°3

Informations :

  • Orateurs : Simon
  • Animateurs : 1
  • Nombre de participants : 5

Compte-rendu :

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 :

  • Un programme sous Python qui va envoyer des données sur le port série.
  • Un programme sur Arduino qui va traiter les données reçues depuis le port série.

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.

Prochaines séances :

  • 22/10/2022 (10H00..12H00) : [Avancé] Introduction à l'électronique.
  • 22/10/2022 (18H00..20H00) : [Open Hours] On discute, on explique, on répare !
  • 29/10/2022 (10H00..12H00) : [Avancé] Langage Python - On va jouer !
  • 29/10/2022 (18H00..20H00) : [Open Hours] On discute, on explique, on répare !