.. note::

    ¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con 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**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
    - **Promociones y sorteos festivos**: 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:

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

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

En este proyecto, aprenderemos cómo usar el L293D para conducir un motor de 
corriente continua (DC) y hacerlo girar en sentido horario y antihorario. 
Dado que el motor de DC necesita una corriente mayor, por razones de seguridad, 
utilizamos el módulo de alimentación para suministrar energía a los motores.

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

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../img/list_1.3.1.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nombre	
        - ARTÍCULOS EN ESTE KIT
        - ENLACE
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

También puedes comprarlos por separado en los siguientes enlaces.

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - INTRODUCCIÓN DE COMPONENTES
        - ENLACE DE COMPRA

    *   - :ref:`cpn_gpio_extension_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_power_module`
        - \-
    *   - :ref:`cpn_l293d`
        - \-
    *   - :ref:`cpn_motor`
        - |link_motor_buy|

Diagrama Esquemático
------------------------

Conecta el módulo de alimentación a la placa de pruebas e inserta el 
capuchón del puente en el pin de 5V, así se suministrará un voltaje de 5V. 
Conecta el pin 1 del L293D al GPIO22 y configúralo como nivel alto. Conecta 
el pin 2 al GPIO27 y el pin 7 al GPIO17, luego establece un pin en alto 
mientras el otro en bajo. De esta manera, puedes cambiar la dirección de 
rotación del motor.

.. image:: ../img/image336.png


**Procedimientos Experimentales**

**Paso 1:** Construye el circuito.

.. image:: ../img/image117.png

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

.. image:: ../img/image118.jpeg

**Paso 2:** Ingresa a la carpeta del código.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python

**Paso 3:** Ejecuta.

.. 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 por 5 segundos, después gira en sentido 
antihorario durante 5 segundos y posteriormente se detiene por 5 segundos. 
Esta serie de acciones se ejecutará repetidamente.

**Código**

.. note::

    Puedes **Modificar/Restablecer/Copiar/Ejecutar/Detener** el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como ``raphael-kit/python``. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.


.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time

    # Set up pins
    MotorPin1   = 17
    MotorPin2   = 27
    MotorEnable = 22

    def setup():
        # Set the GPIO modes to BCM Numbering
        GPIO.setmode(GPIO.BCM)
        # Set pins to output
        GPIO.setup(MotorPin1, GPIO.OUT)
        GPIO.setup(MotorPin2, GPIO.OUT)
        GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)

    # Define a motor function to spin the motor
    # direction should be
    # 1(clockwise), 0(stop), -1(counterclockwise)
    def motor(direction):
        # Clockwise
        if direction == 1:
            # Set direction
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Enable the motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Clockwise")
        # Counterclockwise
        if direction == -1:
            # Set direction
            GPIO.output(MotorPin1, GPIO.LOW)
            GPIO.output(MotorPin2, GPIO.HIGH)
            # Enable the motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Counterclockwise")
        # Stop
        if direction == 0:
            # Disable the motor
            GPIO.output(MotorEnable, GPIO.LOW)
            print ("Stop")

    def main():
        # Define a dictionary to make the script more readable
        # CW as clockwise, CCW as counterclockwise, STOP as stop
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Clockwise
            motor(directions['CW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)
            # Anticlockwise
            motor(directions['CCW'])
            time.sleep(5)
            # Stop
            motor(directions['STOP'])
            time.sleep(5)

    def destroy():
        # Stop the motor
        GPIO.output(MotorEnable, GPIO.LOW)
        # Release resource
        GPIO.cleanup()   

    # If run this script directly, do:
    if __name__ == '__main__':
        setup()
        try:
            main()
        # When 'Ctrl+C' is pressed, the program
        # destroy() will be executed.
        except KeyboardInterrupt:
            destroy()
            
**Explicación del Código**

.. code-block:: python

    def motor(direction):
        # Sentido horario
        if direction == 1:
            # Establecer dirección
            GPIO.output(MotorPin1, GPIO.HIGH)
            GPIO.output(MotorPin2, GPIO.LOW)
            # Habilitar el motor
            GPIO.output(MotorEnable, GPIO.HIGH)
            print ("Clockwise")
    ...

Crear una función, ``motor()`` cuyo parámetro es direction. Si se cumple
la condición de que direction=1, el motor gira en sentido horario; cuando
direction=-1, el motor gira en sentido antihorario; y bajo la condición de que
direction=0, deja de girar.

.. code-block:: python

    def main():
        # Definir un diccionario para hacer el script más legible
        # CW como sentido horario, CCW como sentido antihorario, STOP como detener
        directions = {'CW': 1, 'CCW': -1, 'STOP': 0}
        while True:
            # Sentido horario
            motor(directions['CW'])
            time.sleep(5)
            # Detener
            motor(directions['STOP'])
            time.sleep(5)
            # Sentido antihorario
            motor(directions['CCW'])
            time.sleep(5)
            # Detener
            motor(directions['STOP'])
            time.sleep(5)

En la función main(), crea un diccionario, directions[], en el cual CW es
igual a 1, el valor de CCW es -1, y el número 0 se refiere a Stop.

Cuando se ejecuta el código, el motor primero gira en sentido horario 
durante 5s y luego se detiene durante 5s, después de eso, gira en sentido 
antihorario durante 5s; posteriormente, el motor se detiene durante 5s. 
Esta serie de acciones se ejecutará repetidamente.

Ahora, deberías ver la hélice del motor girando.

Imagen del Fenómeno
---------------------------

.. image:: ../img/image119.jpeg