.. nota::

    Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

    **Perché unirti a noi?**

    - **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra comunità e del nostro team.
    - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze.
    - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.
    - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni festive e concorsi**: Partecipa a concorsi e promozioni durante le festività.

    👉 Sei pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!

.. _1.1.2_py:

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

Introduzione
--------------

In questo progetto, controlleremo un LED RGB per farlo lampeggiare in vari colori.

Componenti Necessari
------------------------------

In questo progetto, abbiamo bisogno dei seguenti componenti. 

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

È sicuramente comodo acquistare un kit completo, ecco il link:

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

    *   - Nome	
        - ARTICOLI IN QUESTO KIT
        - LINK
    *   - Kit Raphael
        - 337
        - |link_Raphael_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK PER L'ACQUISTO

    *   - :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|

Schema Elettrico
-----------------------

Collega i pin di R, G e B a una resistenza limitatrice di corrente e poi collegali 
rispettivamente ai GPIO17, GPIO18 e GPIO27. Il pin più lungo (GND) del LED si collega 
alla GND del Raspberry Pi. Quando i tre pin ricevono valori PWM diversi, il LED RGB 
mostrerà colori differenti.

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

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

Procedure Sperimentali
----------------------------

**Passo 1:** Costruisci il circuito.

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

**Passo 2:** Apri il file del codice.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python

**Passo 3:** Esegui il codice.

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 1.1.2_rgbLed.py

Dopo l'esecuzione del codice, vedrai che il LED RGB mostra rosso, verde, blu, giallo, rosa e ciano.

**Codice**

.. note::

    Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Ma prima devi accedere al percorso del codice come ``raphael-kit/python``. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l'effetto.

.. raw:: html

    <run></run>

.. code-block:: python

    import RPi.GPIO as GPIO
    import time
    # Imposta una tabella dei colori in esadecimale
    COLOR = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
    # Imposta i canali dei pin con un dizionario
    pins = {'Red':17, 'Green':18, 'Blue':27}

    def setup():
        global p_R, p_G, p_B
        GPIO.setmode(GPIO.BCM)
        # Imposta tutti i pin del LED come output e il livello iniziale su High (3,3 V)
        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)

    # Definisce una funzione MAP per mappare i valori. Ad esempio da 0~255 a 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

    # Definisce una funzione per impostare i colori
    def setColor(color):
    # Configura la luminanza dei tre LED con il valore di colore inserito.
        R_val = (color & 0xFF0000) >> 16
        G_val = (color & 0x00FF00) >> 8
        B_val = (color & 0x0000FF) >> 0

        # Mappa il valore del colore da 0~255 a 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)
        
        # Cambia i colori
        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)# Cambia il colore del LED RGB
                time.sleep(0.5)

    def destroy():
        # Ferma tutti i canali PWM
        p_R.stop()
        p_G.stop()
        p_B.stop()
        # Libera le risorse
        GPIO.cleanup()

    if __name__ == '__main__':
        setup()
        try:
            main()
        except KeyboardInterrupt:
            destroy()

**Spiegazione del Codice**

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

Chiama la funzione ``GPIO.PWM()`` per definire Rosso, Verde e Blu come pin PWM e 
imposta la frequenza dei pin PWM su 2000 Hz, poi usa la funzione ``Start()`` per 
impostare il duty cycle iniziale a zero.

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

Definisce una funzione MAP per mappare i valori. Ad esempio, x=50, in_min=0, in_max=255, 
out_min=0, out_max=100. Dopo la mappatura della funzione MAP, restituisce 
``(50-0) \* (100-0)/(255-0) +0=19.6``, il che significa che 50 in un intervallo 0-255 
equivale a 19,6 in un intervallo 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 luminanza dei tre LED con il valore di colore inserito, assegnando i primi 
due valori esadecimali a R_val, i due valori centrali a G_val e gli ultimi due valori a 
B_val. Ad esempio, se 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)

Usa la funzione MAP per mappare il valore R,G,B tra 0~255 nell'intervallo del duty cycle PWM 0-100.

.. code-block:: python

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

Assegna il valore del duty cycle mappato al canale PWM corrispondente per cambiare la luminanza.

.. code-block:: python

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

Assegna ogni elemento della lista COLOR al colore rispettivo e cambia il colore del LED 
RGB tramite la funzione ``setColor()``.

Immagine del Fenomeno
------------------------

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

