RGB led controller

Controller per led RGB


Non mi assumo nessuna responsabilita' per danneggiamenti, perdita di dati o danni personali come risultato diretto o indiretto dell'uso delle informazioni contenute in queste pagine. Questo materiale e' fornito cosi' com'e' senza nessuna garanzia implicita o esplicita.


Home
Hardware
Software

RGB led

Tra tutti i led RGB del creato il modello WS2812B sembra si stia imponendo, soprattutto nel mondo degli obbisti. Sara' perche' i cinesi sembrano spingerlo parecchio, sara' perche' sembra fare tutto da solo senza richiedere componenti esterni, sara' perche' non costa quasi niente, oppure sara' perche' alla fine della fiera e' veramente comodo e piuttosto potente. Non voglio fare pubblicita' a questo componente, non lo ritengo il massimo della vita, pero' funziona bene e ho voluto dedicargli una scheda di controllo che faccia da tramite tra la seriale del computer e questi led RGB.

Il principio e' veramente semplice: un AT90S2313 dell'Atmel mostra un array di registri ModBus che rappresentano i valori RGB di 16 led, il PC li scrive e successivamente sceglie una destinazione per questi dati, il microcontrollore fa il resto.

A causa della limitata memoria del AT90S2313 non ho potuto allocare array piu' grandi, questa versione e' in grado di pilotare gruppi di 16 led RGB connessi ai pin della porta D del microcontrollore, quindi dopo aver saltato i pin PD0 e PD1 (che sono quelli della seriale) rimangono 5 pin per pilotare altrettanti gruppi di led. Al momento e' solo una demo giusto per stuzzicare gli appetiti, il progetto completo prevede che un Raspberry-pi piloti una lampada RGB da salotto basata appunto su questi led.

led controller
Controller per led RGB

I registri

Il controller espone un array di registri a 16bit accessibili tramite protocollo ModBus. L'array e' cosi' organizzato:

Address Reg high
byte
Reg low
byte
r/w Descrizione
0x0060 Ctrl r/w Control register.
0x0062 R 0 G 0 r/w RGB table 1.
0x0064 G 1 B 0 r/w  
0x0066 B 1 R 1 r/w  
0x0068 R 2 G 2 r/w  
0x006a G 3 B 2 r/w  
0x006c B 3 R 3 r/w  
0x006e R 4 G 4 r/w  
0x0070 G 5 B 4 r/w  
0x0072 B 5 R 5 r/w  
0x0074 R 6 G 6 r/w  
0x0076 G 7 B 6 r/w  
0x0078 B 7 R 7 r/w  
0x007a R 8 G 8 r/w RGB table 2.
0x007c G 9 B 8 r/w  
0x007e B 9 R 9 r/w  
0x0080 R 10 G 10 r/w  
0x0082 G 11 B 10 r/w  
0x0084 B 11 R 11 r/w  
0x0086 R 12 G 12 r/w  
0x0088 G 13 B 12 r/w  
0x008a B 13 R 13 r/w  
0x008c R 14 G 14 r/w  
0x008e G 15 B 14 r/w  
0x0090 B 15 R 15 r/w  

Per quanto la disposizione possa sembrare fantasiosa e' in realta' veramente semplice e rigorosa: l'array inizia con un registro di controllo a 16bit, per il momento lasciamolo da parte. Dopo il registro di controllo inizia una tabella GRB (purtroppo il led non sono organizzati nel classico ordine RGB, ma seguono un ordinamento GRB), la tabella e' lunga a sufficienza per descrivere il colore di 16 led, per un totale di 48 byte (3 byte per led).

A causa della scarsa quantita' di RAM presente nel microprocessore del controller non e' possibile scrivere tutta la tabella (48 byte) in un'unica transazione ModBus, per questo la tabella viene divisa in due e scritta con due transazioni successive.

