LED WS2812 e Arduino – Ora giochiamo con i colori

WS2812 HSV

Abbiamo conosciuto i LED WS2812, sappiamo come farli funzionare con Arduino, e come testarli. Oggi impariamo a dosarne i colori.

Articoli precedenti:

  1. LED WS2812 per Arduino – Cosa sono e come si usano
  2. LED WS2812 – Attività di configurazone con Arduino

Nella scorsa puntata abbiamo visto come costruire il nostro testbed, utilizzando un Arduino (anche Nano), una breadboard e pochi altri componenti elettronici. Abbiamo imparato a controllare il tipo di canale per la configurazione RGB, ad indirizzare i LED sulla striscia in base alla loro posizione, a definire il colore per ciascuno di essi, a far “correre” le luci e a illuminare tutti i LED di una striscia di un unico colore, come se fosse un solo LED.

Oggi impareremo invece come creare interessanti sfumature di colore sulla nostra striscia LED, ed apprenderemo i meccanismi tecnici che si nascondono dietro alla descrizione del colore.

Creare sfumature di colore

L’ultimo programma di esempio che abbiamo trattato consentiva di accendere l’intera striscia di un colore con un solo comando.

Ma noi vogliamo qualcosa di più… Sarebbe bello, ad esempio, definire un colore iniziale ed uno finale, e lasciare ad Arduino l’onere di calcolare in che modo modificare i valori RGB per ciascun pixel della nostra striscia, in modo che la transizione tra i colori avvenga in modo seamless. Ancora meglio sarebbe se riuscissimo, ad esempio, a creare una serie di transizioni lungo la striscia, definendo i colori per i quali volessimo passare.

Nel prossimo programma vedremo come operare al riguardo.

Nello scorso programma abbiamo utilizzato la funzione fill_solid() per “riempire” ciascun LED con il medesimo colore. Stavolta invece utilizzeremo la funzione fill_gradient() per “riempire” i LED dei colori necessari per creare una transizione di colore.

La funzione fill_gradient() infatti richiede come parametri il nostro array di LED, il numero dei LED contenuti nell’array e una serie di oggetti CRGB che identificano il colore di partenza e di arrivo (primo esempio) o i colori sii quali vogliamo far ciclare la nostra striscia (i colori dell’arcobaleno, secondo esempio).

WS2812 fill_gradient()
Primo esempio: gradiente tra giallo e magenta
WS2812 fill_gradient() Arduino
Secondo esempio: gradiente sui colori dell’arcobaleno

La potenza della funzione fill_gradient() è definita dalla capacità di calcolare, in modo del tuttto automatico e nascosto, come far variare il colore di ciascun LED della striscia in modo apparentemente privo di soluzione di continuità. Basta solo definire i colori attraverso i quali vogliamo creare la variazione. Per aggiungere nuovi LED alla nostra composizione, sarà sufficiente semplicemente modificare la costante NUM_LEDS.

La tabella dei colori della libreria FastLED è disponibile al link seguente, assieme ad un approfondimento delle tecniche di miscelazione del colore.

Ma esiste un modo ancora più semplice per creare un arcobaleno di colori: occorre utilizzare la funzione fill_rainbow() come mostrato nel prossimo programma.

La funzione fill_rainbow() richiede come parametri il nostro array di LED, il numero dei LED coinvolti, e due valori: zero (il valore di partenza) e una funzione delta_led che rappresenta il numero di step da creare tra zero e 255 dato il numero di LED che abbiamo a disposizione. La transizione tra i colori avviene in questo caso in modo molto più fluido: utilizziamo infatti una rappresentazione dello spazio dei colori diverso da RGB: il sistema HSV (tinta, saturazione, valore), di cui parleremo nei prossimi paragrafi.

Arduino WS2812

Definizione del colore: metodo RGB

Chi ha analizzato i precedenti programmi con attenzione, prima di testarli, avrà sicuramente notato la presenza di un oggetto CRGB (color RGB, probabilmente). CRGB rappresenta un oggetto “colore” in termini delle proprie componenti (quantità di rosso, verde e blu), con un valore di 1 byte (0-255) per ciascuno dei tre colori fondamentali. La nostra striscia LED, quindi, è rappresentata da un array composto da terne di valori RGB. Il cosiddetto “spazio di colore RGB” segue le complicate leggi dell’ottica, in cui il colore finale è dato dall’incontro e dall’interazione tra le onde elettromagnetiche di ciascun componente.

Creare una palette di colori nello spazio RGB non è semplice: sarà necessario variare più valori contenporaneamente, spesso in senso opposto, facendone crescere uno mentre l’altro decresce. Chi ha avuto qualche esperienza con la programmazione di LED RGB singoli con Arduino sa bene a cosa mi riferisco: è complicato trovare esattamente il colore richiesto. L’indirizzamento RGB è quindi valido quando occorra definire colori “solidi”, o transizioni morbide gestite dalla libreria. O quando sia necessario inviare un colore primario al LED.

RIcordiamo infine che esiste un codice dei colori riconosciuto dal W3C. La libreria FastLED ha definito una serie di costanti come oggetti CRGB, dotati dei valori standard: si tratta dei valori (CRGB::Magenta, CRGB::Yellow, CRGB::Green, CRGB::Blue) che abbiamo utilizzato nei nostri programmi di esempio per il codice fill_gradient().

Definizione del colore: metodo HSV

HSV è l’acronimo di “Hue, Saturation, Value”, ed utilizza un sistema diverso per rappresentare lo spazio di colore dei nostri LED.

In pratica il valore di tinta (hue) va da 0 a 359, ed il colore viaggia lungo lo spettro visivo, per poi ricongiungersi (il violetto vira verso il rosso ed il ciclo ricomincia). Parliamo di “angolo della ruota del colore”, da qui il valore 0-359. Nell’implementazione FastLED il campo Hue è definito attraverso un intero da 8 bit, quindi i valori 0-359 vengono mappati automaticamente su 0-255.

Il valore di saturazione (saturation) varia tra 0 e 100, e definisce la “quantità di colore”: una saturazione a 0 in genere indica un “colore” bianco. Rappresenta quanto il colore sia “ricco” o “pallido”. Viene detto anche crominanza,

Il livello definito come valore (value) infine definisce quanto luminoso sia il colore. Viene detto anche luminanza o luminosità. Nel bianco e nero rappresenta la scala dei grigi, mentre su un determinato colore rappresenta la sfumatura tra masima luminosità del colore e nero.

La definizione dello spazio dei colori con il metodo HSV consente una variazione di colore e tinta molto più graduale e naturale.

Poiché una immagine vale più di 1000 parole, a questo link potrete trovare una applicazione Web che consente di determinare manualmente i valori di tinta, saturazione e luminosità spostandosi con il mouse, per avere il classico “look and feel” caratteristico di questo sistema.

WS2812 HSV

Riflessioni

Nella puntata di oggi abbiamo iniziato a prendere la mano con le funzioni avanzate della libreria FastLED con le striscie WS2812, relative ai colori. Per poterle sfruttare appieno, abbiamo anche definito le modalità di descrizione dello spazio del colore. Nella prossima puntata prenderemo in esame le tavolozze di colore: come crearle, come utilizzarle e, soprattutto, come mescolarle.

Troverete i file sorgente con gli esempi proposti su GitHub come al solito.

A risentirci tra sette giorni!

Link utili

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.