In questo articolo analizzeremo un anello su cui sono presenti 16 LED RGB WS2812B.
Quest’ultimo è un led RGB a controllo digitale prodotto dalla WorldSemi formato da un RGB SMD 5050, al cui interno è stato installato un minuscolo chip di controllo.
Nel chip è presente un regolatore di luminosità a corrente costante che assicura un colore uniforme anche con differenti tensioni di alimentazione e un’interfaccia di comando seriale a una sola linea.
Citazione dell’articolo nelle sezioni Arduino, Brief Tutorial del Blog di Elettronica In
Indice
Descrizione
Anello a tecnologia Neopixel con 16 diodi LED RGB tipo WS2812B che possono essere gestiti individualmente. Ognuno può produrre 256 tonalità del proprio colore, determinando un totale di 16.777.216 colori.
Il canale dati per la comunicazione è seriale di tipo One-Wire e può essere controllato con microcontrollori come Arduino, PIC, mbed, ecc.
È possibile impostare a piacimento la frequenza di refresh, in modo da rendere impercettibili determinati giochi di luce. E’ anche possibile collegare più anelli in cascata per realizzare vari effetti.
L’alimentazione è di 5V.
Specifiche tecniche
Sigla: WCMCU-WS2812B-16
Numero di LED: 16
Colori di base: rosso, verde blu (risoluzione RGB a 24 bit)
Modello chip LED: SMD5050
Alimentazione: CC
Tipo di LED: SMD
Numero modello: chip LED WS2812b
Tensione: 4 V-7 V CC
Consumo energetico massimo (W): 0,24 W x 16 = 3,84 W
Dimensioni: 68 mm +/- 1 mm di diametro esterno. Diametro interno 54 mm +/- 1 mm. Spessore 3,1 mm.
Peso: 5,9 g
Pin out
5V – La tensione deve essere compresa 4V e 7V. Un valore più elevato può danneggiare il LED, un valore inferiore ai 5 V ridurrà la luminosità o semplicemente non si accenderà
GND – La tensione di alimentazione di riferimento comune, terra, 0 V.
DI – I dati provenienti da un microcontrollore (o un altro pixel WS2812) entrano in questo pin.
DO – I dati possono essere trasmessi da questo pin, verso un altro led o lasciati fluttuanti se è l’ultimo anello della catena.
Alcune informazioni aggiuntive sul LED WS2812B
- Sorgente luminosa: 5050 RGB SMD (datasheet)
- Materiale : substrato di alluminio
- Livelli di colore : 256
- Angolo di luce: 180 °
- Emissione di colori chiari: bianco, rosso, giallo, blu, verde, ecc.
- Tensione di funzionamento standard: DC 5 V.
- Potenza: 0,3 W + / – 0,01%
Schema elettrico dell’anello LED RGB WS2812B
Lo schema elettrico dell’anello led è molto semplice in quanto è formato solamente dai led, ognuno con un condensatore dal valore di 100 nF per il livellamento della tensione di alimentazione.
Il primo led è collegato al pin DI – ingresso dati, poi l’uscita dati DO è collegata al D I del successivo led.
Schema e PCB sul sito https://oshwlab.com
Dove trovare l’anello led
Il componente potrà essere acquistato su vari siti online.
L’anello testato riporta sul PCB la sigla “WCMCU-WS2812B-16” è formato da 16 led, sono però disponibili anche anelli su cui sono presenti 8 12, 24, 32 led, singolarmente indirizzabili.
Un anello simile può essere trovato presso il sito Homotix, Neopixel WS2812 5050 RGB 16 LED codice DLS0281216D
Altra possibilità è presso il sito Futura Elettronica, Anello con 16 LED RGB WS2812 e driver integrato codice 2846-RING16NEOPIXEL
Il led è disponibile anche su modulo singolo, vedere per esempio l’articolo WS2812B LED RGB a controllo digitale.
Per il collegamento viene di solito fornito un cavo di collegamento a tre poli con un connettore da un lato mentre l’altro lato i cavi devono essere saldati alle piazzole presenti sul PCB (vedere foto sotto) sul lato opposto di quello occupato dai LED.
Per effettuare le saldature vi consiglio la lettura dell’articolo Come eseguire delle buone saldature
Libreria di gestione tramite Arduino
Per la gestione del led si utilizzerà la libreria NeoPixel realizzata dalla ditta Adafruit.
Per caricarla si dovrà inserire nel campo ricerca “neopixel” , quando apparirà basterà premere il tasto Installa,
La scritta “INSTALLED” segnalerà l’avvenuta installazione della libreria.
Per utilizzarla nei vostri Sketch, occorrerà inserire come minimo queste linee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif //Pin a cui è collegato l'anello di led #define PIN 9 // Numero led dell'anello #define NUMPIXELS 16 //Impostazione dei parametri Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); // Si inizializza la libreria NeoPixel. pixels.setBrightness(5); //Si regola la luminosità } |
- Per maggiori informazioni relative ai comandi della libreria vedere la pagina su Adafruit.
- Per informazioni su come installare una libreria vedere l’articolo Arduino – Tutorial, come installare una libreria
Circuito di prova
Per il test dell’anello LED RGB WS2812B si è utilizzata una scheda Keyestudio PLUS. Completamente compatibile con l’ambiente di sviluppo Arduino IDE. Contiene tutte le funzioni della scheda Arduino UNO R3 e alcuni miglioramenti che ne rafforzano notevolmente la funzione.
Materiale utilizzato
Scheda Keyestudio PLUS | Anello LED RGB WS2812B |
Cavi di collegamento |
Sketch di base
Sotto è riportato un sketch con il contenuto minimo. In particolare permette di accendere solamente il primo.
Il colore emesso è formato dal valore attribuito ai tre base (Rosso, Verde, Blu) che deve essere compreso tra 0 e 255.
Per la scelta ci si potrà riferire a quanto riportato in questa pagina , sono riportati i 16 colori di base , più molti altre tonalità di colore. Vi basterà copiare e incollare i tre valori separati dalla virgola nella linea e ricaricando lo sketch vedrete il nuovo colore.
1 | pixels.setPixelColor(0, pixels.Color(255, 225, 0)); |
Per quanto riguarda a luminosità complessiva di tutti i LED, questa può essere regolata utilizzando setBrightness() . Questo richiede un singolo argomento, un numero compreso tra 0 (spento) e 255 (luminosità massima)
Sotto è riportato lo sketch completo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif //Pin a cui è collegato l'anello di led #define PIN 9 // Numero led dell'anello #define NUMPIXELS 16 //Impostazione dei parametri Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); // Si inizializza la libreria NeoPixel. pixels.setBrightness(5); //Si regola la luminosità //Spegne tutti i led colorWipe(pixels.Color(0, 0, 0), 50); //Accende il led 0 con il colore impostato pixels.setPixelColor(0, pixels.Color(255, 225, 0)); pixels.show(); // Aggiorna colore } void loop() { } // Riempie uno dopo l'altro i led con un colore void colorWipe(uint32_t c, uint8_t wait) { for (uint16_t i = 0; i < pixels.numPixels(); i++) { pixels.setPixelColor(i, c); pixels.show(); delay(wait); } } |
Altro sketch di prova
Sotto è riportato un’altro sketch che mostra l’accensione di tutti i 16 led con varie tonalità di colore intervallati dall’accensione di 4 gruppi di 3 led con colori della bandiera italiana, tanto per essere patriottici.
Più effetti e colori, potranno essere trovati tra gli esempi della libreria o in rete.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif //Pin a cui è collegato l'anello di led #define PIN 9 // Numero led dell'anello #define NUMPIXELS 16 //Impostazione dei parametri Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); // Si inizializza la libreria NeoPixel. pixels.setBrightness(5); //Si regola la luminosità } void loop() { colorWipe(pixels.Color(255, 255, 255), 50); //white delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(255, 0, 255), 50); //fuchsia delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(255, 165, 0), 50); //orange delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(0, 0, 255), 50); //Blue delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(255, 215, 0), 50); //gold delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(173, 255, 47), 50); //greenyellow delay (1000); bandiera(); delay (1000); colorWipe(pixels.Color(0, 255, 255), 50); //aqua delay (1000); bandiera(); delay (1000); } void bandiera() { pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // verde pixels.setPixelColor(1, pixels.Color(255, 255, 255)); // bianco pixels.setPixelColor(2, pixels.Color(255, 0, 0)); // rosso pixels.setPixelColor(3, pixels.Color(0, 0, 0)); // spento pixels.setPixelColor(4, pixels.Color(0, 255, 0)); // verde pixels.setPixelColor(5, pixels.Color(255, 255, 255)); // bianco pixels.setPixelColor(6, pixels.Color(255, 0, 0)); // rosso pixels.setPixelColor(7, pixels.Color(0, 0, 0)); // spento pixels.setPixelColor(8, pixels.Color(0, 255, 0)); // verde pixels.setPixelColor(9, pixels.Color(255, 255, 255)); // bianco pixels.setPixelColor(10, pixels.Color(255, 0, 0)); // rosso pixels.setPixelColor(11, pixels.Color(0, 0, 0)); // spento pixels.setPixelColor(12, pixels.Color(0, 255, 0)); // verde pixels.setPixelColor(13, pixels.Color(255, 255, 255)); // bianco pixels.setPixelColor(14, pixels.Color(255, 0, 0)); // rosso pixels.setPixelColor(15, pixels.Color(0, 0, 0)); // spento pixels.show(); // Aggiorna colore } // Riempie uno dopo l'altro i led con un colore void colorWipe(uint32_t c, uint8_t wait) { for (uint16_t i = 0; i < pixels.numPixels(); i++) { pixels.setPixelColor(i, c); pixels.show(); delay(wait); } } |
Altro esempio di utilizzo
Potete vedere un altro modi di utilizzare l’anello con LED RGB. In questo caso viene gestito tramite un pulsante di navigazione a 5 direzioni.
Travate l’applicazione descritta nell’articolo Accensione anello LED RGB con pulsante tattile
Per informazioni sul modulo pulsante vedere l’articolo Pulsante di navigazione a 5 direzioni
Tasto UP premuto
Pressione tasto MID
Pressione tasto SET