Dopo aver completato la tabella RGB (RGB per semplicita' di comprensione) si esegue un'operazione di scrittura sul registro di controllo. Il registro a 16bit e' organizzato come segue:

Address Reg high
byte
Reg low
byte
0x0060 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 PD7 PD6 PD5 PD4 PD3 PD2 n.u. Trig

I 14 bit piu' alti del registro di controllo costituiscono una maschera che definisce su quale linea fisica sono collegati i 16 led da aggiornare, solitamente solo un bit alla volta di questa maschera viene settato. Il bit meno significativo ha la funzione di trigger: se settato avvia il processo di aggiornamento dei led. Di fatto scrivere il registro di controllo senza settare il bit 0 non ha alcun effetto.

write sequence
Sequenza di aggiornamento di un faro

Qui sopra la sequenza di aggiornamento di un grippo di 16 led vista all'oscilloscopio: a 20ms/div una scrittura completa dura all'incirca 160ms. Da notare che se la configurazione dei gruppi di led fosse la stessa per tutti i gruppi, con la sola scrittura mostrata sopra, sarebbe possibile aggiornarli tutti: basterebbe settare tutti i bit nella maschera scritta nel registro di controllo.

I collegamenti

Al momento sto usando una demo di prova molto casalinga, era stata concepita come controller per servomotori, ma si presta molto bene anche a questa applicazione. Fondamentalmente si tratta di un AT90S2313 direttamente collegato ad un array di pin strip.

controller pinout
Controller pinout

Le note riportate a fianco al connettore indicano la numerazione dei led secondo lo script 'light' contenuto nella demo.

La demo

Scaricate la versione piu' recente di rgbled, salvate il file in una directory di lavoro e procedete come segue:

  $ tar -zxvf rgbled-x.yy.tar.gz
  $ cd rgbled-x.yy
  $ make
  $ make bin
  $ make burn
  $ cd colors
  $ make
  $ ./demo.sh
      

Se non avete bisogno di ricompilare e installare il progetto sulla target board, allora potete saltare alle ultime 3 righe. La directory 'colors' contiene un programma di ausilio e alcuni script che permettono di controllare direttamente il colore dei led.

Potete utilizzare direttamente lo script 'light' digitando direttamente:

  $ ./light 1 [10,0,0] [0,0,10]
  $ ./light 2 [0,10,0] [0,0,10]
  $ ./light 3 [0,0,10]
  $ ./light 4 [10,0,0]
      

Seconda versione

Dopo diversi anni ho deciso di acquistare un pannello 8x8 LED, giusto per vedere se e' in grado di fare da lampada. Si e' subito posto il problema del pilotaggio, quindi ho fatto una piccola modifica il mio driver, e' nata la versione 0.05. Non e' molto diversa dalla precedente, semplicemente visto che un AT90S2313 non ha abbastanza memoria per pilotare in modo mirato 64 LED diversi (e io non ho voglia di mandargli 64 colori diversi), ho modificato la routine di trasferimento verso i LED perche' riciclasse gli stessi colori per piu' LED. Ho organizzato il pannello 8x8 in 4 quadrati concentrici, in modo che con solo 4 colori differenti posso pilotare tutto il pannello.

Il risultato e' un array di registri colore molto piu' corto e semplice da maneggiare.

Address Reg high
byte
Reg low
byte
r/w Descrizione
0x0060 Ctrl r/w Control register.
0x0062 R 0 G 0 r/w Center
0x0064 G 1 B 0 r/w  
0x0066 B 1 R 1 r/w Ring 1
0x0068 R 2 G 2 r/w Ring 2
0x006a G 3 B 2 r/w  
0x006c B 3 R 3 r/w Ring 3

Anche il registro di controllo e' un po' ridotto: questa versione pilota solo 8 pannelli collegati alla porta B, la porta D non viene utilizzata.

Address Reg high
byte
Reg low
byte
0x0060 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 n.u. n.u. n.u. n.u. n.u. n.u. n.u. Trig

Questo il controller collegato al pannello 8x8.

8x8 LED panel
Pannello 8x8 LED

Anche in questo caso e' incluso un piccolo esempio dal nome demo.sh, giusto per non lasciare il mio pubblico a bocca asciutta, ad ogni modo riporto qui sotto alcuni esempi.

  $ ./demo.sh
  $ ./light 1 [10,0,0]
  $ ./light 1 [0,10,0] [0,0,10]
  $ ./light 1 [10,0,0] [0,10,0] [0,0,10]
  $ ./light 1 [0,10,10] [0,10,10] [0,10,10] [0,10,10]
      

L'assorbimento

Ma quanto consumano questi LED?

Questa la domanda da un milione di dollari. Nella rete si trovano diverse risposte. Io personalmente, dopo diverse misure, sono arrivato alla valutazione di 13mA per colore al massimo dell'intensita', cui bisogna aggiungere 1mA sempre presente per alimentare il chip stesso.

Secondo questi dati l'assorbimento massimo per singolo LED rgb alla massima intensita' dovrebbe essere di 13*3+1mA=40mA.

Purtroppo la mia esperienza personale non mi permette una valutazione migliore, suggerirei comunque un margine di surezza di buon 20% sulla corrente totale messa a disposizione dall'alimentatore.

Download

rgbled-0.01.tar.gz Led controller firmware + demo code.
rgbled-0.03.tar.gz
rgbled-0.04.tar.gz
rgbled-0.05.tar.gz
modread-0.02.tar.gz Implementazione ModBus per Linux, richiesta dalla demo.

Costruzione della lampada

Dopo due anni di lavoro sono finalmente riuscito a completare la lampada da salotto che sara' basata su questo controller RGB, qui
il link se siete interessati al lavoro.


Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation e chiunque scriva software libero.