LED WS2812 – Attività di configurazone con Arduino

Arduino ws2812

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.

ws2812 freccia LED

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:

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:

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.

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.

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

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.

2 Comments

  1. Federico | | Reply

    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

  2. Luigi_Morelli | | Reply

    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!

Leave a Reply

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