Commande d'un actionneur par une IHM
L'objectif de cet exercice est de réaliser une IHM simple permettant d'envoyer un code de trois chiffres xyv à la carte pour qu'elle d'affiche (actionneur) la diode de coordonnées (x,y) avec l'intensité v.
Les systèmes embarqués sont de nos jours souvent connectés à un réseau local ou à l'Internet ce qui permet de communiquer avec eux à travers des IHM déportées sur le Web ou un smartphone. On va écrire deux programmes Python : un programme pour l'IHM s'exécutant uniquement sur l'ordinateur et un autre pour le système informatique embarqué qui sera transféré sur la carte.
Réalisation du système embarqué
Attention :
Dans cette partie, on utilise Mu en mode micro:bit.
Ouvrir le logiciel Mu en mode micro:bit, saisir le programme ci-dessous dans l'éditeur avant de l'enregistrer dans un dossier pertinent sous le nom actionneur_mb.py puis de le transférer sur la carte.
from microbit import *
#initialisation de la vitesse de transmission en bauds
uart.init(baudrate=9600)
while True:
#s'il y a un message dans la file de réception
if uart.any():
#lecture du message qui est en bytes
msg_bytes=uart.read()
#conversion en chaîne de caractères en précisant l'encodage
msg = str(msg_bytes, "utf-8")
#conversion en entier du premier caractère du message (x)
x = int(msg[0])
#conversion en entier du second caractère du message (y)
y = int(msg[1])
#conversion en entier du troisième caractère du message (v)
v = int(msg[2])
display.set_pixel(x, y, v)
sleep(1000)
display.clear()
Méthode :
Lemodule uart permet de communiquer avec l'ordinateur connecté sur le port série USB.
uart.init(baudrate=9600) est nécessaire pour fixer la vitesse de transmission en bauds.
Pour lire un message sur l'entrée série, on vérifie s'il reste des messages à lire dans la file d'attente avec uart.any() puis on lit toute la file de messages avec uart.read() ou le message de tête jusqu'au prochain saut de ligne avec uart.readline(). On peut effacer les caractères invisibles de saut de ligne avec uart.readline().strip().
Un message reçu msg_bytes est un flux d'octets, de type bytes en Python, avant de le traiter, il faut le convertir en chaîne de caractères avec str(msg_bytes, 'utf-8').
Pour transmettre un message msg de type chaîne de caractères, on le convertit en bytes avec msg_bytes = bytes(msg, 'utf-8') puis on l'écrit sur la sortie série avec print(msg_bytes).
Réalisation de l'IHM
Attention :
Dans cette partie, on utilise Mu en mode Python.
Saisir le programme ci-dessous dans l'éditeur avant de l'enregistrer dans un dossier pertinent sous le nom actionneur_python.py.
from serial import *
from tkinter import *
#port série à découvrir en ligne de commande avec mode
port = "COM3"
serie = Serial(port)
#même vitesse de transmission que sur la carte
serie.baudrate = 9600
def envoie_message():
"""Fonction d'envoi"""
msg = texte_message.get()
message_bytes = bytes(msg, "utf-8")
serie.write(message_bytes)
# Fenêtre principale
ma_fenetre = Tk()
ma_fenetre.title("IHM")
# Création d'un bouton pour envoyer un message
button_message = Button(ma_fenetre, text ="Envoyer", command = envoie_message)
#positionnement du bouton
button_message.pack()
# Création d'un champ de saisie d'un message
texte_message = StringVar()
champ_message = Entry(ma_fenetre, textvariable= texte_message, bg ="bisque", fg="maroon", width="20")
#on donne le focus au champ de saisie
champ_message.focus_set()
#positionnement du champ
champ_message.pack()
#boucle de capture d'événements
ma_fenetre.mainloop()
Exploitation
Exécuter le programme en cliquant sur l'icône , une fenêtre graphique comme ci-dessous s'affiche.
Écrire "115" dans le champ de saisie puis cliquer sur le bouton envoyer, le pixel de coordonnées (1,1) devrait s'allumer avec une intensité moyenne.
Pour arrêter l'IHM, fermer la fenêtre graphique puis cliquer sur dans la barre de menu de Mu.
Explications
Revenons sur le code de l'IHM.
La réalisation de l'interface graphique est commentée dans le code, elle s'appuie sur le module tkinter qu'on charge avec from tkinter import *.
La communication série avec la carte micro:bit s'appuie sur le module serial qu'on charge avec
from serial import *.
Méthode : Communication série côté ordinateur
Le module serial permet de communiquer avec une carte connectée sur le port série USB.
serie = Serial(port) permet d'ouvrir une connexion série sur le port de l'ordinateur où la carte est connectée. Sous Windows ce port peut être découvert avec la commande mode depuis la console lancée avec cmd dans la barre de recherche. Si l'accès n'est pas autorisé, il suffit de tester les différentes possibilités : "COM3", "COM4" ou "COM5".
On commence par fixer la vitesse de transmission serie.baudrate à la même valeur que celle choisie sur la carte.
Comme sur la carte les messages transmis par communication série sont nécessairement en bytes, ce qui nécessite une conversion entre chaîne de caractères de type str et bytes avant transmission ou après réception.
On lit un message en bytes sur l'entrée série, avec serie.read() ou serie.readline() si on veut s'arrêter au prochain saut de ligne.
On écrit un message en bytes sur l'entrée série, avec serie.write(msg_bytes)
Pour aller plus loin
Modifier le programme pour que la carte allume pendant une seconde :
la diagonale de diodes de coordonnées (x, x) avec 0 6 x 6 4 si on transmet le message "a" par l'IHM ;
l'autre diagonale de diodes si on transmet le message "b" par l'IHM ;
une croix formée des deux diagonales si on transmet le message "c" par l'IHM.