Introduction

Pour contrôler de l’Arduino avec Python, il existe une libraire appelée pyFirmata. Celle-ci fait la liaison entre votre éditeur Python et la carte Arduino, elle vous permet de diriger n’importe quel pin de votre carte Arduino en fonction de votre projet.

Il existe d’autres librairies que Pyfirmata sur Python pour faire cette liaison avec Arduino. Néanmoins Pyfirmata est l’une des plus simple d’utilisation.

Comment installé la librairie pyfirmata ?

Pour installer la bibliothèque il faut taper la commande suivante dans la console Python : !pip install pyfirmata

Vous avez sur la droite une idée de ce que vous obtiendrez une fois la librairie installée.

Pour ce tutoriel, nous utilisons Anaconda, un interpréteur de commande pour Python.

L’étape suivante pour faire fonctionner pyFirmata est d’aller sur Arduino ide et de téléverser un des programmes Firmata que l’on peut trouver dans les exemples. Cela permet d’initialiser la connexion entre Arduino et Firmata : nous avons téléversé StandardFirmata pour la suite de ce tutoriel.

Faire clignoter la micro-led

Voici un programme pour tester chez vous.

Ce petit code rapide permet de vérifier (avec seulement une carte Arduino) que tout est opérationnel. Il consiste à faire clignoter 10 fois la LED se trouvant sur la carte et qui est reliée à la sortie digitale 13.

Remarque : Lorsque vous ferez le test, vous verrez que la led Rx clignote aussi, celle-ci permet de montrer qu’il y a une interaction entre la carte arduino et le programme Python quand le programme est lancé.

carte arduino micro led
import pyfirmata # Importer pyFirmata
import time # Importer le temps

port = 'COM3'# Windows
#port = '/dev/ttyACM3' # Linux
#port = '/dev/tty.usbmodem11401'# Mac

HIGH = True# Crée un état haut qui correspond à la led allumée
LOW = False # Crée un état bas qui correspond à la led éteinte
board = pyfirmata.Arduino(port) # Initialise la communication avec la carte
LED_pin = board.get_pin('d:13:o') # Initialise la broche (d => digital, 13 => N° broche, o => output)

for i in range(10): # Permet de faire clignoter la micro-led dix fois
LED_pin.write(HIGH) # Allume la led
time.sleep(0.5) # Pause de 0.5 seconde
LED_pin.write(LOW) # Eteint la led
time.sleep(0.5) #
Nouvelle pause de 0.5 seconde

board.exit() # Clôture la communication avec la carte

Remarque : On peut faire marcher le programme à l’infini en remplaçant la boucle for par « while True ».

Comment trouver sur quel port est branché l'Arduino ?

  • Sur Windows

Méthode 1 : On peut trouver le numéro du port dans le gestionnaire de périphériques.

arduino uno COM3

Méthode 2 : On peut aussi le trouver depuis le bouton outil sur Arduino IDE.

  • Sur Linux, le numéro s’obtient grâce à la commande : ls-l /dev/ttyACM* dans le terminal de commande.
  • Sur Mac le numéro s’obtient grâce à la commande : ls -l/dev/tty.usb* dans le terminal de commande.

Si vous avez des problèmes pour trouver votre port, on vous conseille notre cours dessus.

Faire clignoter la led

Il suffit de reprendre le code précédent en remplaçant la sortie 13 de la micro-led par la broche sur laquelle vous avez branché votre led.

import pyfirmata # Importer pyFirmata
import time # Importer le temps

port = 'COM4'# Windows
#port = '/dev/ttyACM3' # Linux
#port = '/dev/tty.usbmodem11401' # Mac

HIGH = True# Crée un état haut qui correspond à la Led allumé
LOW = False # Pareil pour l’état bas

board = pyfirmata.Arduino(port) # Initialise la communication avec la carte
LED_pin = board.get_pin('d:8:o') # Initialise la broche (d => digital, 8 => N° broche, o => output)

for i in range(10): # Permet de faire clignoter la micro-led dix fois
LED_pin.write(HIGH)# Allume la led
time.sleep(2) # Pause de 2 secondes
LED_pin.write(LOW) # Eteint la led
time.sleep(2) # Nouvelle pause de 2 secondes

board.exit() # Clôture la communication avec la carte

Voici un schéma du câblage de la led.

On utilise une résistance de 220 Ohms.

led branchement arduino

Le capteur de température

Le capteur de température est un dispositif permettant de mesurer une grandeur physique (température) et de la restituer sous forme de signal en la transformant en tension. Il est composé de trois broches : une d’alimentation, une de GND et enfin une broche OUT.

Pour ce programme, nous allons afficher les valeurs des températures dans la console Python grâce à ce capteur :

import pyfirmata
import time

port = 'COM3' # Windows (à adapter par rapport à votre ordinateur)
board = pyfirmata.Arduino(port) # Permet d’ouvrir le port associer

