Arduino: Led strip con led indirizzabili e libreria NeoPixel

Ciao a tutti!
questo Natale il mio albero si è colorato in modo un po' particolare..



"L'upgrade" all'albero è arrivato da Arduino e da una striscia a led un po' speciale, infatti ho utilizzato i led WS2812B, si trovano in molti store online, cercando "Neopixel" o "WS2812B".
Ad un ottimo prezzo si trova questa stick di 10 led fornita da Seeedstudio.

Questi led possono essere programmati singolarmente, quindi ogni singolo led può avere un colore diverso, a differenza delle strisce tradizionali dove tutti i led devono avere lo stesso colore.
Il risultato dal vivo è davvero fantastico e può essere usato per illuminare qualunque cosa voi immaginiate.



Utilizzando la libreria "NeoPixel" creata da Adafruit è possibile controllare facilmente questi fantastici led, inoltre sono presenti dei fantastici esempi tra i quali quello dell'effetto che ho utilizzato per il mio albero:



Ecco lo sketch di esempio che ho utilizzato:

  1. #include <Adafruit_NeoPixel.h>
  2. #define PIN 6
  3. // Parameter 1 = number of pixels in strip
  4. // Parameter 2 = pin number (most are valid)
  5. // Parameter 3 = pixel type flags, add together as needed:
  6. //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
  7. //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
  8. //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
  9. //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
  10. Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ400);
  11. void setup() {
  12.   strip.begin();
  13.   strip.show(); // Initialize all pixels to 'off'
  14. }
  15. void loop() {
  16.   // Some example procedures showing how to display to the pixels:
  17.   //colorWipe(strip.Color(255, 0, 0), 50); // Red
  18.   //colorWipe(strip.Color(0, 255, 0), 50); // Green
  19.   //colorWipe(strip.Color(0, 0, 255), 50); // Blue
  20.   rainbow(20);
  21.   rainbowCycle(20);
  22. }
  23. // Fill the dots one after the other with a color
  24. void colorWipe(uint32_t c, uint8_t wait) {
  25.   for(uint16_t i=0; i<strip.numPixels(); i++) {
  26.       strip.setPixelColor(i, c);
  27.       strip.show();
  28.       delay(wait);
  29.   }
  30. }
  31. void rainbow(uint8_t wait) {
  32.   uint16_t i, j;
  33.   for(j=0; j<256; j++) {
  34.     for(i=0; i<strip.numPixels(); i++) {
  35.       strip.setPixelColor(i, Wheel((i+j) & 255));
  36.     }
  37.     strip.show();
  38.     delay(wait);
  39.   }
  40. }
  41. // Slightly different, this makes the rainbow equally distributed throughout
  42. void rainbowCycle(uint8_t wait) {
  43.   uint16_t i, j;
  44.   for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
  45.     for(i=0; i< strip.numPixels(); i++) {
  46.       strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
  47.     }
  48.     strip.show();
  49.     delay(wait);
  50.   }
  51. }
  52. // Input a value 0 to 255 to get a color value.
  53. // The colours are a transition r - g - b - back to r.
  54. uint32_t Wheel(byte WheelPos) {
  55.   if(WheelPos < 85) {
  56.    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  57.   } else if(WheelPos < 170) {
  58.    WheelPos -= 85;
  59.    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  60.   } else {
  61.    WheelPos -= 170;
  62.    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  63.   }
  64. }

Se invece volete creare qualcosa con le vostre mani dovete capire il funzionamento di questa libreria, per rendere più chiaro il tutto ho scritto questo piccolo codice.
Quello che faremo è accendere i primi 3 led della striscia, il primo di rosso il secondo verde e il terzo blu.
ecco lo sketch:

  1. #include <Adafruit_NeoPixel.h>
  2. #define PIN 6
  3. // Parameter 1 = number of pixels in strip
  4. // Parameter 2 = pin number (most are valid)
  5. // Parameter 3 = pixel type flags, add together as needed:
  6. //   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
  7. //   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
  8. //   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
  9. //   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
  10. Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
  11. void setup() {
  12.   strip.begin();
  13.   strip.show(); // Initialize all pixels to 'off'
  14. }
  15. void loop() {
  16.   strip.setPixelColor(0, 255, 0, 0);
  17.   strip.setPixelColor(1, 0, 255, 0);
  18.   strip.setPixelColor(2, 0, 0, 255);
  19.   strip.show();
  20.   delay(10);
  21. }

Come potete vedere è molto semplice, dopo la configurazione iniziale e l'inizializzazione, nel loop trovare il vero e proprio comando dei led.
se analizzate la prima riga del loop "strip.setPixelColor(1, 255, 0, 0);" vedrete che i numeri tra le parentesi sono 4.
Il primo numero indica il led che voglio comandare (si parte da 0), il secondo la "quantità" di colore rosso, il terzo la quantità di verde e il quarto la quantità di blu.

