.. note::

    ¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

    **¿Por qué unirse?**

    - **Soporte experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
    - **Aprender y compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
    - **Avances exclusivos**: Obtén acceso temprano a nuevos anuncios de productos y adelantos.
    - **Descuentos especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
    - **Promociones y sorteos festivos**: Participa en sorteos y promociones de temporada.

    👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy.

.. _1.1.2_py:

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

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

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

Componentes requeridos
---------------------------------

En este proyecto, necesitaremos los siguientes componentes.

.. image:: ../img/list_rgb_led.png
    :align: center

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

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

    *   - Nombre
        - ELEMENTOS EN ESTE KIT
        - ENLACE
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

También puedes comprarlos por separado en los enlaces a continuación.

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

    *   - INTRODUCCIÓN DEL COMPONENTE
        - 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_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_rgb_led`
        - |link_rgb_led_buy|

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

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

================== ======== ======== ===
Nombre del T-Board físico   wiringPi BCM
GPIO17             Pin 11   0        17
GPIO18             Pin 12   1        18
GPIO27             Pin 13   2        27
================== ======== ======== ===

.. image:: ../img/rgb_led_schematic.png

Procedimientos Experimentales
---------------------------------

**Paso 1:** Construye el circuito.

.. image:: ../img/image61.png

**Paso 2:** Abre el archivo de código.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python

**Paso 3:** Ejecuta.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.2_rgbLed.py

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

**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 a color table in Hexadecimal
    COLOR = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
    # Set pins' channels with dictionary
    pins = {'Red':17, 'Green':18, 'Blue':27}

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)
        # Set all LedPin's mode to output and initial level to High(3.3v)
        for i in pins:
            GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH)

        p_R = GPIO.PWM(pins['Red'], 2000)
        p_G = GPIO.PWM(pins['Green'], 2000)
        p_B = GPIO.PWM(pins['Blue'], 2000)
        p_R.start(0)
        p_G.start(0)
        p_B.start(0)

    # Define a MAP function for mapping values.  Like from 0~255 to 0~100
    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    # Define a function to set up colors
    def setColor(color):
    # configures the three LEDs' luminance with the inputted color value.
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0

        # Map color value from 0~255 to 0~100
        R_val = MAP(R_val, 0, 255, 0, 100)
        G_val = MAP(G_val, 0, 255, 0, 100)
        B_val = MAP(B_val, 0, 255, 0, 100)
        
        # Change the colors
        p_R.ChangeDutyCycle(R_val)
        p_G.ChangeDutyCycle(G_val)
        p_B.ChangeDutyCycle(B_val)

        print ("color_msg: R_val = %s,  G_val = %s, B_val = %s"%(R_val, G_val, B_val))  

    def main():
        while True:
            for color in COLOR:
                setColor(color)# change the color of the RGB LED
                time.sleep(0.5)

    def destroy():
        # Stop all pwm channel
        p_R.stop()
        p_G.stop()
        p_B.stop()
        # Release resource
        GPIO.cleanup()

    if __name__ == '__main__':
        setup()
        try:
            main()
        except KeyboardInterrupt:
            destroy()
**Explicación del Código**

.. code-block:: python

    p_R = GPIO.PWM(pins['Red'], 2000)
    p_G = GPIO.PWM(pins['Green'], 2000)
    p_B = GPIO.PWM(pins['Blue'], 2000)

    p_R.start(0)
    p_G.start(0)
    p_B.start(0)

Llama a la función ``GPIO.PWM()`` para definir los pines Rojo, Verde y Azul como 
pines PWM y establece la frecuencia de los pines PWM en 2000Hz. Luego, utiliza la 
función ``start()`` para establecer el ciclo de trabajo inicial en cero.

.. code-block:: python

    def MAP(x, in_min, in_max, out_min, out_max):
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

Define una función MAP para mapear valores. Por ejemplo, x=50, in_min=0, in_max=255, 
out_min=0, out_max=100. Después del mapeo con la función MAP, devuelve 
``(50-0) * (100-0)/(255-0) + 0=19.6``, lo que significa que 50 en el rango 0-255 equivale 
a 19.6 en el rango 0-100.

.. code-block:: python

    def setColor(color):
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0

Configura la luminancia de los tres LEDs con el valor de color ingresado, asigna los 
primeros dos valores del hexadecimal a R_val, los dos del medio a G_val y los últimos 
dos valores a B_val. Por ejemplo, si color=0xFF00FF, R_val=（0xFF00FF & 0xFF0000）>> 16 = 0xFF, 
G_val = 0x00, B_val=0xFF.

.. code-block:: python

    R_val = MAP(R_val, 0, 255, 0, 100)
    G_val = MAP(G_val, 0, 255, 0, 100)
    B_val = MAP(B_val, 0, 255, 0, 100)

Utiliza la función MAP para mapear los valores de R, G, B en el rango 0~255 al rango del ciclo 
de trabajo PWM 0-100.

.. code-block:: python

    p_R.ChangeDutyCycle(R_val) 
    p_G.ChangeDutyCycle(G_val)
    p_B.ChangeDutyCycle(B_val)

Asigna el valor del ciclo de trabajo mapeado al canal PWM correspondiente para cambiar la luminancia.

.. code-block:: python

    for color in COLOR:
        setColor(color)
        time.sleep(0.5)

Asigna cada elemento de la lista COLOR al color respectivamente y cambia el color del LED RGB 
mediante la función ``setColor()``.

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

.. image:: ../img/image62.jpeg
