Site icon AranaCorp

Pilotez un moteur pas-à-pas avec Raspberry Pi

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

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

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile