BoxIdee

MODULO A MATRICE 8X8 DI LED RGB

Introduzione

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:

  1. possibilità di ottenere tutte le sfumature di colore permesse da un formato RGB24, ovvero 256 livelli di colore per ciascuna componente
  2. dimensioni contenute del PCB per essere 'ospitato' dietro il modulo matrice.
  3. flessibilità di impiego, ovvero capacità di essere utilizzato 'stand-alone' oppure comandato dall'esterno.

Utilizzo

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:

  • Visualizzazione di una sequeza stabilita (in EEPROM ?) con magari la possibilità di variarne ciclicamente il colore
  • Invio di una sequenca da PC, tramite porta seriale (es. immagini in 'bassissima' risoluzione)
  • Effetto pseudo-luci psichedeliche, mediante un modulo aggiuntivo di filtro e conversione AD di segnali audio
  • Rappresentazione di parametri esterni (es. temperatura, pressione, ecc) con l'interfacciamento a moduli dedicati


Descrizione

Il circuito impiega 4 componenti:

  1. Modulo a matrice di 8x8 led RGB - acquistato su eBay per circa 14 Euro. Non è il massimo come resa visiva in quanto il frontale non è in bianco diffuso, per cui si 'vedono' i singoli led accesi, ma si può sempre cambiare...
  2. MCU PIC16F88 (al momento) scelta perchè ne ho disponibili in quantità, sia DIP che SOIC, e la conosco bene. Se il progetto verrà portato aventi, verrà eventualmente sostituita da un PIC 16F886 o da un PIC 18F2550 a 28 pin (da studiare)
  3. IC TLC5947 di Texas Instrument, il cuore di tutto. Veramente notevole sia in capacità che prestazioni. TI lo fornisce gratuitamente e velocemente come Sample.
  4. IC UDN2981 di Allegro, acquistato sempre su eBay da Honk Kong a circa 2 Euro l'uno. E' in versione DIP18 perchè la versione SOIC non si trova più.

L'integrato TLC5947

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.


Funzionamento del TLC5947

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.



Sfide

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:

  1. la RAM dei 'soliti' PIC non può contenere una 'frame' completa da visualizzare; occorrono 64x3 (192) parole da 12bit, ovvero 16bit, per un totale di 384 byte
  2. la gestione di 2 byte (1 e mezzo in realtà) complica e rallenta il codice
  3. fondamentale, la SPI Hw non consente l'invio di 12bit, ma solo multipli di 8

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



Click su qualsiasi immagine per ingrandire


Piedinatura della matrice led


Disposizione componenti


Schema elettrico


Il banco prova


Chip TLC5947 su adapter TSSOP-DIP48


Finalmente la luce !