Dopo una breve introduzione sulla storia dei LED, ed una presentazione dei LED “intelligenti” WS2812, inizieremo oggi a lavorare con Arduino.
Articoli precedenti:
LED WS2812 per Arduino – Cosa sono e come si usano
Questi articoli si basano sull’eccellente lavoro compiuto da Scott Marley.
Nell’ultimo articolo ci siamo lasciati dopo aver presentato le striscie LED “intelligenti”, così chiamate perché vendute (appunto) in striscie in cui ogni LED è indirizzabile attraverso un microcircuito, come se si trattasse si accedere ad un vettore. Vedremo presto che l’analogia non è affatto casuale.
Nello scorso articolo abbiamo anche utilizzato un circuito di collegamento, che riportiamo come immagine di apertura e sul quale ci baseremo per i nostri esperimenti.
Tutto ciò che ci occorre è rappresentato da un Arduino, uno o più LED WS2812, un resistore da 330 ohm, un condensatore elettrolitico da 1000uF/16V ed una sorgente di alimentazione esterna. A onor del vero, per pochi LED sarebbe sufficiente anche il nsotro Arduino, a patto di tenere bassa la luminosità dei LED e di evitare di “sparare” luce bianca, ma se ci si abitua ad utilizzare un alimentatore da 5V – 1.5A esterno al quale collegare sia Arduino che la striscia di Led, si evitano rischi inutili. E se non avete un alimentatore adeguato, tenete d’occhio il nostro canale YouTube: presenteremo presto un tutorial su come progettarne e costruirne uno.
Collegamenti
I collegamenti sono semplicissimi: occorre portare i cavi dei 5V e GND ai relativi pin di Arduino e ai collegamenti dell’alimentazione della striscia LED, come descritto. In parallelo tra i 5V ed il GND porremo un condensatore elettrolitico che agirà da filtro contro il rumore e da stabilizzatore di eventuali picchi di tensione. Su uo dei pin digitali PWM (diciamo il numero 6…) porremo il resistore da 330 ohm che invierà il segnale alla striscia LED sull’apposito canale. Sulla striscia è presente anche un indicatore relativo al verso di trasmissione del segnale, tipicamente una freccina. Occorre fare attenzione a collegare il nostro connettore come se il segnale percorresse la striscia secondo l’orientamento della freccina.
Il primo programma
Per prima cosa occorre importare la libreria FastLED di Daniel Garcia. Io ho caricato la versione 3.4.0.
Il codice risulta estremamente semplice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Programma 01 - Configurazione RGB #include <FastLED.h> #define NUM_LEDS 14 #define LED_PIN 6 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(40); // up to 255 } void loop() { leds[0] = CRGB::Red; leds[1] = CRGB::Green; leds[2] = CRGB::Blue; FastLED.show(); } |
Dopo l’inclusone della libreria, definiamo due costanti: NUM_LEDS (che contiene il numreo di LED che vogliamo collegare assieme) e LED_PIN, che rappresenta il pin di Arduino che invierà il segnale per il pilotaggio.
Creiamo quindi un array di tipo CRGB, chiamato con molta fantasia leds, che conterrà la posizione di ciascuno dei LED presenti sulla nostra striscia.
Nel setup utilizziamo il metodo .addLeds per creare la struttur necessaria alla gestione degli oggetti: passiamo come parametri il tipo di LED (WS2812), il pin di controllo su Arduino, ed un parametro GRB, che rappresenta il tipo di pilotaggio richiesto. A seconda del produttore, infatti, le connessioni ai LED potrebbero essere lievemente differenti, e sono presenti quindi diverse configurazioni. Il nostro programma ci servirà per capire se la configurazione GRB sia corretta o meno una volta all’interno del loop.
Passiamo inoltre alla struttura l’array con le posizioni dei LED, ed il numero dei LED sui quali vogliamo lavorare.
Il loop è estremamente semplice: accenderà i primi tre LED della nostra striscia indirizzandoli direttamente, ed “inserendo” in ciascuna posizione il colore relativo. Il metodo .show infine farà accendere i LED. Qualora i LED non avessero i colori che ci aspettiamo (rosso, verde, blu), dovremo cercare una configurazione del metodo .addLeds differente rispetto a GRB.
Intelligent Blink
Blink è il corrispettivo per Arduino del classico “Hello World!”. Proviamo ad implementarlo con i nostri LED:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Programma 02 - Blink! #include <FastLED.h> #define NUM_LEDS 14 #define LED_PIN 6 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(40); // up to 255 } void loop() { leds[0] = CRGB::Red; FastLED.show(); delay(200); leds[0] = CRGB::Black; FastLED.show(); delay(200); } |
Semplicissimo! Basta indirizzare il nostro LED all’interno del vettore, e dargli di volta in volta il colore rosso o “nero” (=spento) a intervalli di 200 millisecondi.
L’utilizzo di un timer bloccante (la funzione delay()) non è tuttavia il massimo nella pulizia del codice, quando inizieremo a creare pattern dinamici e colorati impareremo anche ad usare i timer non bloccanti di cui la nostra libreria FastLED è fornita.
Knight Rider: Inseguitori a LED
Chi di voi ha raggiunto la mia età ricorderà sicuramente la serie di telefilm “Supercar”; in cui una vettura futuribile rispondeva ai comandi vocali di un David Hasselhoff. La vettura mostrava di aver “capito” il comando nel momento in cui i LED sul cofano iniziavano ad inseguirsi.
Il programma seguente mostra in che modo programmare Arduino per ottenere un effetto simile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Programma 03 - Knight Rider #include <FastLED.h> #define NUM_LEDS 14 #define LED_PIN 6 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(40); // up to 255 } void loop() { for (int i = 0; i < NUM_LEDS; i++) { leds[i] = CRGB::Red; FastLED.show(); delay(200); leds[i] = CRGB::Black; } for (int i = NUM_LEDS - 1; i >= 0; i--) { leds[i] = CRGB::Red; FastLED.show(); delay(200); leds[i] = CRGB::Black; } } |
All’interno del loop non dovremo far altro che sostituire la funzione presente in blink, attivandola non solo per il primo led, ma per ciascun led sulla nostra striscia. Avanti e indietro.
Di tutti i colori, per chi non fa errori!
Abbiamo lavorato con il movimento dei LED di colore rosso, e abbiamo visto che possiamo defninire colori a piacimento per ciacun LED.
Il programma che segue “accenderà” l’intera striscia di un unico colore, facendo poi mutare il colore in solido, utilizzando appunto il metodo fill_solid.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Programma 04 - fill_solid #include <FastLED.h> #define NUM_LEDS 14 #define LED_PIN 6 CRGB leds[NUM_LEDS]; void setup() { FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS); FastLED.setBrightness(40); // up to 255 } void loop() { fill_solid(leds, NUM_LEDS, CRGB::Red); FastLED.show(); delay(500); fill_solid(leds, NUM_LEDS, CRGB::Green); FastLED.show(); delay(500); fill_solid(leds, NUM_LEDS, CRGB::Blue); FastLED.show(); delay(500); } |
Come vedete, la prima parte del programma è sempre la stessa, mentre nel loop chiameremo la funzione fill_solid() per far accendere tutti i LED della striscia contemporaneamente, di un unico colore. La funzione prende come parametri l’array di LED, il numero di LED che vogliamo coinvolgere, ed il colore “solido” che vogliamo accendere.
Ho parlato di colore “solido” per una ragione specifica…
Riflessioni
Appare evidente che quanto abbiamo visto oggi rappresenti solo la punta dell’iceberg… In realtà c’è molto ancora da approfondire. Diciamo che al momento abbiamo preso coscienza dell’universo che si nasconde dietro ai LED WS2812, imparando come indirizzare un singolo colore su di un singolo LED.
Nella prossima puntata inizieremo a mescolare i colori per ottenere effetti sempre più interessanti.
Il codice sorgente è ovviamente presente su github al solito indirizzo.
Continuate a seguirci, ci sentiamo tra sette giorni!
Link utili
- Arduino uno
- Arduino nano
- Elegoo starter kit
- Striscia LED WS2812 (5m 30 LED/m)
- Striscia LED WS2812 (1m 144 LED/m)
Ciao e grazie del post, quello che cercavo!
Una domanda, se possibile…ma se volessi avere 2 o più strisce collegate che fanno la stessa cosa (ossia partono dal led n.1 e poi via via fino al 14). Vorrei fare tipo una cascata di led che parte da un’unico punto. Mi puoi indirizzare? grazie
Ciao e scusami per il ritardo (ero in ferie…) 🙂
Allora, puoi risolvere in diversi modi:
1 – Usare una striscia unica e selezionare l’array con i LED, applicando il programma al sottoinsieme: ad esempio, 5 array da 14 LED formano 70 LED. Definisci un array da 70 LED e crei una funzione che prenda 14*i LED, con i che varia da 0 a 4.
2 – Usare 5 striscie da 14 LED, e gestire ciascuna con un PIN differente di Arduino: CREI GLI ARRAY leds1, leds2 leds3… quindi usa diverse funzioni AddLeds. Nel loop() chiamerai ciascuna funzione sull’array prescelto (ad esempio fill_solid(leds1, NUM_LEDS1, CRGB::Red);)
3 – Usare 5 arduino nano (più piccoli, maneggevoli e parcchi nei consumi) per gestire ciascuna striscia LED da 14 LED.
Ricorda che per usare 80 LED hai bisogno di oltre 1A di corrente (di massimo), quindi occorre valutare l’aggiunta di un alimentatore a parte per la striscia.
Se occorre altro chiedi pure!