fbpixel
Etiquetas: , , ,

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.

stepper-motor-640x640 Controla un stepper con RaspberryPi

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

uln2003a-transistors-net Controla un stepper con RaspberryPi
uln2003a-schematics Controla un stepper con RaspberryPi

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

h-bridge-sn754410 Controla un stepper con RaspberryPi
sn754410-connections-500x500 Controla un stepper con RaspberryPi

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.

stepper-rpi3-28byj48-bb Controla un stepper con RaspberryPi

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

rp2_pinout Controla un stepper con RaspberryPi

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