Accueil > ARDUINO > Arduino & Python : tracer des courbes avec Matplotlib
vendredi 13 novembre 2015, par
Le but de cet article est de réaliser un programme en python qui permette de tracer un signal (tension) dont l’acquisition se fait au niveau de la carte Arduino. On a donc une chaîne d’acquisition de la forme suivante :
SIGNAL -> CONVERTISSEUR ADC (CAN) _ CARTE ARDUINO -> PC ( programme python avec matplotlib)
Il ouvre la liaison série et transmet toute les secondes la valeur mesurée sur l’entrée analogique A0.
void setup() { Serial.begin(9600); while (!Serial){ ; // attend la liaison serie - pour les cartes LEONARDO } } void loop() { int valeur_capteur = analogRead(A0); Serial.println(valeur_capteur); delay(1000); // pause de 1s }
La bibliothèque matlibplot permet de tracer des courbes.
Pour l’installation, voir ce lien http://matplotlib.org/users/installing.html
Cette bibliothèque permet de tracer des courbes à partir d’une liste pour les abscisses et d’une autre pour les ordonnées.
Exemple :
import matplotlib.pyplot as plt listex=[1,2,3,4] # liste des coordonnees sur l'axe des abscisses listey=[1,4,9,50] # liste des coordonnees sur l'axe des ordonnees plt.plot(listex,listey) # trace la courbe plt.xlabel('Abscisses') # nomme l'axe des Abscisses plt.ylabel('Ordonnees') # nomme l'axe des ordonnees plt.show() # affiche la courbe
Ainsi, on voit s’afficher la courbe suivante :
Remarque : On peut modifier l’apparence avec plt.style.use(’ggplot’) (doc), faire apparaître les points ...
On peut être amené dans un programme à afficher les points au fur et à mesure qu’ils arrivent. Pour cela, on va utiliser le "mode interactif". C’est ce que l’on va voir maintenant.
La carte Arduino fournit des valeurs toute les secondes que l’on veut tracer sur une courbe en fonction du temps .
Le programme qui va permettre de tracer 100 points est le suivant :
import serial import matplotlib.pyplot as plt import time valeurs=[] temps=[] serie=serial.Serial('/dev/ttyACM0',9600) # ouvre une liaison serie en 9600bps # adapter /dev/ttyACM0 au systeme et port serie plt.style.use('bmh') plt.ylabel("valeur") plt.xlabel("temps en s") plt.ion() # on entre en mode interactif start=time.time() # mesure de l'instant initial i=0 while (i<100): mesure= float(serie.readline()) # lit la donnee sur la laison serie valeurs.append(mesure) # ajout de mesure a la liste des valeurs instant=time.time()-start # calcul du temps ecoule depuis l'instant initial temps.append(instant) # ajout de instant a la liste des temps print mesure,instant # affiche dans la console les coordonnees du point plt.plot(temps,valeurs,marker='o') # trace la courbe plt.draw() # affiche la courbe en mode interactif i=i+1 plt.ioff() # on quitte le mode interactif pour rendre la main a l'utilisateur sur la courbe plt.show() # afficher la courbe
On obtient une courbe comme celle ci :