Réception de données par Python

 

 

La réception des données envoyées depuis l’Arduino est effectuée à l’aide la fonction readline()” :

Donnees = str(SerialPort.readline())

Cette instruction permet de lire les données du tampon série, de les convertir en chaine de caractères, à l’aide de la fonction str()” et de stocker la chaine dans la variable ”Donnees”.

La fonction readline()” ne fonctionne que si un délai d’attente pour la réception des données a été déclaré (timeout de l’objet port série”).

 

. Programme pour la réception d’une chaine de caractères

Reprenons le programme (nommé ”AnalogRead.ino”) à téléverser dans la mémoire de l’Arduino qui affiche, dans le moniteur série, la valeur de l’entrée analogique A0 avec le circuit support des exemples.


En remplacement du moniteur série, voici le programme python (nommé ”ReadLine.py) permettant de lire les données envoyées sur le port série et de les afficher dans la console Python :

 


Déroulement du programme
 :

Importation des modules :

Le module ”ConnectToArduino.py”, contenant les fonctions de connexion à l’arduino via le port série, est importé.

L’importation de ce module importe également les bibliothèques :

. serial (pour la connexion au port série de l’Arduino)

. serial.tools.list_ports (pour déteminer les ports coms disponibles)

. sys (pour mettre fin au programme en cas de problème de connexion au port série)

Déclaration des constantes et variables :

. donnees = ” (variable pour stocker les données qui transitent par le port série)

Connexion à l’Arduino :

. Appel de la fonction du module ”ConnectToArduino.py” de sélection du port COM :

PortComArduino = SelectPortCOM()

Le nombre de port COM disponible est alors déterminé :

PortsCOM = list(serial.tools.list_ports.comports()

–> si nombre de port COM = 0 : message d’erreur et le programme est arrêté,

–> si nombre de port COM = 1 : sélection de ce port COM pour la connexion,

–> si nombre de port COM > 1 : L’utilisateur doit sélectionner le bon port COM.

. Tentative d’ouverture du port COM sélectionné avec la fonction ”OpenPortCom” du module ”ConnectToArduino.py”:

SerialPort = OpenPortCom(PortComArduino)

–> message d’erreur et le programme est arrêté si l’ouverture du port com sélectionné a échoué.

 

– Boucle principale du programme (boucle while True”) :

. Lecture des données du tampon de la liaison série si la connexion à l’Arduino est réussie

donnees=str(SerialPort.readline())

. Affichage des données dans la console Python :

print(donnees)

. Fin du programme en appuyant sur Ctrl-C

Et le résultat dans la console python :

Remarques :

– Dans la console Python, les données converties en chaine de caractères sont affichées entre des balises : b’ ‘ et le caractère « retour à la ligne » (« rn ») est également affiché.

– Quand le délai d’attente de réception des données (« timeout« ) est écoulé, une balise vide (b’ ‘) est affichée.

– Pour supprimer les balises vides et n’afficher que les données envoyées par l’Arduino, il suffit de faire un traitement sur la chaine de caractères :

–> modification du programme ”ReadLinepy” (nouveau programme ”ReadLine2.py) :

Ainsi les 2 premiers caractères et les 5 derniers ne sont pas affichés :

 

. Programme pour la conversion d’une chaine de caractères en nombre

Pour pouvoir exploiter, par un programme Python, les données envoyées par l’Arduino, dans la plupart des cas, il va falloir convertir la chaine de caractères reçues en nombre entier ou flottant.

Pour cela, nous allons utiliser la fonction split()” qui permet de couper une chaine de caractères en une liste contenant les éléments de la chaine. Il est possible de spécifier le type de séparateur et le nombre de coupes à effectuer :

Liststring = string.split(separateur, maxsplit)

Par défaut, le séparateur est l’espace entre les caractères et maxsplit = -1 (toutes les coupes possibles sont effectuées).

Quand le nombre de coupes est spécifié, le nombre d’éléments dans la liste est égale au nombre de coupes plus un élément.

Dans l’exemple de programme précédant, la partie intéressante de la chaine de caractère est la valeur de l’entrée analogique. Pour isoler cette valeur, nous allons couper la chaine en 2 éléments avec comme séparateur : ” grâce à l’instruction suivante :

Listdonnees = donnees.split(”:”,1)

Et convertir, en nombre entier, l’élément de la chaine correspondant à la valeur de A0 :

ValAO = int(Listdonnees[1])

Le premier élément de la liste Listdonnees” étant : Listdonnees[0] = ”Valeur A0”

La boucle principale du programme (programme ReadLine3.py) est alors :

Ce qui donne dans la console Python :


Les valeurs de A0 ont été isolées et converties en entier. Elles peuvent être maintenant stockées dans un tableau ou une liste pour effectuer ultérieurement des calculs. 

Après avoir déclaré, une liste ListValA0= [ ]”, Il suffit de remplacer le print(ValA0)” par :

ListValA0.append(ValA0)       #ajout de ValA0 à la liste ”ListValA0”

Print (ListValA0)                     #pour contrôler l’ajout

(Voir programme ”ReadLine4.py”) 

Toutes les valeurs de A0 sont alors stockées dans une liste :