Commande d’un moteur pas à pas Ce document présente quelques éléments permettant de commander la rotation d’un moteur pas à pas sur une carte Arduino_uno à l’aide de programmes générés sous Python (distribution Spyder).
I- Le matériel et les configurations Il vous faudra installer :
- Python3.5 (environnement spyder) : https://www.python.org/downloads/
- Arduino :
https://www.arduino.cc/en/Main/Software
Ensuite, il sera nécessaire de configurer Arduino pour que la communication avec Python soit possible à l’aide du module Firmata :
𝐹𝑖𝑐ℎ𝑖𝑒𝑟 → 𝐸𝑥𝑒𝑚𝑝𝑙𝑒 → 𝐹𝑖𝑟𝑚𝑎𝑡𝑎
→ 𝑆𝑡𝑎𝑛𝑑𝑎𝑟𝑑𝐹𝑖𝑟𝑚𝑎𝑡𝑎
Téléversé ce programme.
Attention : la communication avec python pourra se rompre lors des différentes tentatives des programmes testés sous python. Il faudra rebrancher le câble USB puis téléverser une nouvelle fois Firmata Il sera nécessaire de connaître le COM affecté à la carte Arduino, pour cela :𝑜𝑢𝑡𝑖𝑙𝑠 → 𝑃𝑜𝑟𝑡
Il reste une manipulation à faire sur python : installer le module Firmata avec les lignes de codes suivantes :
import pip
pip.main(['install','pyfirmata'])
On donne ci-dessous quelques lignes de code permettant de débuter une communication avec la carte.
from pyfirmata import Arduino, util import time
import matplotlib.pyplot as plt
#on déclare le bon port associé à la carte#
carte = Arduino('COM5')
#lancement de la communication avec la carte#
acquisition = util.Iterator(carte) acquisition.start()
#Les entrées et sorties sur la carte se définissent grâce à la fonction
get_pin()
#Avec un choix de paramètres dans la parenthèse :
#a analogique
#d digitale
#Le numéro de branchement sur la carte (de 0 à 13)
#i input , entrée
#o output, sortie
#p pwm Exemple :
Pour déclarer la pin digitale 2 en entrée, on écrit :
digital_2 = carte.get_pin('d:2:i') Pour déclarer la pin digitale 9 en sortie, on écrit :
digital_9 = carte.get_pin('d:9:o') Pour lire la valeur « numérique » de la pin 2, on écrit : digital_2.read()
Pour imposer un état haut à la pin 9, on écrit : digital_9.write(1)
II- Principe d’un moteur pas à pas Voici le principe d’un moteur pas à pas dont le rotor est un aimant permanent et dont le stator est constitué de deux pairs de bobinages (IN1,IN2,IN3,IN4). Le principe de rotation repose sur l’effet du moment de la force magnétique qui tend à aligner le rotor dans la direction et le sens du champ magnétique appliqué.
Voici une illustration simplifiée d’un moteur dont le pas est de 45° :
(1,0,0,0)
(1,1,0,0)
(0,1,0,0)
(0,1,1,0)
(0,0,1,0)
Et donc pour une rotation complète, il faut rajouter (0,0,1,1), (0,0,0,1),(1,0,0,1)
III- Moteur et alimentation
Le moteur pas à pas 28BYJ-48 étudié est représenté ci-dessous. Le rotor et le stator sont dentelés :
Les impulsions électriques émises sur les 4 fils (IN1,IN2,IN3,IN4) permettent donc une rotation avec un pas angulaire 𝛼. Dans notre cas, le pas angulaire est 𝛼 = 5,625° (car 32 dents sur le rotor) et il faut donc 64 pas pour une rotation complète.
Le cycle ci-dessous permet donc d’avancer de 4 dents :
(1,0,0,0),(1,1,0,0,),(0,1,0,0),(0,1,1,0),(0,0,1,0),(0,0 ,1,1), (0,0,0,1),(1,0,0,1)
Enfin, ce moteur est muni d’engrenages :
Le pas angulaire apparent du rotor métallique devient alors 𝛼
64.
Rotor métallique
Pour alimenter ce moteur, nous aurions pu utiliser des transistors et des diodes de protection pour chaque bobinage (comme pour le moteur cc), le composant ULN2003A va permettre de réaliser toute cette alimentation.
On donne ci-dessous le programme permettant d’imposer un cycle de rotation. Modifier ce programme afin que le moteur effectue un tour complet.
from pyfirmata import Arduino, util import time
#on déclare le bon port associé à la carte#
carte = Arduino('COM5')
#lancement de la communication avec la carte"
acquisition = util.Iterator(carte) acquisition.start()
IN_1 = carte.get_pin('d:11:o') IN_2 = carte.get_pin('d:10:o') IN_3 = carte.get_pin('d:9:o') IN_4 = carte.get_pin('d:8:o') IN_1.write(0)
IN_2.write(0) IN_3.write(0) IN_4.write(0)
pin = [IN_1,IN_2,IN_3,IN_4]
seq = [ [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1], [1,0,0,1]
]
for j in range(8):
time.sleep(0.01) for i in range(4):
pin[i].write(seq[j][i])
carte.exit()