Les moteurs pas-à-pas sont souvent utilisés lorsqu’une bonne précision est désirée en boucle ouverte notamment dans les systèmes de positionnement tels que les imprimantes 3D. Nous allons voir, dans cet article, comment programmer la carte Raspberry Pi pour pouvoir piloter un moteur pas-à-pas.
Prérequis: Programmez avec Raspberry Pi
Matériel
- Écran
- HDMI câble
- Clavier
- Raspberry PI 3 (avec OS sur micro SD)
- Souris
- Chargeur micro USB B
- ULN2003APG x1
- Moteur pas-à-pas
Moteur Pas-à-pas
Les moteurs pas-à-pas possèdent différentes phases qui permettent d’orienter la position du rotor. On peut donc transformer une séquence d’impulsions sur les différentes phases en déplacement angulaire. Comme la séquence à envoyer pour obtenir un certain déplacement est connue, on peut connaitre la position sans capteur supplémentaire et donc piloter le moteur précisément en boucle ouverte.
Ils existent deux types principaux de moteur pas-à-pas unipolaire (5 ou 6 fils) et bipolaire (4 fils) avec des caractéristiques pouvant varier comme le nombre de pas par révolution. Ces différences entrainent des modifications sur les paramètres de pilotage notamment sur le nombre de sorties nécessaires pour piloter le moteur. Afin de piloter correctement votre moteur, il est impératif d’avoir ces informations.
Transistor
Les moteurs pas-à-pas, comme leur nom l’indique, se pilotent pas à pas en appliquant la puissance électrique par séquence d’impulsions aux différentes phases du moteur. Pour les moteurs unipolaires, on utilise un réseau de transistor, comme le ULN2003A qui possèdent un réseau de 7 transistors.
Pour les moteurs bipolaires, nous utilisons un pont en H, SN754410NE, qui peut piloter les deux bobines indépendantes du moteur.
Schéma de connexion
Le moteur se pilote via le module de pilotage ULN2003A. Les entrées du module de 1 à 4 se connectent aux broches 18,22,24,26 (GPIO24,GPIO25,GPIO8,GPIO7) respectivement. Les bornes + et – du module se connectent aux broches 5V et masse du Raspberry Pi.
Selon la puissance du moteur utilisé, il peut s’alimenter par la borne 5V de la carte Raspberry Pi mais il est fortement conseillé d’utiliser une source de puissance extérieur afin de protéger le microcontrôleur.
Pour rappel, voici la description des broches du Raspberry Pi 3.
Code de base pour le contrôle d’un moteur pas-à-pas
Pour piloter le moteur pas-à-pas, nous définissons une séquence d’activation des phases du moteur qui va permettre au rotor de tourner. Le nombre de pas par révolution permet de connaître l’angle parcouru pour un pas (dans notre cas 2048).
Ce code permet de faire fonctionner le stepper 28BYJ-48 130061869. Les moteurs pas-à-pas peuvent être assez différents, il vous faut donc vérifier votre matériel avant de pouvoir le piloter.
#!/usr/bin/env python # -*- coding: utf-8 -*- # libraries import time import RPi.GPIO as GPIO # Use BCM GPIO references # Instead of physical pin numbers GPIO.setmode(GPIO.BCM) # Define GPIO signals to use Pins 18,22,24,26 GPIO24,GPIO25,GPIO8,GPIO7 StepPins = [24,25,8,7] # Set all pins as output for pin in StepPins: print("Setup pins") GPIO.setup(pin,GPIO.OUT) GPIO.output(pin, False) # Define time delay between steps WaitTime = 0.005 #set speed # Define simple sequence StepCount1 = 4 Seq1 = [] Seq1 = [i for i in range(0, StepCount1)] Seq1[0] = [1,0,0,0] Seq1[1] = [0,1,0,0] Seq1[2] = [0,0,1,0] Seq1[3] = [0,0,0,1] # Define advanced half-step sequence StepCount2 = 8 Seq2 = [] Seq2 = [i for i in range(0, StepCount2)] Seq2[0] = [1,0,0,0] Seq2[1] = [1,1,0,0] Seq2[2] = [0,1,0,0] Seq2[3] = [0,1,1,0] Seq2[4] = [0,0,1,0] Seq2[5] = [0,0,1,1] Seq2[6] = [0,0,0,1] Seq2[7] = [1,0,0,1] # Choose a sequence to use Seq = Seq2 StepCount = StepCount2 def steps(nb): StepCounter = 0 if nb<0: sign=-1 else: sign=1 nb=sign*nb*2 #times 2 because half-step print("nbsteps {} and sign {}".format(nb,sign)) for i in range(nb): for pin in range(4): xpin = StepPins[pin] if Seq[StepCounter][pin]!=0: GPIO.output(xpin, True) else: GPIO.output(xpin, False) StepCounter += sign # If we reach the end of the sequence # start again if (StepCounter==StepCount): StepCounter = 0 if (StepCounter<0): StepCounter = StepCount-1 # Wait before moving on time.sleep(WaitTime) # Start main loop nbStepsPerRev=2048 if __name__ == '__main__' : hasRun=False while not hasRun: steps(nbStepsPerRev)# parcourt un tour dans le sens horaire time.sleep(1) steps(-nbStepsPerRev)# parcourt un tour dans le sens anti-horaire time.sleep(1) hasRun=True print("Stop motor") for pin in StepPins: GPIO.output(pin, False)
N.B.: Faites attention aux indentations lorsque vous écrivez ou recopiez un code. Vous risqueriez d’avoir des erreurs de compilation.
Sources
- La THE référence https://www.raspberrypi.org/help/
- Programmez avec Raspberry Pi
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie