La scintilla che ha fatto partire il progetto è stata un video su youTube di un gioco di luci
realizzato con una matrice di 8x8 led RGB; cercando ancora trovato altri esempi, ma sempre basati
su Arduino, piattaforma che non uso. Ho cercato quindi soluzioni con l'uso di PIC senza trovare realizzazioni
complete e dettagliate, soprattutto per il firmware.
Mi sono quindi detto: "questo lo devo fare io, senza copiare in giro"...e così è stato.
Il risultato (ancora in sviluppo a Luglio 2010) è molto soddisfaciente per le numerose sfide, intellettuali
e realizzative, incontrate e risolte.
Gli obiettivi iniziali del progetto sono stati:
Premetto che questo progetto non è funzionale, ma estetico, e l'uso è quindi lasciato alla fantasia del costruttore; per il momento ho previsto queste possibilità di utilizzo:
Il circuito impiega 4 componenti:
L'IC pilota 24 uscite (quindi 8 led RGB) a corrente costante com modulazione PWM su tutte le uscite
Questo significa non preoccuparsi del dimensionamento delle resistenze di comando per i singoli led; una
sola resistenza specifica quanta corrente fa passare in tutti i led e, quindi, offre la possibilità di
modulare la luminosità complessiva con meccanismi di variazione di questa resistenza.
La modulazione PWM permette di controllare la luminosità di ciascun singolo led da 0 al valore massimo; impostando
il valore PWM per i 3 led R,G,B di un singolo pixel si ottengono tutte le sfumature intermedie di colore.
In effetti, il TLC5947 utilizza 12 bit di controllo PWM per ogni led, ovvero 4096 livelli di luminosità;
questo è fin troppo 'granulare' per applicazioni standard e diventa un grosso problema per la gestione SW.
Altro grande vantaggio di questo componente è la scansione automatica e continua delle uscite (refresh), pilotata da un oscillatore on-chip da 4MHz,
e libera quindi il micro da questo impegno (conteggio dei cicli, incremento dei contatori e driving).
Il chip, a 32pin SSOP (sigh!), dispone di una 'porta' SPI Slave (Serial Peripheral Interface) su 3 pin
(SCLK = Serial Clock), SIN = Serial Data In) e SOUT = Serial Data Out);
il pin SDO non è attualmente utilizzato.
I pin di controllo sono 2: Blank, spegne le uscite quando a '1', e XLAT, carica i data dal registro a scorrimento
nel buffer di pilotaggio.
I rimanenti 3 pin solo l'alimentazione (VDD e VSS) e, importante, lo IREF al quale si collega le resistenza verso massa che
stabilisce il valore di corrente costante erogata.
In sostanza l'integrato è un 'lungo' Shift-Register da 288 bit (12bit x 24 led).
I dati sono inseriti nel pin SIN, a partire dal bit MSB (bit 11) dell'ultimo led (23) fino ad arrivare
al bit 0 (LSB)del primo led (0), ad ogni fronte di salita di SCLK.
Al termine dell'invio, un breve impulso (< 1usec) sul pin XLAT trasferisce i dati dallo Shift Register al Buffer
di uscita, sempre da 288 bits. Se il pin BLANK è a 0 (uscite abilitate), il contatore interno da 4096 cicli (12bit)
scansiona le uscite di pilotaggio Led (da Out0 a Out23) in base al contenuto del rispettivo registro, generando un Duty Cycle variabile
da 0% (led spento) a quasi il 100% (led al massimo). La sequenza riprende quindi dall'inizio fino alla successiva
variazione di XLAT o BLANK.
Nella fase 'ON' di ciascun led, la corrente di comando dipende esclusivamente dal valore della resistenza posta
sul pin IREF; per esempio, con un valore di R = 3.3K si ha una corrente di circa 15mA.
Come ogni nuovo progetto, le sfide sono continue e, spesso, in relazione alle scelte fatte.
Innanzitutto, il chip TLC5947 è piccolo (minuscolo!): saldare direttamente il chip sullo stampato è difficile e
rischioso; se qualcosa va storto sono guai a rimuoverlo.
Per la fase di sviluppo e prove ho scelto di saldarlo su un'adattatore SSOP - DIN, acquistato online da NKC; purtroppo
non esistono moduli da 32 pin SSOP per cui ho dovuto usare un modulo da 48pin che eventualmente taglierò a
misura in fase finale (o rischierò il montaggio diretto).
Saldarlo è stata un'avventura, ma è bastata tanta luce, una buona lente, molta pazienza e un pò di birra fresca !
Ho usato il metodo della 'strisciata' di stagno e molto deflussante, come si spiega su Internet...ne ho montati 2 finora
con ottimi risultati.
Per il software è stata ancora più dura!
Come detto, l'inghippo sono i 12bit usati per il pilotaggio; non si sposano bene, anzi malissimo, con l'architettura
a 8 bit del PIC, per diversi motivi:
Quest'ultimo punto forza una soluzione basata sull'emulazione (bit banging) del protocollo.
In altre situazioni (esempio: comunicazione con un ADC) non sarebbe un problema inviare 16bit e considerarne solo 12,
ma in questo caso non si può. Lo Shift Register deve essere 'impaccato' con esattamente 288bit consecutivi.
Teoricamente si potrebbero prendere i blocchi di 12 bit e assemblarli in sequenze da 8 bit, usando alternativamente
4 bit del blocco precedente e 4 bit del successivo; fattibile, ma mostruosamente lento!
Le scelte è stata quindi di utilizzare solo 256 (8bit) livelli di luminosità invece di 4096, che semplifica
parecchio il codice e riesce a far stare una 'frame' in 192 byte di RAM.
La routine in Assembler di comunicazione SPI aggiunge i 4 bit mancanti, a 0 o 1, in testa o in coda al pacchetto.
In pratica, questo comporta che l'insieme di Led possa essere più o meno luminoso, fatto compensabile
con la variazione della resistenza di controllo corrente.
Anche la scelta del PIC 16F88 (per motivi pratici) ha comportato qualche acrobazia.
(... in completamento ...)
Inserito il 30/07/2010