Los steppers se usan cuando se requiere alta precisión con el control de bucle abierto. Veremos cómo programar su Raspberry Pi para controlar un motor paso a paso.
Prerequisite: Programación con Raspberry Pi
Material
- Pantalla
- cable HDMI
- Teclado
- Raspberry PI 3 (con sistema operativo en micro SD)
- Ratón
- Fuente de alimentación micro USB B
- Stepper x1
- ULN2003APG x1 o H-Bridge SN754410NE x1
Steppers
Los steppers tienen varias fases que, si se activan con la secuencia correcta de impulsos, pueden rotar en pasos discretos. Como se conoce la secuencia para moverse paso a paso, la posición del rotor puede mantenerse en la memoria y, por lo tanto, controlar con precisión el motor sin sensor.

Hay dos tipos principales de steppers unipolar (5 o 6 cables) y bipolar (4 cables) que tienen características diferentes, como el número de pasos por revolución. Esas características deben ser conocidas e implementadas en el código para poder controlar el paso a paso correctamente.
Transistor
Para controlar los motores paso a paso, se puede usar tanto la red de transistores como el puente H para aplicar la secuencia correcta de impulsos a las bobinas o fases del motor paso a paso.
Para el ejemplo unipolar, utilizamos la red de transistores ULN2003A


Para el ejemplo bipolar, utilizamos un puente H, SN754410NE.


Cableado del stepper 28BYJ-48 con Raspberry Pi
Stepper se alimenta a través del módulo ULN2003A. Las entradas del módulo del 1 al 4 están conectadas a la salida 18,22,24,26 (GPIO24, GPIO25, GPIO8, GPIO7) del RaspberryPi. Los pines + y – del módulo están conectados al pin 5V y GND del RaspberryPi.
Dependiendo de la potencia requerida para el motor, se puede usar la salida de voltaje de la Raspberry Pi, pero se recomienda encarecidamente usar una fuente de alimentación externa para proteger el microcontrolador.

Como recordatorio, aquí está el pinout de la Raspberry Pi 3.

Código básico para controlar un stepper con Raspberry Pi
Para controlar un paso a paso, se debe definir una secuencia de impulsos enviados a cada fase del motor. Esto rotará el rotor. El número de pasos por revolución te da el ángulo para cada paso (en este caso, 2048).
Este es el ejemplo que se escribió para este paso a paso en particular (28BYJ-48 130061869) para que funcione. Los pasos pueden ser bastante diferentes, verifique las hojas de datos y juegue un poco con los parámetros para que el código funcione para su aplicación.
#!/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 some settings
WaitTime = 0.005
# 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)
NB: Tenga cuidado al copiar el código Python de Internet, puede encontrar problemas de sangría que conducen a un error de compilación.
Fuentes
Encuentre otros tutoriales y ejemplos en el generador de código automático
Arquitecto de Código