.. note::

    Ciao, benvenuto nella community SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Esplora più a fondo Raspberry Pi, Arduino ed ESP32 con altri appassionati.

    **Perché unirti?**

    - **Supporto Esperti**: 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 abilità.
    - **Anteprime Esclusive**: Ottieni l'accesso anticipato agli annunci di nuovi prodotti e anticipazioni.
    - **Sconti Speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni e Giveaway Festivi**: Partecipa a concorsi e promozioni per le festività.

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

.. _1.1.2_c:

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

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

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

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

In questo progetto, ci servono i seguenti componenti. 

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

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

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

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

Puoi anche acquistarli separatamente dai link sottostanti.

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

    *   - INTRODUZIONE AI COMPONENTI
        - LINK D'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 Circuitale
-----------------------

Dopo aver collegato i pin di R, G e B a una resistenza limitatrice di corrente, 
collegali rispettivamente ai GPIO17, GPIO18 e GPIO27. Il pin più lungo (GND) del 
LED si collega al GND del Raspberry Pi. Quando ai tre pin vengono assegnati diversi 
valori PWM, il LED RGB visualizzerà colori diversi.

============ ======== ======== ===
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:** Vai nella cartella del codice.

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/c/1.1.2/

**Passo 3:** Compila il codice.

.. raw:: html

   <run></run>

.. code-block::

    gcc 1.1.2_rgbLed.c -lwiringPi

.. note::

    Quando il comando ``gcc`` viene eseguito, se non viene utilizzato ``-o``, allora il file eseguibile sarà denominato ``a.out``.

**Passo 4:** Esegui il file eseguibile.

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

Dopo aver eseguito il codice, vedrai che l'RGB mostra rosso, verde, blu, giallo, rosa e ciano.

.. note::

   Se non funziona dopo l'esecuzione, o compare un errore: \"wiringPi.h: Nessun file o directory\", fai riferimento a :ref:`install_wiringpi`.

**Codice**

.. code-block:: c

    #include <wiringPi.h>
    #include <softPwm.h>
    #include <stdio.h>
    #define uchar unsigned char
    #define LedPinRed    0
    #define LedPinGreen  1
    #define LedPinBlue   2

    void ledInit(void){
        softPwmCreate(LedPinRed,  0, 100);
        softPwmCreate(LedPinGreen,0, 100);
        softPwmCreate(LedPinBlue, 0, 100);
    }

    void ledColorSet(uchar r_val, uchar g_val, uchar b_val){
        softPwmWrite(LedPinRed,   r_val);
        softPwmWrite(LedPinGreen, g_val);
        softPwmWrite(LedPinBlue,  b_val);
    }

    int main(void){

        if(wiringPiSetup() == -1){ //se l'inizializzazione di wiring fallisce, stampa il messaggio sullo schermo
            printf("setup wiringPi failed !");
            return 1;
        }

        ledInit();
        while(1){
            printf("Red\n");
            ledColorSet(0xff,0x00,0x00);   //rosso     
            delay(500);
            printf("Green\n");
            ledColorSet(0x00,0xff,0x00);   //verde
            delay(500);
            printf("Blue\n");
            ledColorSet(0x00,0x00,0xff);   //blu
            delay(500);
            printf("Yellow\n");
            ledColorSet(0xff,0xff,0x00);   //giallo
            delay(500);
            printf("Purple\n");
            ledColorSet(0xff,0x00,0xff);   //viola
            delay(500);
            printf("Cyan\n");
            ledColorSet(0xc0,0xff,0x3e);   //ciano
            delay(500);
        }
        return 0;
    }

**Spiegazione del Codice**

.. code-block:: c

    #include <softPwm.h>

Libreria utilizzata per realizzare la funzione PWM software.

.. code-block:: c

    void ledInit(void){
        softPwmCreate(LedPinRed,  0, 100);
        softPwmCreate(LedPinGreen,0, 100);
        softPwmCreate(LedPinBlue, 0, 100);
    }

La funzione serve per creare un pin PWM software e impostare il suo periodo tra 0x100us-100x100us.

Il prototipo della funzione softPwmCreate(LedPinRed, 0, 100) è il seguente:

.. code-block:: c

    int softPwmCreate(int pin,int initialValue,int pwmRange);

* **Parametro pin:** Qualsiasi pin GPIO del Raspberry Pi può essere impostato come pin PWM.
* **Parametro initialValue:** La larghezza dell'impulso iniziale è il valore di initialValue moltiplicato per 100us.
* **Parametro pwmRange:** Il periodo di PWM è pwmRange moltiplicato per 100us.

.. code-block:: c

    void ledColorSet(uchar r_val, uchar g_val, uchar b_val){
        softPwmWrite(LedPinRed,   r_val);
        softPwmWrite(LedPinGreen, g_val);
        softPwmWrite(LedPinBlue,  b_val);
    }

Questa funzione serve per impostare i colori del LED. Utilizzando RGB, 
il parametro formale **r_val** rappresenta la luminosità del colore rosso,
 **g_val** del verde, **b_val** del blu.

Il prototipo della funzione softPwmWrite(LedPinBlue, b_val) è il seguente：

.. code-block:: c

    void softPwmWrite (int pin, int value) ;

* **Parametro pin:** Qualsiasi pin GPIO del Raspberry Pi può essere impostato come pin PWM.
* **Parametro Value:** La larghezza dell'impulso di PWM è il valore moltiplicato per 100us. Nota che il valore può essere solo inferiore a pwmRange definito in precedenza, se è maggiore di pwmRange, al valore verrà assegnato un valore fisso, pwmRange.

.. code-block:: c

    ledColorSet(0xff,0x00,0x00);

Richiama la funzione definita in precedenza. Scrivi 0xff in LedPinRed e 0x00 in 
LedPinGreen e LedPinBlue. Solo il LED rosso si accenderà dopo l'esecuzione di 
questo codice. Se desideri accendere i LED in altri colori, basta modificare i parametri.

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

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

