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.
RGB ledTra 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.
I registriIl controller espone un array di registri a 16bit accessibili tramite protocollo ModBus. L'array e' cosi' organizzato:
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:
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.
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 collegamentiAl 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.
Le note riportate a fianco al connettore indicano la numerazione dei led secondo lo script 'light' contenuto nella demo. La demoScaricate 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 versioneDopo 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.
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.
Questo il controller collegato al pannello 8x8.
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'assorbimentoMa 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
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 |
Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation
e chiunque scriva software libero.