fbpixel
Etiquetas: , , ,
5
(1)

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. (Notas sobre diferentes tipos de steppers 28BYJ-48)

#!/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

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en los medios sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?