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