Benvenuti su 9minuti, oggi vediamo come utilizzare la libreria NeoPixel di Adafruit in accoppiata con uno stick da otto led RGB.
Per installare una libreria ci sono tre modi, se non l’hai mai fatto ti consiglio una lettura.
Questi stick, come anche gli anelli RGB, da nuovi non hanno nessun cavetto collegato, quindi dovrà essere vostra premura saldarci sopra alcuni cavetti.
La guida è valida sia per gli stick che per gli anelli RGB, in quanto il funzionamento è il medesimo e differiscono solo nella forma e nel numero di led.
Indice
Vediamo insieme uno degli sketch esempio fornito da Adafruit per la libreria NeoPixel e modificato dove necessario per farlo funzionare con lo stick ad otto bit.
Questo sketch illumina quattro led per volta e li fa scorrere lungo le otto posizioni disponibili, cambia colore non appena quello precedente è giunto alla fine. Vediamo il codice riga per riga.
// Simple NeoPixel test. Lights just a few pixels at a time so a // 1m strip can safely be powered from Arduino 5V pin. Arduino // may nonetheless hiccup when LEDs are first connected and not // accept code. So upload code first, unplug USB, connect pixels // to GND FIRST, then +5V and digital pin 6, then re-plug USB. // A working strip will show a few pixels moving down the line, // cycling between red, green and blue. If you get no response, // might be connected to wrong end of strip (the end wires, if // any, are no indication -- look instead for the data direction // arrows printed on the strip). #include <Adafruit_NeoPixel.h> #define PIN 8 #define N_LEDS 12 Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_RGB); void setup() { strip.begin(); } void loop() { chase(strip.Color(255, 0, 0)); // Red chase(strip.Color(0, 255, 0)); // Green chase(strip.Color(0, 0, 255)); // Blue } static void chase(uint32_t c) { for (uint16_t i = 0; i < strip.numPixels() + 4; i++) { strip.setPixelColor(i , c); // Draw new pixel strip.setPixelColor(i - 4, 0); // Erase pixel a few steps back strip.show(); delay(25); } }
12 – Includiamo la libreria di Adafruit NeoPixel
14 – A quale pin di Arduino abbiamo attaccato il cavetto che porta a DI (D Input)? Scriviamolo accanto a PIN
15 – Quanti led ha la nostra striscia o il nostro anello? Scriviamolo accanto a N_LEDS
17 – Creiamo un oggetto chiamato strip di tipo Adafruit_NeoPixel. Come potete vedere, nella funzione a destra vengono passati i parametri inseriti nelle righe 14 e 15.
20 – Richiamiamo il metodo begin() dell’oggetto strip. Questo è molto simile a quando si dichiara un pin come ad esempio: pinMode(4, INPUT)
24 – Richiamiamo la procedura chase() presente in fondo allo sketch e gli passiamo come parametro il metodo Color() dell’oggetto strip. Al metodo Color() passiamo come parametri tre numeri che vanno da 0 a 255. Nel nostro caso siccome vogliamo il rosso la combinazione è 255, 0, 0.
25, 26 – Idem con verde e blu.
29 – Dichiarazione della procedura chase() di tipo void (ovviamente, altrimenti non sarebbe una procedura).
Static significa che quella procedura non potrà essere usata al di fuori di quel file, non è il nostro caso ma è bene saperlo.
Il parametro che viene passato è di tipo uint32_t e si chiama c.
uint32_t è un tipo di intero che occupa sempre 32 bit.
30 – Nel corpo della funzione troviamo un ciclo for. Questo significa che eseguirà le righe comprese tra la 31 e la 34 tante volte quanto il numero totale dei nostri led RGB.
uint16_t è un un intero a 16 bit.
strip.numPixel() è un metodo dell’oggetto strip che ci restituisce il numero di led RGB utilizzati. Nel ciclo for, al fine di avere un determinato effetto, è stato incrementato di 4. Come vedremo nel video, i led RGB che si accenderanno contemporaneamente saranno appunto 4.
31 – Il metodo setPixelColor() dell’oggetto strip accende e spegne i led RGB a seconda dei parametri che gli vengono passati. Il primo parametro è la posizione del led RGB, se noi abbiamo otto led ci saranno otto posizioni: da 0 a 7. Nel nostro caso la posizione verrà incrementata in maniera automatica mentre il colore gli verrà passato dal metodo Color() presente nel loop()
32 – Qua il metodo setPixelColor() spegne i led RGB di quattro posizioni indietro. Come potete vedere il secondo parametro è 0 che in informatica equivale, per convenzione, a spento.
33 – Il metodo show() dell’oggetto strip serve a rendere i cambiamenti effettivi, senza questa riga non vedremmo nulla.
34 – Piccolissimo delay di 25 millisecondi tra l’esecuzione dei cicli del for.
Di seguito un breve video che riprende, in ordine, gli effetti dei tre sketch.
Questo sketch è basato sul precedente ma l’ho ulteriormente personalizzato, aggiungendo altri colori e semplificando, a mio parere, la comprensione del codice, pulendolo e rendendolo più semplice da integrare con i propri progetti. Lo sketch in questione illumina un led di un colore e lo fa scorrere per tutti gli otto led. Una volta arrivato in fondo parte il secondo colore e così via.
// Simple NeoPixel test based on the Adafruit example and made for 9minuti.it #include <Adafruit_NeoPixel.h> #define PIN 8 #define N_LEDS 8 Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_RGB); uint32_t red = strip.Color(255, 0, 0); // Red uint32_t green = strip.Color(0, 255, 0); // Green uint32_t blue = strip.Color(0, 0, 255); // Blue uint32_t purple = strip.Color(255, 0, 255); // Purple uint32_t lightBlue = strip.Color(0, 255, 255); // Light blue uint32_t yellow = strip.Color(255, 255, 0); // Yellow uint32_t white = strip.Color(255, 255, 255); // White void setup() { Serial.begin(9600); strip.begin(); strip.show(); // Initialize all pixels to 'off' strip.setBrightness(255); //30-255 } void loop() { chase(red); // Red chase(green); // Green chase(blue); // Blue chase(purple); // Purple chase(lightBlue); // Light blue chase(yellow); // Yellow chase(white); // White } static void chase(uint32_t c) { for (uint16_t i = 0; i < strip.numPixels() + 1; i++) { strip.setPixelColor(i , c); // Draw new pixel strip.setPixelColor(i - 1, 0); // Erase pixel a few steps back strip.show(); delay(100); } }
10 – 16 Dichiarazione di variabili di tipo uint32_t e inizializzazione con i valori di ritorno del metodo Color() dell’oggetto strip.
21 – Il metodo show() dovrebbe inizializzare tutti i led come spenti, in questo modo se dovessero esserci dei led rimasti accesi da un precedente sketch questo metodo li spegne.
22 – Il metodo setBrightness() è autoesplicativo, è possibile regolare la luminosità dei led dando come parametro un valore da 30 a 255.
Non è possibile utilizzare questo modo all’interno del loop() ma solamente nel setup(), questo significa che la luminosità è regolabile solo all’inizio.
26 – 32 Come potete vedere il loop() è molto pulito. Richiamiamo diverse volte la funzione chase() dando come parametri le nostre variabili dichiarate a inizio sketch.
35 – 40 La funzione chase() è praticamente identica a quella del precedente sketch, differisce solamente nel numero di led accesi contemporaneamente, in questo caso solamente uno.
Ho voluto in questo sketch indicare come accendere staticamente gli otto led per ottenere, come in questo caso, una bandiera. Vediamolo riga per riga. Non mi soffermerò nei punti precedentemente spiegati.
// made for 9minuti.it // Simple NeoPixel test based on the Adafruit Neopixel library. //the sketch reproduce the italian flag and can also make it blink #include <Adafruit_NeoPixel.h> #define PIN 8 #define N_LEDS 8 Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_RGB); uint32_t red = strip.Color(255, 0, 0); // Red uint32_t green = strip.Color(0, 255, 0); // Green uint32_t blue = strip.Color(0, 0, 255); // Blue uint32_t purple = strip.Color(255, 0, 255); // Purple uint32_t lightBlue = strip.Color(0, 255, 255); // Light blue uint32_t yellow = strip.Color(255, 255, 0); // Yellow uint32_t white = strip.Color(255, 255, 255); // White uint32_t none = strip.Color(0, 0, 0); // None void setup() { Serial.begin(9600); strip.begin(); strip.show(); // Initialize all pixels to 'off' strip.setBrightness(255); //30-255 } void loop() { strip.setPixelColor(0, green); strip.setPixelColor(1, green); strip.setPixelColor(2, green); strip.setPixelColor(3, white); strip.setPixelColor(4, white); strip.setPixelColor(5, red); strip.setPixelColor(6, red); strip.setPixelColor(7, red); strip.show(); delay(1000); //uncomment if you want the blink effect /* strip.setPixelColor(0, none); strip.setPixelColor(1, none); strip.setPixelColor(2, none); strip.setPixelColor(3, none); strip.setPixelColor(4, none); strip.setPixelColor(5, none); strip.setPixelColor(6, none); strip.setPixelColor(7, none); strip.show(); delay(1000); */}
29 – 30 Utilizzo del metodo setPixelColor() dell’oggetto strip. Il metodo riceve due parametri, la posizione del led e il colore.
42 – 51 Se togliamo il commento a queste linee la bandiera dell’Italia lampeggerà ogni secondo.
E se volessimo collegare più led come nel video qui sotto? Basta collegare a DO del primo stick o ring, il DI del secondo e così via, come nell’immagine. Da notare che nel video c’è un anello in più, il quale è collegato all’anello precedente nell’identica maniera.
Da notare che nel video c’è un anello in più, il quale è collegato all’anello precedente nell’identica maniera.
A proposito dell’alimentazione possiamo dire che, finché i led accesi contemporaneamente sono otto o meno, è sufficiente l’alimentazione di Arduino, superato questo numero è consigliabile utilizzare un’alimentazione esterna per i led ed utilizzare Arduino solamente come microcontrollore.
Spero che anche questo tutorial sia stato d’aiuto a qualcuno, rimango disponibile per qualsivoglia aiuto.
Grazie,
Alessandro
Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…
Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…
Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…
I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…
Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…
Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…
View Comments
Bel lavoro Alessandro. Io ho da poco assemblato una scheda con 140 Neopixel ma sfortunatamente con un semplice programmino che me li fa accendere in sequenza mi sono accorto che rispondono male accendendosi in maniera random o addirittura molti sono spenti.Spero di poter risolvere questo intoppo in modo da poter avanzare con il mio reale progetto. Potresti darmi qualche dritta? Grazie
Ciao yupu, ti ringrazio! Urca 140 sono tanti, come li stai alimentando? Hai provato a fare un ciclo che ne accende solo uno per volta? Fammi sapere
ciao complimenti per il le spiegazioni, secondo tè è possibile far muovere i led usando encoder?