.. note:: ¡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 [|link_sf_facebook|] y únete hoy mismo. .. _1.3.3_py_pi5: 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. .. image:: ../python_pi5/img/1.3.3_stepper_motor_list.png .. raw:: html
Diagrama de Conexiones -------------------------- .. image:: /python_pi5/img/1.3.3_stepper_motor_schematic.png Procedimientos del Experimento --------------------------------- **Paso 1:** Construye el circuito. .. image:: ../python_pi5/img/1.3.3_stepper_motor_circuit.png **Paso 2:** Abre el archivo de código. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Paso 3:** Ejecuta el código. .. raw:: html .. code-block:: 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\'. .. warning:: Si aparece el mensaje de error ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc` **Código** .. note:: 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. .. raw:: html .. code-block:: python #!/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** #. 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. .. code-block:: python #!/usr/bin/env python3 from gpiozero import OutputDevice from time import sleep #. Inicializa los pines GPIO 18, 23, 24 y 25 como dispositivos de salida para controlar el motor a pasos. .. code-block:: python # Inicializa los pines del motor a los GPIO 18, 23, 24, 25 motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)] #. Configura la velocidad de rotación del motor y calcula el intervalo de tiempo entre cada paso para un funcionamiento suave. .. code-block:: python # 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 #. 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. .. code-block:: python 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) #. 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. .. code-block:: python 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) #. 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. .. code-block:: python def destroy(): """ Safely turns off all motor pins, used for clean shutdown. """ for pin in motorPin: pin.off() #. El programa principal llama a ``loop`` y maneja interrupciones de teclado (como Ctrl+C) para apagar el motor de manera segura usando ``destroy``. .. code-block:: python # Ejecución principal del programa try: loop() except KeyboardInterrupt: destroy() # Maneja la interrupción de teclado para apagar el motor de manera segura