ed ecco la foto del risultato:


Infine metto anche lo schema elettrico, è molto semplice, però vi serve un buon alimentatore da 5volt e la corrente che fornisce deve essere almeno 0.06 Ampere per led.
Quindi nel mio caso, con una striscia di un metro da 60 led vi serve un alimentatore da 5 volt e minimo 3.6 Ampere.

Questo è tutto, vi lascio divertire con questi fantastici led, Ciao!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

14 commenti:

  1. Una sola domanda l'arduino và alimentato separatamente o prende la corrente dai 5v collegati all'alimentatore?

    RispondiElimina
    Risposte
    1. Ciao, se colleghi il tutto come da schema, Arduino si alimenta dal 5volt dell'alimentatore quindi non necessita di alimentazione dedicata

      Elimina
  2. Qual'è la distanza massima tra Arduino e i led(mi riferisco sopratutto al bus di controllo)?esiste un amplificatore per comandarli a lunga distanza tipo 20 metri o oltre?

    RispondiElimina
    Risposte
    1. Ciao, non saprei indicarti una distanza, prova a guardare sul datasheet del led WS2812. In alternativa potresti inviare dei comandi da un'Arduino ad un'altro posizionato vicino ai led.

      Elimina
  3. ciao
    Innanzi tutto complimenti per il tuo blog.
    Vorrei chiederti una cosa
    potrebbe essere possibile far accendere una strip led digitale in sequenza e farla rimanere accesa fissa?
    Mi spiego meglio.
    Supponiamo che abbia una strip ws2812 da un metro(60 led) con il suo controller(arduino o altro) e un alimentatore collegato con un interruttore all'impianto di casa.
    Io vorrei programmare la strip in modo che quando accendo l'interruttore i led si accendano in sequenza dall'1 al 60 e che una volta accesi tutti, rimangano fissi accesi fino a quando non spengo l'interruttore.
    spero di essere stato chiaro.
    secondo te si può fare?
    ti ringrazio in anticipo.

    RispondiElimina
    Risposte
    1. Ciao Giuseppe, si certo che sì può fare.
      Ti è sufficiente utilizzare un ciclo for, come indice metti il numero del led, e metti il ciclo nel setup in modo che venga eseguito solo una volta.

      Elimina
  4. Grazie per la risposta, purtroppo non sono pratico di programmazione e di Arduino....mi farò aiutare dal vivo da qualcuno più esperto di me in C++ con le tue indicazioni.
    Un'altra cosa, visto che mi sembra sprecato utilizzare Arduino per fare una sola cosa e anche semplice, secondo te sarebbe complicato progettare un circuito elettronico che gestisca l'accensione dei suddetti led?
    Grazie

    RispondiElimina
    Risposte
    1. Si potrebbe essere sprecato ma tieni conto che puoi trovare schede "Arduino compatibili" identiche ad Arduino e dal costo di pochi euro. Ad esempio questo:
      https://www.danielealberti.it/2015/09/dccduino-un-arduino-super-economico.html
      Ciao!

      Elimina
  5. Ciao Daniele
    grazie per questo tutorial lo sto adattando per illuminare il mio diorama Lego :-), una domanda però, come posso limitare la luminosità dei led, per la mia applicazione risultano "un po troppo forti" grazie

    RispondiElimina
    Risposte
    1. Ciao, prova ad abbassare il valore, ad esempio non mettere 255, ma 100 o meno.

      Elimina
  6. Ciao Daniele,
    Scusa ho omesso un dettaglio non trascurabile,la striscia è composta da circa 30 led i primi 20 li piloto in modo costante, quindi posso ridurre la loro intensità come mi hai suggerito tu, dal 20° al 30° utilizzo l'effetto rainbow del tuo esempio è qui che non so come ridurre la loro (e solo la loro intensità) se hai qualche suggerimento ti ringrazio buona giornata ciao Daniele

    RispondiElimina
  7. Scusa la mia ignoranza, ma se alimento i led(50) con 5v e 10a non è troppa corrente per Arduino? I led sono ws2801 ma non a striscia, è una catena da 50 led rgb con lintegrato per ogni led. Grazie

    RispondiElimina
    Risposte
    1. Si potrebbe essere una corrente alta, ma il produttore della strip non indica che sia obbligatorio tagliarla. Inoltre ho collegato l'alimentatore sia all'inizio che alla fine della strip, in modo da dimezzare la corrente nel punto iniziale.

      Elimina
  8. Ciao Daniele, sto provando a giocare con una striscia sk6812 rgbw a 5V di 5 metri con 60 led al metro (18 Watt per metro). Vorrei accendere contemporaneamente al massimo 70 led tramite un unico pin di Arduino Uno. Volevo chiederti come eseguire i collegamenti e se servono condensatori e/o transistor come connetterli e che tipo usare. Che tipo di alimentatore mi consigli?

    RispondiElimina

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post