Rasberry Pi y el Motor de Pasos 28BYJ-48

Hacer que la Rasberry Pi y el Motor de Pasos 28BYJ-48 trabajen para generar movimiento no es muy complicado, en este tutorial veremos un ejemplo sencillo para hacer girar al motor en una dirección.

» Ver más ejemplos

Antes de ir al código te enlistamos la lista de componentes que usaremos:

  • Raspberry Pi, Zero, Zero W, o modelos 3 o 4.
  • Motor de Pasos 28BYJ-48
  • Controlador ULN2003APG
  • Cables de conexión Dupont (conexión hembra y macho)
  • Protoboard
  • Fuente de alimentación 5v para la Rasberry
  • Fuente de alimentación de 5v para el motor (es recomendable separar la alimentación de la Raspberry)

Es muy común que el motor de pasos 28BYJ-48 venga con su controlador ULN2003APG, así que te recomendamos que los consigas juntos. Prácticamente cualquier modelo de Rasberry funcionará con este código, siempre y cuando ubiques los pines de salida y los conectes de acuerdo al diagrama de conexión.

El diagrama de conexiones

Rasberry Pi y el Motor de Pasos 28BYJ-48

Algunas observaciones sobre las conexiones

La Raspberry cuenta con su propia alimentación. El controlador del motor de pasos puede ser alimentado con 5v o 12v, pero ten cuidado de no sobrecargarlo, te recomiendo usar 5v para alimentarlo y hacer tus pruebas.

El código en Python para la Raspberry

import RPi.GPIO as GPIO
import time
 
in1 = 17
in2 = 18
in3 = 27
in4 = 22
 
# Este es el tiempo de demora entre cada paso, es importante que no sobrepases las limitaciones mecánicas del motor y su velocidad de giro
step_sleep = 0.002
 
step_count = 4096 # 5.625*(1/64) por paso, 4096 pasos corresponden a 360°
direction = False # True para el sentido del reloj, False para el sentido contrario
 
# Se define la secuencia de fases para el motor
step_sequence = [[1,0,0,1],
                 [1,0,0,0],
                 [1,1,0,0],
                 [0,1,0,0],
                 [0,1,1,0],
                 [0,0,1,0],
                 [0,0,1,1],
                 [0,0,0,1]]

# Se establecen los pines de salida de la Raspberry
GPIO.setmode( GPIO.BCM )
GPIO.setup( in1, GPIO.OUT )
GPIO.setup( in2, GPIO.OUT )
GPIO.setup( in3, GPIO.OUT )
GPIO.setup( in4, GPIO.OUT )

# Se inicializan los estados de los pines
GPIO.output( in1, GPIO.LOW )
GPIO.output( in2, GPIO.LOW )
GPIO.output( in3, GPIO.LOW )
GPIO.output( in4, GPIO.LOW )

motor_pins = [in1,in2,in3,in4]
motor_step_counter = 0 ;

def cleanup():
    GPIO.output( in1, GPIO.LOW )
    GPIO.output( in2, GPIO.LOW )
    GPIO.output( in3, GPIO.LOW )
    GPIO.output( in4, GPIO.LOW )
    GPIO.cleanup()

# Comienzan los ciclos de giro
try:
    i = 0
    for i in range(step_count):
        for pin in range(0, len(motor_pins)):
            GPIO.output( motor_pins[pin], step_sequence[motor_step_counter][pin] )
        if direction==True:
            motor_step_counter = (motor_step_counter - 1) % 8
        elif direction==False:
            motor_step_counter = (motor_step_counter + 1) % 8
        else: # Programación defensiva
            print( "No debería llegar a este punto por que la dirección siempre es verdadera o falsa" )
            cleanup()
            exit( 1 )
        time.sleep( step_sleep )
 
except KeyboardInterrupt:
    cleanup()
    exit( 1 )
 
cleanup()
exit( 0 )

En nuestro código usaremos la biblioteca para controlara la GPIO, por lo que debes asegurarte de tenerla instalada.

sudo apt-get update --fix-missing && sudo apt-get install python3-rpi.gpio

Te explicamos brevemente el código. En el siguiente bloque, establecemos los pines de salida para controlar el motor.

in1 = 17
in2 = 18
in3 = 27
in4 = 22

Creamos un arreglo con los estados necesarios para generar movimiento en el motor.

step_sequence = [[1,0,0,1],
                 [1,0,0,0],
                 [1,1,0,0],
                 [0,1,0,0],
                 [0,1,1,0],
                 [0,0,1,0],
                 [0,0,1,1],
                 [0,0,0,1]]

El bloque anterior es importante, porque estamos creando un patrón de activación para el motor con pasos intermedios. Es decir, en algunos momentos activamos sólo una fase del motor, en otras dos, volvemos a activar sólo una y así sucesivamente. Esto nos permite un mayor rango de pasos y precisión.

Establecemos estos pines como salidas de datos.

GPIO.setmode( GPIO.BCM )
GPIO.setup( in1, GPIO.OUT )
GPIO.setup( in2, GPIO.OUT )
GPIO.setup( in3, GPIO.OUT )
GPIO.setup( in4, GPIO.OUT )

Controlar cada paso lel Motor

Finalmente, recorremos el arreglo activando de acuerdo a sus valores las fases del motor. Y hacemos esto tantas veces como lo hayamos establecido en la variable step_count.

try:
    i = 0
    for i in range(step_count):
        for pin in range(0, len(motor_pins)):
            GPIO.output( motor_pins[pin], step_sequence[motor_step_counter][pin] )
        if direction==True:
            motor_step_counter = (motor_step_counter - 1) % 8
        elif direction==False:
            motor_step_counter = (motor_step_counter + 1) % 8
        else: # Programación defensiva
            print( "No debería llegar a este punto por que la dirección siempre es verdadera o falsa" )
            cleanup()
            exit( 1 )
        time.sleep( step_sleep )

Para movimientos más complejos debes tomar en cuenta la forma en la que activas las salidas hacia el motor, puede que necesites «recordar» los últimos estados en los que activaste cada fase.

La Rasberry Pi y el Motor de Pasos 28BYJ-48 te permitirán hacer muchos proyectos creativos. Esperamos que te sea de utilidad este ejemplo y te permita comenzar y familiarizarte con los motores de pasos.

Ver documentación: https://gpiozero.readthedocs.io/en/stable/cli_pinout.html