Programmer un Arduino en Python

par Jean Luc Leloire .

Dans cet exemple, l’Arduino est programmé en Python avec l’interface graphique tkinter de façon à afficher la température mesurée sur l’image d’un thermomètre à alcool.

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

  1. # Créé par Leloire, le 07/12/2019 en Python 3.4 dans EduPython
  2.  
  3. '''
  4. Mesure de température avec une CTN sur Arduino
  5. Affichage sur le PC au moyen du protocole Firmata
  6. nécessite de télécharcher le sketch standardFirmata des exemples dans l'arduino
  7. '''
  8.  
  9. import pyfirmata
  10. from tkinter import *
  11. from  math import log as ln
  12.  
  13. #à adapter en fonction de votre pc
  14. #lisible dans le programme Arduino
  15.  
  16. port = 'COM8'            #windows
  17. #port = '/dev/ttyACM0'   #linux
  18.  
  19. #on connecte l'Arduino
  20. board = pyfirmata.Arduino(port)
  21.  
  22. # itérateur permet de ne pas saturer la communication série
  23. it = pyfirmata.util.Iterator(board)
  24. it.start()
  25.  
  26. ''' board.get_pin('type:numéro:mode')
  27. type est  : a(analog) ou d(digital)  
  28. numéro est le numéro de la pin utilisée
  29. mode est i (input), o (output) ou p (pwm)
  30. ici, on règle la pin 0 en mode input analogique
  31. '''
  32. pinA0 = board.get_pin('a:0:i')
  33.  
  34. ''' en input, on lira ensuite les données avec valeur=pinA0.read()
  35.   en sortie, on écrira les données avec pinA0.write(valeur)
  36.   attention, valeur varie entre 0 et 1 en analogique (0% à 100% de 1023)
  37. '''
  38. #variables
  39.  
  40. #la résistance en série avec la ctn
  41. Rserie=4700
  42.  
  43. #coeff de la CTN utilisée : relation de Steinhart-Hart
  44. A=0.000951765780671865
  45. B= 0.00026848598557728916
  46. C= 1.8694170415783278e-07
  47.  
  48. #fonction qui calcule la température
  49. def calc_temp(valeur) :
  50.   Nmes=1023*valeur
  51.   U=Nmes/1024*5
  52.   Resistance = Nmes*Rserie/(1024-Nmes)
  53.   Temp = ln(Resistance); # sauver le log de la résistance mesurée
  54.   Temp = 1 / (A + (B * Temp) + (C * Temp * Temp * Temp))
  55.   Temp = Temp - 273.15;  # Kelvin -> Celsius
  56.   return Temp
  57.  
  58.  
  59. def lance_mesure(label,canv, colonne):
  60.   global basColonne,pos0,echelle
  61.   def mesure():
  62.     #on lit la valeur sur entrée analogique A0
  63.     valeur = pinA0.read()
  64.     #on calcule la température
  65.     temp=calc_temp(valeur)
  66.     # on met à jour l'étiquette (label) qui affiche la température
  67.     label.config(text =  "T ="+str(round(temp,2)) + " °C")
  68.     #on dessine la colonne d'alcool coloré correspondant à la température
  69.     canv.coords(colonne,46,basColonne,49,pos0-echelle*temp)
  70.     # on repète la mesure dans 10 ms
  71.     label.after(10, mesure)
  72.   mesure()
  73.  
  74. # programme principal
  75. fenetre = Tk()
  76. #taille et position initiale de la fenêtre
  77. fenetre.geometry("250x400+500+100")
  78. #titre de la fenêtre
  79. fenetre.title("Thermomètre CTN")
  80. #étiquette pour afficher la température
  81. label1 = Label(fenetre, text = "T= 0.00 °C",font=("Helvetica", 16))
  82. label1.grid(row=0,column=1)
  83. # canevas pour dessiner
  84. canv = Canvas(fenetre, width=96, height=399)
  85. #photo du thermomètre
  86. photo = PhotoImage(file='thermobois.png')
  87. item = canv.create_image(48, 200,image = photo)
  88. # nouvelle colonne d'alcool en fonction de la valeur actuelle
  89. #le 0 correspond au pixel 270
  90. pos0=270
  91. #entre -10°C et 60°C, il y a 231 pixel soit 231/70=3.3 pixel par degré
  92. echelle=3.3
  93. #le bas de la colonne est au pixel 347
  94. basColonne=347
  95. #alcool coloré dans le thermomètre pour la valeur 0°C
  96. colonne=canv.create_rectangle(46,basColonne,49,pos0,outline="#ae0606",fill = '#ae0606')
  97. canv.grid(row=0,column=0,padx=10)
  98. #appel de la fonction qui lance la mesure
  99. lance_mesure(label1,canv, colonne)
  100.  
  101. fenetre.mainloop()

Documents joints