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.
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.
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é.
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 ».
Méthode 1 : On peut trouver le numéro du port dans le gestionnaire de périphériques.
Méthode 2 : On peut aussi le trouver depuis le bouton outil sur Arduino IDE.
Si vous avez des problèmes pour trouver votre port, on vous conseille notre cours dessus.
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.
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 :
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 :
Voici ce que l’on peut voir en lançant le programme :
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 :
| 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) |
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)
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.