Nota

¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte Experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances Exclusivos: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.

  • Descuentos Especiales: Aprovecha descuentos exclusivos en nuestros productos más recientes.

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones especiales.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

1.3.3 Motor a Pasos

Introducción

Los motores a pasos, debido a su diseño único, pueden ser controlados con un alto grado de precisión sin necesidad de mecanismos de retroalimentación. El eje de un motor a pasos, equipado con una serie de imanes, es controlado por una secuencia específica de bobinas electromagnéticas que se cargan positiva y negativamente, moviéndolo hacia adelante o hacia atrás en pequeños "pasos".

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/1.3.3_stepper_motor_list.png

Diagrama de Conexiones

../_images/1.3.3_stepper_motor_schematic.png

Procedimientos del Experimento

Paso 1: Construye el circuito.

../_images/1.3.3_stepper_motor_circuit.png

Paso 2: Abre el archivo de código.

cd ~/davinci-kit-for-raspberry-pi/python-pi5

Paso 3: Ejecuta el código.

sudo python3 1.3.3_StepperMotor.py

Al ejecutar el código, el motor a pasos girará en sentido horario o antihorario, dependiendo de la entrada 'a' o 'c'.

Advertencia

Si aparece el mensaje de error RuntimeError: Cannot determine SOC peripheral base address, consulta Si gpiozero no funciona.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Antes de eso, asegúrate de estar en la ruta del código fuente, como davinci-kit-for-raspberry-pi/python-pi5. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep

# Inicializa los pines del motor a los GPIO 18, 23, 24, 25
motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]

# Define parámetros de velocidad de rotación del motor
rotationPerMinute = 15
stepsPerRevolution = 2048
# Calcula el tiempo de espera entre cada paso para un funcionamiento suave
stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution

def rotary(direction):
    """
    Controls the rotation of the motor based on the specified direction.

    :param direction: 'c' for clockwise, 'a' for anti-clockwise
    """
    if direction == 'c':
        # Ejecuta la secuencia de pasos para rotación en sentido horario
        for j in range(4):
            for i in range(4):
                if 0x99 << j & (0x08 >> i):
                    motorPin[i].on()
                else:
                    motorPin[i].off()
                sleep(stepSpeed)
    elif direction == 'a':
        # Ejecuta la secuencia de pasos para rotación en sentido antihorario
        for j in range(4):
            for i in range(4):
                if 0x99 >> j & (0x08 >> i):
                    motorPin[i].on()
                else:
                    motorPin[i].off()
                sleep(stepSpeed)

def loop():
    """
    Continuously prompts the user to select the motor rotation direction
    and controls the motor based on this input.
    """
    while True:
        direction = input('Select motor direction a=anticlockwise, c=clockwise: ')
        if direction == 'c':
            print('Motor running clockwise\n')
            break
        elif direction == 'a':
            print('Motor running anti-clockwise\n')
            break
        else:
            print('Input error, please try again!')

    # Mantiene el motor girando en la dirección seleccionada
    while True:
        rotary(direction)

def destroy():
    """
    Safely turns off all motor pins, used for clean shutdown.
    """
    for pin in motorPin:
        pin.off()

# Ejecución principal del programa
try:
    loop()
except KeyboardInterrupt:
    destroy()  # Maneja la interrupción de teclado para apagar el motor de manera segura

Explicación del Código

  1. Esta sección importa las bibliotecas necesarias. gpiozero para controlar los pines GPIO y time para la función sleep utilizada en el control de temporización.

    #!/usr/bin/env python3
    from gpiozero import OutputDevice
    from time import sleep
    
  2. Inicializa los pines GPIO 18, 23, 24 y 25 como dispositivos de salida para controlar el motor a pasos.

    # Inicializa los pines del motor a los GPIO 18, 23, 24, 25
    motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]
    
  3. Configura la velocidad de rotación del motor y calcula el intervalo de tiempo entre cada paso para un funcionamiento suave.

    # Define parámetros de velocidad de rotación del motor
    rotationPerMinute = 15
    stepsPerRevolution = 2048
    # Calcula el tiempo de espera entre cada paso para un funcionamiento suave
    stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution
    
  4. La función rotary controla la rotación del motor usando manipulación de bits y una secuencia de pasos para activar los pines en el orden correcto para la rotación en sentido horario o antihorario.

    def rotary(direction):
        """
        Controls the rotation of the motor based on the specified direction.
    
        :param direction: 'c' for clockwise, 'a' for anti-clockwise
        """
        if direction == 'c':
            # Ejecuta la secuencia de pasos para rotación en sentido horario
            for j in range(4):
                for i in range(4):
                    if 0x99 << j & (0x08 >> i):
                        motorPin[i].on()
                    else:
                        motorPin[i].off()
                    sleep(stepSpeed)
        elif direction == 'a':
            # Ejecuta la secuencia de pasos para rotación en sentido antihorario
            for j in range(4):
                for i in range(4):
                    if 0x99 >> j & (0x08 >> i):
                        motorPin[i].on()
                    else:
                        motorPin[i].off()
                    sleep(stepSpeed)
    
  5. Esta función solicita continuamente al usuario que elija la dirección de rotación del motor y controla el motor en función de la entrada.

    def loop():
        """
        Continuously prompts the user to select the motor rotation direction
        and controls the motor based on this input.
        """
        while True:
            direction = input('Select motor direction a=anticlockwise, c=clockwise: ')
            if direction == 'c':
                print('Motor running clockwise\n')
                break
            elif direction == 'a':
                print('Motor running anti-clockwise\n')
                break
            else:
                print('Input error, please try again!')
    
        # Mantiene el motor girando en la dirección seleccionada
        while True:
            rotary(direction)
    
  6. La función destroy apaga todos los pines del motor. Es utilizada para un apagado seguro, asegurando que el motor se detenga al finalizar el programa.

    def destroy():
        """
        Safely turns off all motor pins, used for clean shutdown.
        """
        for pin in motorPin:
            pin.off()
    
  7. El programa principal llama a loop y maneja interrupciones de teclado (como Ctrl+C) para apagar el motor de manera segura usando destroy.

    # Ejecución principal del programa
    try:
        loop()
    except KeyboardInterrupt:
        destroy()  # Maneja la interrupción de teclado para apagar el motor de manera segura