.. 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.1_py_pi5:

1.3.1 Motor
=============

Introducción
---------------

En este proyecto, aprenderemos a usar el L293D para controlar un motor de 
corriente continua (DC) y hacerlo girar en sentido horario y antihorario. 
Dado que el motor de corriente continua requiere una corriente más alta, 
usaremos el Módulo de Alimentación para proporcionar energía de manera segura al motor.

Componentes Necesarios
-------------------------

Para este proyecto, necesitamos los siguientes componentes. 

.. image:: ../python_pi5/img/1.3.1_motor_list.png


Diagrama de Conexiones
-------------------------

.. image:: ../python_pi5/img/1.3.1_motor_schematic.png


Procedimientos del Experimento
---------------------------------

**Paso 1:** Construye el circuito.

.. image:: ../python_pi5/img/1.3.1_motor_circuit.png

.. note::
    El módulo de alimentación puede usar una batería de 9V con el conector para 
    batería de 9V incluido en el kit. Inserta el capuchón del módulo de 
    alimentación en las tiras de bus de 5V de la protoboard.

.. image:: ../python_pi5/img/1.3.1_motor_battery.jpeg

**Paso 2:** Ve al directorio del código.

.. raw:: html

   <run></run>

.. code-block::

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

**Paso 3:** Ejecuta el código.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.1_Motor.py

Al ejecutar el código, el motor primero gira en sentido horario durante 5 
segundos, luego se detiene durante 5 segundos, después gira en sentido 
antihorario durante 5 segundos y posteriormente se detiene nuevamente por 
5 segundos. Esta serie de acciones se repetirá continuamente.

.. 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

    <run></run>

.. code-block:: python

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

   # Inicializa el Motor con GPIO Zero, especificando los pines GPIO para control de avance (17), retroceso (27) y habilitación (22)
   motor = Motor(forward=17, backward=27, enable=22)

   try:
       # Función principal para controlar la dirección y movimiento del motor.
       # Alterna la rotación del motor entre horario y antihorario con pausas intermedias.
       actions = {'CW': motor.forward, 'CCW': motor.backward, 'STOP': motor.stop}  # Define las acciones del motor para facilitar la lectura
       
       while True:
           # Recorre las acciones definidas para controlar la dirección del motor
           for action in ['CW', 'STOP', 'CCW', 'STOP']:
               actions[action]()  # Ejecuta la acción actual (avanzar, parar, retroceder, parar)
               print(f"{action}")  # Muestra la acción actual en la consola
               sleep(5)  # Pausa de 5 segundos antes de proceder a la siguiente acción

   except KeyboardInterrupt:
       # Maneja de forma segura una interrupción de teclado (Ctrl+C) para detener el programa
       pass


**Explicación del Código**

#. Estas declaraciones de importación incorporan la clase ``Motor`` de la librería ``gpiozero`` y la función ``sleep`` del módulo ``time`` para manejar pausas.
    
   .. code-block:: python  

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

#. Esta línea inicializa un objeto ``Motor``, especificando los pines GPIO para el control de avance (17), retroceso (27) y habilitación (22).
    
   .. code-block:: python
       
       # Inicializa el Motor con GPIO Zero, especificando los pines GPIO para control de avance (17), retroceso (27) y habilitación (22)
       motor = Motor(forward=17, backward=27, enable=22)
      

#. Las acciones de control del motor se definen en un diccionario para facilitar la lectura. Un bucle infinito (`while True`) recorre estas acciones, ejecutando cada una durante 5 segundos.
    
   .. code-block:: python
       
       try:
           # Función principal para controlar la dirección y movimiento del motor.
           # Alterna la rotación del motor entre horario y antihorario con pausas intermedias.
           actions = {'CW': motor.forward, 'CCW': motor.backward, 'STOP': motor.stop}  # Define las acciones del motor para facilitar la lectura
           
           while True:
               # Recorre las acciones definidas para controlar la dirección del motor
               for action in ['CW', 'STOP', 'CCW', 'STOP']:
                   actions[action]()  # Ejecuta la acción actual (avanzar, parar, retroceder, parar)
                   print(f"{action}")  # Muestra la acción actual en la consola
                   sleep(5)  # Pausa de 5 segundos antes de proceder a la siguiente acción
      

#. Este segmento permite que el programa se termine de manera segura utilizando una interrupción de teclado (Ctrl+C) sin causar errores.
    
   .. code-block:: python
       
       except KeyboardInterrupt:
       # Maneja de forma segura una interrupción de teclado (Ctrl+C) para detener el programa
       pass
      

