In questa lezione descriviamo come pilotare un led RGB con la libreria GPIOZero.
Un led RGB (Red Green Blue) è composto da 3 led distinti racchiusi in un unico contenitore.
Come si vede in figura possiamo considerarlo come l'unione di un led rosso, di un led verde e di un led blu. Tutti i led hanno un piedino in comune quindi il led RGB ha 4 piedini distinti.
Anodo e Catodo Comune
In funzione di quale pin hanno in comune i 3 led sono possibili due configurazioni distinte.
Se i led rosso, verde e blu, hanno in comune il piedino meno (-) tale configurazione prende il nome di catodo comune. Al contrario, se il piedino in comune è il più (+), la configurazione viene detta ad anodo comune.
Pertanto nella configurazione ad anodo comune i pin del led RGB assumono il significato riportato a seguire.
- R: catodo del led rosso;
- G: catodo del led verde;
- B: catodo del led blue;
- +: anodo comune a tutti e tre i led.
Viceversa, nella configurazione a catodo comune, i pin del led RGB sono da considerarsi come subito sotto.
- R: anodo del led rosso;
- G: anodo del led verde;
- B: anodo del led blue;
- -: catodo comune a tutti e tre i led.
Resistenza limitatrice
Il led RGB è composto da tre led distinti quindi saranno necessarie tre resistenze limitatrici, una per ciascun led.
I led hanno tensioni di soglia differenti, le resistenze vanno dimensionate in modo opportuno usando la formula vista nella lezione Controllo led con GPIOzero - parte 1.
Nel nostro esempio, considerando che i GPIO del Rapsberry Pi sono a 3.3V, possiamo usare una resistenza da 100 Ohm per il led rosso, da 22 Ohm per il led verde e da 10 Ohm per il led blue.
La classe RGBLED
Il LED RGB (Red Green Blue Light Emitting Diode), all’interno della libreria GPIOZero, appartiene alla classe dei dispositivi di output (DigitalOutputDevice) e viene modellato da una semplice interfaccia intuitiva.
Il costruttore della classe ha la sintassi che potete vedere a seguire.
RGBLED(red, green, blue,
active_high=True,
initial_value=(0, 0, 0),
pwm=True,
pin_factory=None)
- red: parametro obbligatorio, tipo int. Il numero GPIO collegato alla componente rossa del led;
- green: parametro obbligatorio, tipo int. Il numero GPIO collegato alla componente verde del led;
- blue: parametro obbligatorio, tipo int. Il numero GPIO collegato alla componente blue del led;
- active_high: parametro facoltativo, tipo bool, default True per led rgb a catodo comune, False per led ad anodo comune;
- initial_value: parametro facoltativo, tipo tupla, default nero. Il colore iniziale all'accensione del led;
- pwm: parametro facoltativo tipo bool, default True. Imposta il led a luminosità variabile;
- pin_factory: solo per uso avanzato. Permette di specificare un GPIO pin factory differente rispetto quello fornito da GPIOZero.
Schema di collegamento
Prima di passare al codice python è necessario assemblare il circuito elettrico che collega il led RGB al Raspberry Pi. La figura visualizza i collegamenti necessari per pilotare il led con il Raspberry Pi.
Vediamo ora un primo esempio di codice che fa lampeggiare il led usando i suoi tre colori principali.
from gpiozero import RGBLED
from time import sleep
RED = (1, 0 ,0)
GREEN = (0, 1, 0)
BLUE = (0, 0, 1)
rgb_led = RGBLED(13, 19, 26, pwm = False)
while True:
rgb_led.color = RED
sleep(1)
rgb_led.color = GREEN
sleep(1)
rgb_led.color = BLUE
sleep(1)
Abbiamo definito tre tupe che rappresentano i tre colori RED, GREEN e BLUE.
L'oggetto rgb_led è creato istanziando la classe RGBLED a cui abbiamo passato il numero di GPIO in numerazione BCM relativo ai rispettivi pin del led.
Da notare che abbiamo impostato il parametro pwm a False perché in questo esempio non vogliamo ottenere colori come combinazione dei tre colori principali.
Definire i colori come una tupla di tre numeri è abbastanza scomodo e laborioso. Per semplificare le cose ci viene in aiuto la libreria colorzero.
Installiamola con il seguente comando:
pip install colorzero
Questa libreria ci permette di specificare il colore di accensione del led usando alcuni nomi convenzionali.
Per esempio il colore rosso viene definito come Color('red') mentre il colore giallo viene definito come Color('yellow').
La lista completa dei colori è disponibile qui.
Vediamo ora un codice simile al precedente che accende il led con vari colori utilizzando la libreria colorzero.
from gpiozero import RGBLED
from colorzero import Color
from time import sleep
rgb_led = RGBLED(13, 19, 26, pwm = True)
while True:
rgb_led.value = Color('red')
sleep(1)
rgb_led.color = Color('green')
sleep(1)
rgb_led.color = Color('blue')
sleep(1)
rgb_led.color = Color('yellow')
sleep(1)
rgb_led.color = Color('magenta')
sleep(1)
rgb_led.color = Color('aqua')
sleep(1)
Come si può notare in questo caso il parametro pwm del costruttore è impostato a True. È necessario poiché vogliamo accendere il led con colori che sono ottenuti dalla combinazione dei 3 colori principali.
Nel prossimo esempio vediamo come fare il blink di un led RGB.
from gpiozero import RGBLED
from colorzero import Color
from signal import pause
rgb_led = RGBLED(13, 19, 26, pwm = True)
rgb_led.blink()
pause()
Come si può notare anche nel caso del led RGB usiamo il metodo blink() che dimostra ancora una volta la chiarezza e la forte intuitività della libreria GPIOZero.
Vediamo ora come fare il blink tra due colori differenti.
from gpiozero import RGBLED
from colorzero import Color
from signal import pause
rgb_led = RGBLED(13, 19, 26, pwm = True)
rgb_led.blink(on_color=Color('red'), off_color=Color('green'))
pause()
Abbiamo adoperato sempre il metodo blink() ma passando due parametri aggiuntivi per specificare il primo colore (on_color) e il secondo colore (off_color) del "lampeggiamento".
Ancora più interessante è l'uso del metodo pulse() che ci permette di creare un "lampeggiamento" tra due colori in modo continuo.
In altre parole il led non sara acceso sul rosso e poi sul verde, come nel caso del blink, ma varierà gradualmente assumendo tutti i colori intermedi tra il rosso e il verde.
from gpiozero import RGBLED
from colorzero import Color
from signal import pause
rgb_led = RGBLED(13, 19, 26, pwm = True)
rgb_led.pulse(on_color=Color('red'), off_color=Color('green'))
pause()
Conclusioni
In questa lezione abbiamo visto, tramite degli esempi in python, che anche un semplice led RGB ci offre molte possibilità. Siamo in grado di ottenere facilmente una serie di effetti luminosi. Chiaramente otterremo risultati visivi ancora più incisivi adoperando diversi led RGB che agiscono assieme.