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

1.1.2 LED RGB
====================

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

En este proyecto, controlaremos un LED RGB para que parpadee en varios colores.

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

En este proyecto, necesitamos los siguientes componentes.

.. image:: ../python_pi5/img/1.1.2_rgb_led_list.png
    :align: center

.. raw:: html

   <br/>

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

Después de conectar los pines de R, G y B a una resistencia limitadora de corriente, conéctalos respectivamente a los pines GPIO17, GPIO18 y GPIO27. El pin más largo (GND) del LED se conecta al GND de la Raspberry Pi. Al asignar valores PWM diferentes a los tres pines, el LED RGB mostrará diferentes colores.

============ ======== ===
T-Board Name physical BCM
GPIO17       Pin 11   17
GPIO18       Pin 12   18
GPIO27       Pin 13   27
============ ======== ===

.. image:: ../python_pi5/img/1.1.2_rgb_led_schematic.png

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

**Paso 1:** Construye el circuito.

.. image:: ../python_pi5/img/1.1.2_rgbLed_circuit.png

**Paso 2:** Abre el archivo de 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.1.2_rgbLed.py

Al ejecutar el código, verás que el LED RGB muestra los colores rojo, 
verde, azul, amarillo, rosa y cian.

.. warning::

    Si aparece un 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. Pero antes, debes acceder a la ruta del código fuente como ``davinci-kit-for-raspberry-pi/python-pi5``. Tras 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 RGBLED
   from time import sleep

   # Define una lista de colores para el LED RGB en formato RGB (Rojo, Verde, Azul).
   # Cada componente de color varía de 0 (apagado) a 1 (intensidad completa).
   COLORS = [(1, 0, 0), (0, 1, 0), (0.2, 0.1, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)]

   # Inicializa un LED RGB. Conecta el componente rojo al GPIO 17, el verde al GPIO 18 y el azul al GPIO 27.
   rgb_led = RGBLED(red=17, green=18, blue=27)

   try:
       # Cicla continuamente a través de los colores definidos.
       while True:
           for color in COLORS:
               # Configura el LED RGB al color actual.
               rgb_led.color = color
               # Muestra el color actual en la consola.
               print(f"Color set to: {color}")
               # Espera 1 segundo antes de cambiar al siguiente color.
               sleep(1)

   except KeyboardInterrupt:
       # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle de manera segura.
       # La limpieza de los pines GPIO se gestionará automáticamente al finalizar el script.
       pass


**Explicación del Código**

#. Esto importa la clase ``RGBLED`` de la biblioteca ``gpiozero`` para controlar un LED RGB, y la biblioteca ``time`` para implementar retrasos en el código.

   .. code-block:: python

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

       # Define una lista de colores para el LED RGB en formato RGB (Rojo, Verde, Azul).
       # Cada componente de color varía de 0 (apagado) a 1 (intensidad completa).

#. La lista ``COLORS`` contiene tuplas que representan diferentes colores en formato RGB. Al asignar valores de Modulación por Ancho de Pulso (PWM) a cada uno de los pines R, G y B mediante el atributo ``rgb_led.color``, el LED puede producir una variedad de colores. Los valores PWM oscilan entre 0 (apagado) y 1 (intensidad completa) para cada componente de color.

#. Por ejemplo, al configurar ``rgb_led.color = (1, 0, 0)`` el LED se enciende en rojo, al asignar intensidad completa al componente rojo mientras se mantiene el verde y el azul apagados. Combinaciones variadas de estos valores generan distintos colores. Esta técnica de mezcla de colores mediante PWM permite la creación de una amplia gama de colores en el LED RGB.

   .. code-block:: python    
       
       COLORS = [(1, 0, 0), (0, 1, 0), (0.2, 0.1, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)]

#. Se inicializa un LED RGB con sus componentes rojo, verde y azul conectados a los pines GPIO 17, 18 y 27, respectivamente.

   .. code-block:: python

       # Inicializa un LED RGB. Conecta el componente rojo al GPIO 17, el verde al GPIO 18 y el azul al GPIO 27.
       rgb_led = RGBLED(red=17, green=18, blue=27)

#. El bucle ``while True:`` cicla continuamente a través de los colores definidos en ``COLORS``. Para cada color, ``rgb_led.color = color`` establece el LED en ese color, y ``sleep(1)`` pausa por 1 segundo. 

   .. code-block:: python

       try:
           # Cicla continuamente a través de los colores definidos.
           while True:
               for color in COLORS:
                   # Configura el LED RGB al color actual.
                   rgb_led.color = color
                   # Muestra el color actual en la consola.
                   print(f"Color set to: {color}")
                   # Espera 1 segundo antes de cambiar al siguiente color.
                   sleep(1)

#. Esta sección maneja de manera segura una ``KeyboardInterrupt`` (como presionar Ctrl+C). La declaración ``pass`` se usa como un marcador de posición para indicar que no se realiza ninguna acción específica en la interrupción, ya que GPIO Zero gestiona la limpieza de los pines GPIO automáticamente.

   .. code-block:: python

       except KeyboardInterrupt:
           # Maneja una interrupción de teclado (Ctrl+C) para salir del bucle de manera segura.
           # La limpieza de los pines GPIO se gestionará automáticamente al finalizar el script.
           pass

