.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati. **Perché Unirti a Noi?** - **Supporto Esperto**: Risolvi problematiche post-vendita e sfide tecniche con l'aiuto della nostra community e del nostro team. - **Impara & Condividi**: Scambia suggerimenti e tutorial per migliorare le tue abilità. - **Anteprime Esclusive**: Accedi in anteprima agli annunci dei nuovi prodotti. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri ultimi prodotti. - **Promozioni e Giveaway Festivi**: Partecipa ai giveaway e alle promozioni delle festività. 👉 Pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti subito! .. _1.1.2_rgb: 1.1.2 LED RGB ==================== Introduzione -------------- In questa lezione impareremo a utilizzare un LED RGB per creare una serie di colori lampeggianti. Componenti -------------- .. image:: img/list_rgb_led.png :align: center Principio -------------- **PWM** La modulazione della larghezza dell'impulso, o PWM, è una tecnica per ottenere risultati analogici con mezzi digitali. Il controllo digitale crea un'onda quadra, un segnale che passa da acceso a spento. Variando la percentuale di tempo in cui il segnale è attivo rispetto a quello in cui è inattivo, si simula una tensione tra 0 e 5 Volt. Questo permette, ad esempio, di controllare la luminosità di un LED. **Ciclo di lavoro** Il ciclo di lavoro indica la percentuale di tempo in cui un segnale è attivo in un dato periodo. La formula per calcolarlo è: .. image:: img/image56.png :width: 1.16667in :height: 0.36458in :align: center Dove **D** è il ciclo di lavoro, **T** è il tempo in cui il segnale è attivo, e **P** è il periodo totale del segnale. Un ciclo del 60% significa che il segnale è acceso il 60% del tempo e spento il 40%. .. image:: img/image57.jpeg :width: 4.325in :height: 5.49167in :align: center **LED RGB** .. image:: img/rgb_led_sch.png :width: 500 :align: center Le tre componenti di base dell’RGB LED (rosso, verde, blu) possono combinarsi per creare vari colori in base alla luminosità di ogni colore. La luminosità può essere controllata con il PWM. Raspberry Pi ha un solo canale per il PWM hardware, ma per controllare un LED RGB sono necessari tre canali. La libreria softPwm permette di simulare PWM per ottenere più uscite PWM in grado di controllare i LED RGB e creare vari colori. Schema del circuito ----------------------- Collega i pin R, G e B tramite un resistore limitatore di corrente ai pin GPIO17, GPIO18 e GPIO27. Il pin più lungo del LED (GND) si collega al GND del Raspberry Pi. Variando i valori PWM sui tre pin, il LED RGB visualizzerà diversi colori. ============ ======== ======== === 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 Procedura Sperimentale ---------------------------- **Passo 1:** Montare il circuito. .. image:: img/image61.png :width: 6.59097in :height: 4.29722in Per Utenti del Linguaggio C ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Passo 2:** Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.1.2/ **Passo 3:** Compila il codice. .. raw:: html .. code-block:: gcc 1.1.2_rgbLed.c -lwiringPi .. note:: Quando esegui il comando "gcc", se non si specifica "-o", il file eseguibile generato avrà il nome predefinito "a.out". **Passo 4:** Esegui il file eseguibile. .. raw:: html .. code-block:: sudo ./a.out Dopo l’esecuzione del codice, il LED RGB mostrerà una sequenza di colori: rosso, verde, blu, giallo, rosa e ciano. .. note:: Se il programma non funziona o compare l’errore "wiringPi.h: No such file or directory", consulta la sezione :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #include #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){ //when initialize wiring failed, printf messageto screen printf("setup wiringPi failed !"); return 1; } ledInit(); while(1){ printf("Red\n"); ledColorSet(0xff,0x00,0x00); //red delay(500); printf("Green\n"); ledColorSet(0x00,0xff,0x00); //green delay(500); printf("Blue\n"); ledColorSet(0x00,0x00,0xff); //blue delay(500); printf("Yellow\n"); ledColorSet(0xff,0xff,0x00); //yellow delay(500); printf("Purple\n"); ledColorSet(0xff,0x00,0xff); //purple delay(500); printf("Cyan\n"); ledColorSet(0xc0,0xff,0x3e); //cyan delay(500); } return 0; } **Spiegazione del Codice** .. code-block:: c #include Libreria utilizzata per realizzare la funzione PWM tramite software. .. code-block:: c void ledInit(void){ softPwmCreate(LedPinRed, 0, 100); softPwmCreate(LedPinGreen,0, 100); softPwmCreate(LedPinBlue, 0, 100); } Questa funzione serve a creare un pin PWM con il software, impostando il periodo tra 0x100us e 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 iniziale dell’impulso è initialValue moltiplicato per 100us. * **Parametro pwmRange:** Il periodo del 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 imposta i colori del LED RGB. Il parametro **r_val** rappresenta la luminosità del LED rosso, **g_val** quella del verde e **b_val** quella 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 del PWM è pari a value moltiplicato per 100us. Nota che il valore deve essere inferiore a pwmRange definito in precedenza; se supera pwmRange, value sarà impostato su pwmRange. .. code-block:: c ledColorSet(0xff,0x00,0x00); Richiama la funzione definita sopra. Imposta LedPinRed su 0xff e LedPinGreen e LedPinBlue su 0x00. Solo il LED rosso si accende. Per accendere i LED di altri colori, basta modificare i parametri. Per gli utenti del linguaggio Python ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ **Passaggio 2:** Apri il file di codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python **Passaggio 3:** Esegui. .. raw:: html .. code-block:: sudo python3 1.1.2_rgbLed.py Dopo l'esecuzione del codice, vedrai che il LED RGB visualizza i colori rosso, verde, blu, giallo, rosa e ciano. **Codice** .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Prima di farlo, assicurati di trovarti nel percorso del codice sorgente, ad esempio ``davinci-kit-for-raspberry-pi/python``. .. raw:: html .. code-block:: python import RPi.GPIO as GPIO import time # Imposta una tabella colori in esadecimale COLOR = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF] # Assegna i canali dei pin tramite un dizionario pins = {'Red':17, 'Green':18, 'Blue':27} def setup(): global p_R, p_G, p_B # Configura i pin GPIO in modalità BCM GPIO.setmode(GPIO.BCM) # Imposta tutti i LedPin in modalità output e livello iniziale alto (3.3V) for i in pins: GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.HIGH) # Imposta tutti i LED come canali PWM con frequenza a 2KHz p_R = GPIO.PWM(pins['Red'], 2000) p_G = GPIO.PWM(pins['Green'], 2000) p_B = GPIO.PWM(pins['Blue'], 2000) # Inizia con valore 0 su tutti i LED p_R.start(0) p_G.start(0) p_B.start(0) # Definisce una funzione MAP per mappare i valori, 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 # Il colore in ingresso deve essere esadecimale # con valore rosso, blu, verde. def setColor(color): # Configura la luminosità dei tre LED in base al colore fornito R_val = (color & 0xFF0000) >> 16 G_val = (color & 0x00FF00) >> 8 B_val = (color & 0x0000FF) >> 0 # Assegna le prime due cifre esadecimali a R, le centrali a G e le ultime due a B. # 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: # Assegna ogni colore della lista COLOR e cambia il colore del LED RGB tramite setColor() setColor(color) # Cambia il colore del LED RGB time.sleep(0.5) # Imposta un ritardo di 0.5s dopo ogni cambio colore. Modifica questo parametro per regolare la velocità di cambio colore. def destroy(): # Ferma tutti i canali PWM p_R.stop() p_G.stop() p_B.stop() # Libera le risorse GPIO.cleanup() # Se si esegue questo script direttamente: if __name__ == '__main__': setup() try: main() # Quando si preme 'Ctrl+C', viene eseguita la funzione # destroy(). 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 i pin Red, Green e Blue come pin PWM e imposta la frequenza di ciascuno a 2000Hz, quindi utilizza la funzione start() per inizializzare il duty cycle 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 Definisci 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, restituirà (50-0) \* (100-0)/(255-0) + 0 = 19.6, che significa che 50 nel range 0-255 equivale a 19.6 nel range 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 luminosità dei tre LED con il valore colore in ingresso: assegna le prime due cifre dell’esadecimale a R_val, le due centrali a G_val e le ultime due 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 i valori R, G e B da 0-255 al range 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 di duty cycle mappato al rispettivo canale PWM per regolare la luminosità. .. code-block:: python for color in COLOR: setColor(color) time.sleep(0.5) Assegna ogni elemento della lista COLOR al valore color e cambia il colore del LED RGB utilizzando la funzione setColor(). Immagine del Fenomeno ------------------------ .. image:: img/image62.jpeg