Les moteurs steppers sont idéaux pour les applications où il est nécessaire de connaître l’angle de rotation, par exemple en robotique. Contrairement à un moteur normal, les moteurs stepper peuvent commander les étapes individuellement et peuvent donc détecter la position exacte.
Pour contrôler facilement un tel moteur, un circuit IC de commande comme le L293D ou l’ULN2003 sont nécessaires. L’utilisation des deux conducteurs est montrée dans ce tutoriel.
Le plus commun de ces deux est l’ULN2003, qui est aussi souvent inclus sur les cartes de circuits avec le 28BYJ-48th Il y a une tension de 5V et 12V possible.
Le L293D offre cependant la possibilité de connecter une source d’alimentation externe, ce qui signifie par exemple un ampérage plus élevé (qui est nécessaire dans certains moteurs) peut être connecté.
Accessoires
- Moteur Stepper , ex. le 28BYJ-48 avec circuit conducteur ULN2003
- Conducteur L293D IC
- alternativement, si aucun L293D n’est désiré : ULN2003 Darlington Array IC
- Fil Jumper
- peut-être une source d’alimentation externe, par exemple les piles
Bien sûr, vous pouvez utiliser n’importe quel autre moteur stepper, mais il est important d’identifier les différentes couleurs de fils possibles lorsque vous les connectez (voir fiche technique).
Ces couleurs se reflètent dans mon cas sur le 28BYJ-48 (data sheet):
Si vous choisissez un moteur différent, considérez le cas où les couleurs peuvent être différentes. Les positions et les étapes sont importantes.
Câblage L293D
Si vous avez un moteur avec une carte pilote ULN2003 ou le circuit intégré du pilote ULN2003, vous pouvez sauter cette étape.
La fiche technique montre qu’une source d’alimentation externe est possible. La structure est donc la suivante :
Il est important de dire que si vous utilisez une source d’alimentation externe, le + 5V de Raspberry Pi doit également être connecté au pin inférieur gauche du IC (broche 8), en addition à la broche 16.
Si l’ampérage du moteur exigeait plus que ce que le Raspberry peut fournir, vous devez avoir une source d’alimentation externe (une source de courant fixe est préférable aux batteries). La pré-résistance est également spécifiée dans la fiche technique. Faites attention que vous avez assez de tension et d’ampérage, parce que c’est la cause la plus commune, pourquoi le moteur plus tard ne fonctionne pas comme il le devrait. Avec le 28BYJ-48 cependant, cela n’est pas le cas.
Câblage ULN2003
Contrairement au L293D, la tension d’entrée n’est que de 5V ou 12V (fiche technique). Comme le Raspberry Pi n’est alimenté qu’en 5V, nous pouvons également utiliser uniquement des moteurs steppers qui nécessitent un maximum de 5V.
Essai
Lors de l’utilisation du 28BYJ-48, la séquence est la suivante. Si vous utilisez un moteur différent, vous devez ajuster la séquence correspondante à votre fiche technique.
Donc nous créons un script :
sudo nano stepper.py
et ajoutez le script suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) coil_A_1_pin = 4 # pink coil_A_2_pin = 17 # orange coil_B_1_pin = 23 # blue coil_B_2_pin = 24 # yellow # adjust if different StepCount = 8 Seq = range(0, StepCount) Seq[0] = [0,1,0,0] Seq[1] = [0,1,0,1] Seq[2] = [0,0,0,1] Seq[3] = [1,0,0,1] Seq[4] = [1,0,0,0] Seq[5] = [1,0,1,0] Seq[6] = [0,0,1,0] Seq[7] = [0,1,1,0] GPIO.setup(enable_pin, GPIO.OUT) GPIO.setup(coil_A_1_pin, GPIO.OUT) GPIO.setup(coil_A_2_pin, GPIO.OUT) GPIO.setup(coil_B_1_pin, GPIO.OUT) GPIO.setup(coil_B_2_pin, GPIO.OUT) GPIO.output(enable_pin, 1) def setStep(w1, w2, w3, w4): GPIO.output(coil_A_1_pin, w1) GPIO.output(coil_A_2_pin, w2) GPIO.output(coil_B_1_pin, w3) GPIO.output(coil_B_2_pin, w4) def forward(delay, steps): for i in range(steps): for j in range(StepCount): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) def backwards(delay, steps): for i in range(steps): for j in reversed(range(StepCount)): setStep(Seq[j][0], Seq[j][1], Seq[j][2], Seq[j][3]) time.sleep(delay) if __name__ == '__main__': while True: delay = raw_input("Time Delay (ms)?") steps = raw_input("How many steps forward? ") forward(int(delay) / 1000.0, int(steps)) steps = raw_input("How many steps backwards? ") backwards(int(delay) / 1000.0, int(steps)) |
Ensuite, juste sauvegarder avec CTRL+O et CTRL+X et quitter. Vous pouvez le démarrer avec :
sudo python stepper.py
Avec setStep(0,0,0,0)
vous pouvez mettre le stepper au ralenti, car sinon l’énergie est consommée tout le temps (par les électro-aimants du moteur).
Eu égard cela, si vous choisissez une valeur de retard élevée (par pas), le moteur se déplace très lentement (par exemple, avec un retard de 100ms, un tour complet prendrait déjà 51,2 secondes, car le moteur a un total de 512 pas. Des valeurs de retard trop faibles peuvent cependant avoir l’effet inverse, de sorte que les signaux sont transmis trop rapidement et que le moteur ne fait que « bégayer ». Si vous voulez un moteur plus rapide, choisissez un modèle avec un angle de pas plus grand).