Categories: Arduino

Libreria NeoPixel? un valido aiuto per Arduino e le strisce di led RGB

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.

Arduino e lo stick a otto led RGB in funzione con la libreria NeoPixel

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.

 

Vediamo i collegamenti necessari.

Arduino Uno r3 e lo stick da 8 led rgb

 

Il primo sketch con la libreria NeoPixel

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.

Vediamo ora un secondo esempio con la libreria NeoPixel

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.

 

Terzo ed ultimo esempio con la libreria NeoPixel

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.

 

Più di uno stick / ring? Nessun problema con la libreria NeoPixel

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.

Arduino, uno stick da 8 led e un anello da 12

Da notare che nel video c’è un anello in più, il quale è collegato all’anello precedente nell’identica maniera.

 

Attenzione all’alimentazione!

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

Alessandro Oppo

Alessandro è un milanese che vorrebbe scappare da Milano, è appassionato di informatica ma vorrebbe vivere senza telefono, è un artigiano eppure vorrebbe robotizzare tutto, impara una cosa e già vorrebbe studiare dell’altro. Autodidatta da sempre, gli piace sbattere la testa finché tutto non funziona come vuole lui, spesso ci riesce anche! Visita il suo blog personale alexoppo.com Il motto che si ripete dentro la testa è: “Se ci sono riusciti gli altri ci posso riuscire anche io”.

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?

Recent Posts

Ponti sospesi: cosa abbiamo sbagliato? cosa si potrebbe fare?

Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…

12 mesi ago

Siamo quel che facciamo? – racconto breve

Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…

1 anno ago

Il limite è sempre la mente – Racconto breve

Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…

1 anno ago

L’ultimo giorno del carcere – Racconto breve

I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…

1 anno ago

Riflessioni sul carcere

Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…

2 anni ago

Come dovremmo dialogare secondo me

Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…

2 anni ago