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 anche su ebay a circa 20 euro al metro.
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!

Segui Daniele Alberti su Google+ e su Twitter!

8 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

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