Programmer un Arduino en Python - Physique-Chimie

Programmer un Arduino en Python

, par Animatrice du Site Disciplinaire

Pour l’étude théorique voir l’article : Les microcontrôleurs dans les programmes du lycée

Résultats

Montage

Tutoriel

Première étape : installer firmata sur l’arduino

Il faut téléverser le sketch firmata dans l’arduino à partir des exemples.

Remarquez dans le cercle rouge en bas à droite de l’image que la carte Arduino est relié au port "COM8".
Cela peut varier suivant l’ordinateur utilisé.

Deuxième étape : installer la librairie pyFirmata dans python
Il faut installer la librairie pyFirmata dans votre environnement python.
Pour les novices, le plus simple est d’installer sur sa machine EduPython
Ensuite, à partir du menu Outils Outils Installation d’un nouveau module...

Une fenêtre de commande apparaît : Tapez 2 pour utiliser pip
Puis le nom du module : pyFirmata

EduPython téléchargera et installera le module.

Dans Edupython, il faut entrer ce programme et l’exécuter.
Il faut bien sûr laisser la carte arduino connectée au PC

Le programme python pour réaliser le thermomètre

 
# Créé par Leloire, le 07/12/2019 en Python 3.4 dans EduPython 
 
''' 
Mesure de température avec une CTN sur Arduino 
Affichage sur le PC au moyen du protocole Firmata 
nécessite de télécharcher le sketch standardFirmata des exemples dans l'arduino 
''' 
 
import pyfirmata 
from tkinter import * 
from math import log as ln 
 
#à adapter en fonction de votre pc 
#lisible dans le programme Arduino 
 
port = 'COM8' #windows 
#port = '/dev/ttyACM0' #linux 
 
#on connecte l'Arduino 
board = pyfirmata.Arduino(port) 
 
# itérateur permet de ne pas saturer la communication série 
it = pyfirmata.util.Iterator(board) 
it.start() 
 
''' board.get_pin('type:numéro:mode') 
 type est : a(analog) ou d(digital) 
 numéro est le numéro de la pin utilisée 
 mode est i (input), o (output) ou p (pwm) 
 ici, on règle la pin 0 en mode input analogique 
''' 
pinA0 = board.get_pin('a:0:i') 
 
''' en input, on lira ensuite les données avec valeur=pinA0.read() 
 en sortie, on écrira les données avec pinA0.write(valeur) 
 attention, valeur varie entre 0 et 1 en analogique (0% à 100% de 1023) 
''' 
#variables 
 
#la résistance en série avec la ctn 
Rserie=4700 
 
#coeff de la CTN utilisée : relation de Steinhart-Hart 
A=0.000951765780671865 
B= 0.00026848598557728916 
C= 1.8694170415783278e-07 
 
#fonction qui calcule la température 
def calc_temp(valeur) : 
 Nmes=1023*valeur 
 U=Nmes/1024*5 
 Resistance = Nmes*Rserie/(1024-Nmes) 
 Temp = ln(Resistance); # sauver le log de la résistance mesurée 
 Temp = 1 / (A + (B * Temp) + (C * Temp * Temp * Temp)) 
 Temp = Temp - 273.15; # Kelvin -> Celsius 
 return Temp 
 
 
def lance_mesure(label,canv, colonne): 
 global basColonne,pos0,echelle 
 def mesure(): 
 #on lit la valeur sur entrée analogique A0 
 valeur = pinA0.read() 
 #on calcule la température 
 temp=calc_temp(valeur) 
 # on met à jour l'étiquette (label) qui affiche la température 
 label.config(text = "T ="+str(round(temp,2)) + " °C") 
 #on dessine la colonne d'alcool coloré correspondant à la température 
 canv.coords(colonne,46,basColonne,49,pos0-echelle*temp) 
 # on repète la mesure dans 10 ms 
 label.after(10, mesure) 
 mesure() 
 
# programme principal 
fenetre = Tk() 
#taille et position initiale de la fenêtre 
fenetre.geometry("250x400+500+100") 
#titre de la fenêtre 
fenetre.title("Thermomètre CTN") 
#étiquette pour afficher la température 
label1 = Label(fenetre, text = "T= 0.00 °C",font=("Helvetica", 16)) 
label1.grid(row=0,column=1) 
# canevas pour dessiner 
canv = Canvas(fenetre, width=96, height=399) 
#photo du thermomètre 
photo = PhotoImage(file='thermobois.png') 
item = canv.create_image(48, 200,image = photo) 
# nouvelle colonne d'alcool en fonction de la valeur actuelle 
#le 0 correspond au pixel 270 
pos0=270 
#entre -10°C et 60°C, il y a 231 pixel soit 231/70=3.3 pixel par degré 
echelle=3.3 
#le bas de la colonne est au pixel 347 
basColonne=347 
#alcool coloré dans le thermomètre pour la valeur 0°C 
colonne=canv.create_rectangle(46,basColonne,49,pos0,outline="#ae0606",fill = '#ae0606') 
canv.grid(row=0,column=0,padx=10) 
#appel de la fonction qui lance la mesure 
lance_mesure(label1,canv, colonne) 
 
fenetre.mainloop() 

Article proposé par : Jean-Luc Leloire

Documents joints