Étiquettes : , , ,

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 de 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, peuvent être pilotés pas à pas en appliquant la puissance électrique par séquence d’impulsions aux différentes phases du moteur. Pour les moteurs unipolaires, un réseau de transistor sera utilisé 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 est alimenté via le module de pilotage ULN2003A. Les entrées du module de 1 à 4 sont connectées au pins 18,22,24,26 (GPIO24,GPIO25,GPIO8,GPIO7) respectivement. Les bornes + et – du module sont connectés aux pins 5V et masse du RaspberryPi.

Selon la puissance du moteur utilisé, il peut être alimenté 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 a été écrit pour 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. (exemple sur les différents types de moteur 28BYJ-48)

#!/usr/bin/env python 
#-*-coding: latin-1-*-
# 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 some settings
WaitTime = 0.005
# Define simple sequence
StepCount1 = 4
Seq1 = []
Seq1 = 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 = 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
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