temperature_pin = board.get_pin('a:0:i') # Permet d’initialiser la broche utilisée
iterator = pyfirmata.util.Iterator(board) # Permet d’initialiser la liaison entre Python et Arduino
iterator.start() # Démarrage de la connexion
temperature_pin.enable_reporting() # Lecture des valeurs de la broche choisie

while temperature_pin.read() == None: None # Tant qu’il n’y a pas de valeurs

try:
    while True: # Boucle infinie
        print ("température entre 0 et 1 :",temperature_pin.read()) # On affiche les valeurs lues par la broche
        Celsius = ((temperature_pin.read()*5 - 0.5) *100)  # Transforme ces valeurs en Celsius
        print ("température en Celsius :" ,(round(Celsius,4))) # Arrondit et affiche la température
        time.sleep(1)# Fait une pause de 1 seconde entre deux mesures
except:
    temperature_pin.disable_reporting() # Arrête la lecture de la broche
    board.exit( )


Voici le schéma Fritzing associé au projet :

Voici ce que l’on peut voir en lançant le programme :

Le servo-moteur

servo moteur Arduino

Un servomoteur est un moteur capable de maintenir une opposition à un effort statique dont la position est vérifiée en continu et corrigée en fonction de la mesure.

Dans le programme que l’on va vous proposer, vous pourrez donner la valeur de l’angle que vous souhaitez et la position du servo-moteur changera en fonction de celle-ci.

import pyfirmata
board = pyfirmata.Arduino('COM3') # Windows
servo_pin = board.get_pin('d:9:s') # Permet d’initialiser la broche utilisée

try :
    while True: # Boucle infinie
        angle = int(input("Entrer un angle entre 10 et 170):")) # Demande à l’utilisateur d’entrer la valeur de l’angle
        if angle < 10 : # Si la valeur entrée est inférieure à 10° on bloque le servo moteur à 10°
            angle = 10
        elif angle > 170 : # Si la valeur entrée est supérieur à 170° on bloque le servo moteur à 170°
            angle = 170
            servo_pin.write(angle) # Ecrit cette valeur dans le pin du servo moteur
except :
    board.exit( )

Voici le schéma Fritzing associé au projet :

branchement servo moteur

Voici ce que l’on peut voir en lançant le programme :

angle servomoteur

Programme générique pour récupérer la valeur d'un composant

Dans cette partie, nous allons vous présenter un programme permettant de récupérer la valeur de n’importe quel composant.  Pour cela vous devrez changer quelques lignes afin d’adapter les valeurs que vous voulez obtenir, spécifier si c’est une entrée ou une sortie.

import pyfirmata

import time

port = ‘COM3’ # Windows à adapter par rapport à votre ordinateur

board = pyfirmata.Arduino(port) # Permet d’ouvrir le port associé

votre_composant_pin = board.get_pin(‘a:0:i’) # Permet d’initialiser la broche utilisée

iterator = pyfirmata.util.Iterator(board) # Permet d’initialiser la liaison entre Python et Arduino

iterator.start() # Démarrage de la connexion

votre_composant_pin.enable_reporting() # Lecture des valeurs de la broche choisie

while votre_composant_pin.read() == None: None # Tant qu’il n’y a pas de valeurs

try:

 while
True:

     print (“La valeur est : “,votre_composant_pin.read()) # Lit et affiche les valeurs de la broche

     time.sleep(1) # Pause entre deux mesures

except:

       votre_composant_pin.disable_reporting() # Arrête la lecture de la broche

        board.exit()

 

Voici les modifications que vous devez apporter afin de que votre programme fonctionne avec le composant choisi :

  • Ce qui est en turquoise peut être remplacé par le nom de votre composant, comme bouton poussoir ou photorésistance. Ne pas oublier de laisser ce qui est après le point, par exemple : bouton_poussoir.read() au lieu de votre_composant_pin.read
  • Ce qui est en vert doit être remplacé en fonction du tableau suivant :

 

Input (capteur, bouton …)

Output (moteur, led …)

d => digital

(d : N° broche : i)

(d : N° broche : o)

a => analogique

(a : N° broche : i)

(a : N° broche : o)


Attention y a 2 exceptions pour digital :

1) (d : N° broche : p) -> p signifie pulse width modulation  (pwm), qui permet de modifier l’intensité d’une led par exemple.

2) ( d : N° broche : s) -> s signifie servomoteur, vous devez le mettre uniquement si vous utilisez un servo moteur

d = digital, on l’utilise si l’on souhaite contrôler un composant (un moteur par exemple)

a = analogique, on l’utilise pour tout ce qui est capteur et qui renvoie une tension mesurant une grandeur physique

i = input (entrée)

o = output (sortie)

carte arduino pin

Vous savez maintenant comme utiliser pyfirmata, une des librairies Python pour Arduino. N’hésitez pas à regarder d’autres cours sur notre site, comme la télécommande infrarouge ou encore le moteur pas à pas.