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

1.3.2 Servo
=============

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

En este proyecto, aprenderemos cómo hacer que el servo gire.

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

Para este proyecto, necesitamos los siguientes componentes. 

.. image:: ../python_pi5/img/1.3.2_servo_list.png


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

.. image:: ../img/image337.png


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

**Paso 1:** Construye el circuito.

.. image:: ../img/image125.png

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

.. raw:: html

   <run></run>

.. code-block::

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

**Paso 3**: Ejecuta el archivo.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.3.2_Servo.py

Al ejecutar el programa, el servo girará de 0 grados a 90, luego a 180 grados, y después volverá de 180 grados a 90 y finalmente a 0 grados, en un ciclo continuo.

.. 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 Servo
   from time import sleep

   # Configura el número de pin GPIO al que está conectado el servo
   myGPIO = 18

   # Define un factor de corrección para ajustar la anchura del pulso del servo
   myCorrection = 0.45
   maxPW = (2.0 + myCorrection) / 1000  # Calcula la anchura de pulso máxima
   minPW = (1.0 - myCorrection) / 1000  # Calcula la anchura de pulso mínima

   # Inicializa el objeto Servo con anchuras de pulso personalizadas
   servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

   try:
       while True:
           # Posiciona el servo en el centro y espera
           servo.mid()
           print("mid")  # Indica la posición actual
           sleep(0.5)       # Pausa breve de 0.5 segundos

           # Mueve el servo a su posición mínima y espera
           servo.min()
           print("min")   # Indica la posición actual
           sleep(1)          # Mantiene la posición durante 1 segundo

           # Devuelve el servo a la posición central y espera
           servo.mid()
           print("mid")   # Indica la posición actual
           sleep(0.5)        # Pausa breve de 0.5 segundos

           # Mueve el servo a su posición máxima y espera
           servo.max()
           print("max")   # Indica la posición actual
           sleep(1)          # Mantiene la posición durante 1 segundo

   except KeyboardInterrupt:
       # Termina el script de forma segura en una interrupción de teclado (Ctrl+C)
       pass
    

**Explicación del Código**

#. Estas instrucciones de importación traen la clase ``Servo`` para el control del servo y la función ``sleep`` para temporización.

   .. code-block:: python

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

#. Configura el pin GPIO número 18 para conectar el servo motor.

   .. code-block:: python

       # Configura el número de pin GPIO al que está conectado el servo
       myGPIO = 18

#. Estas líneas definen un factor de corrección y lo usan para calcular las anchuras de pulso máxima y mínima del servo, ajustando su rango de movimiento.

   .. code-block:: python

       # Define un factor de corrección para ajustar la anchura del pulso del servo
       myCorrection = 0.45
       maxPW = (2.0 + myCorrection) / 1000  # Calcula la anchura de pulso máxima
       minPW = (1.0 - myCorrection) / 1000  # Calcula la anchura de pulso mínima

#. Inicializa el objeto Servo con el pin GPIO especificado y anchuras de pulso personalizadas.

   .. code-block:: python

       # Inicializa el objeto Servo con anchuras de pulso personalizadas
       servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)

#. El bloque `try` contiene un bucle `while True` para mover el servo continuamente. El servo se posiciona en los puntos central, mínimo y máximo, con cada posición impresa y mantenida durante una duración específica.

   .. code-block:: python

       try:
           while True:
               # Posiciona el servo en el centro y espera
               servo.mid()
               print("mid")  # Indica la posición actual
               sleep(0.5)       # Pausa breve de 0.5 segundos

               # Mueve el servo a su posición mínima y espera
               servo.min()
               print("min")   # Indica la posición actual
               sleep(1)          # Mantiene la posición durante 1 segundo

               # Devuelve el servo a la posición central y espera
               servo.mid()
               print("mid")   # Indica la posición actual
               sleep(0.5)        # Pausa breve de 0.5 segundos

               # Mueve el servo a su posición máxima y espera
               servo.max()
               print("max")   # Indica la posición actual
               sleep(1)          # Mantiene la posición durante 1 segundo

       except KeyboardInterrupt:
           # Termina el script de forma segura en una interrupción de teclado (Ctrl+C)
           pass
