13 novembre 2008

Utilizziamo un display grafico

Molti di voi conosceranno sicuramente i display alfanumerici 2 x 16, noti anche come "due righe sedici caratteri", oppure semplicemente "HD44780", in nome del controller tipicamente adottato.


In rete esiste un'infinità di materiale riguardo al pilotaggio di questi display, che peraltro è piuttosto semplice.
In poche parole e' sufficiente inviare alla linea dati i codici corrispondenti ai caratteri da visualizzare; servendosi degli appositi segnali di controllo si specifica la posizione dei caratteri, il lampeggiare del cursore, un'eventuale scritta scorrevole etc.
Chiaramente un display di questo tipo è adatto alla visualizzazione esclusiva di lettere e numeri, e pur avendo a disposizione una discreta scelta di simboli (barre, caratteri speciali etc.) ogni tentativo di visualizzazione "grafica", come ad esempio una barra scorrevole o un diagramma, diventa un compromesso fra la resa visiva e la scelta del simbolo più intuitivo. E' di fatto impossibile visualizzare un'immagine.

A tal proposito, da qualche tempo hanno fatto la loro comparsa i display grafici, o a matrice di punti, nei quali l'area di visione è uniformemente ricoperta da pixel.
Le risoluzioni sono relativamente alte, si va dai display 64 x 64 dei telefoni cellulari, passando per i 128 x 64, 128 x 256 etc. fino a display VGA da 640 x 480 pixel e oltre.

Come è intuitivo, il pilotaggio di questi display è più complesso rispetto al protocollo testuale del 44780, ma fondamentalmente la struttura è la medesima: la stringa di caratteri alfanumerici del 44780 è semplicemente sostituita da un insieme di coordinate vettoriali, da gestire opportunamente mediante i segnali di controllo. Nella maggior parte dei casi basta inviare al display la sequenza di accensione e spegnimento dei singoli pixel, spazzando l'intera superficie. Un po' come se si dovesse riempire una matrice casella per casella, a gruppi di otto bit alla volta.

Se il display va collegato ad un computer, l'elaborazione preventiva dell'immagine deve essere gestita dal software di pilotaggio, ma la quantità di programmi già scritti per questa specifica funzione rende il compito abbastanza agevole.
Se si lavora con un microcontrollore, il lavoro è ulteriormente semplificato dall'abbondante presenza di librerie e pacchetti software ad hoc, da incollare direttamente nel proprio codice.

Il display in esame.
Ho avuto modo di interessarmi a questi display quando ho reperito un PG12864A, recuperandolo da un pc palmare industriale (recuperato al ferrovecchio, quindi a costo zero!); nel momento in cui l'ho visto è scattata una curiosità irrefrenabile, che mi ha portato ad un primo approccio basato sul pilotaggio mediante pc (di fatto è il modo più semplice e rapido per sfruttare i display grafici di una certa complessità come questo).

Tecnicamente il PG12864A e' solo uno dei tanti display da 128 x 64 pixel basati sul controller KS0108, molto diffuso e collaudato.

Ecco una foto del display, davanti:


e dietro:

Si nota subito la presenza di una fila di 20 contatti. Dal datasheet del display e' immediatamente intuibile la somiglianza con la piedinatura dei classici 44780; di fatto le uniche differenze hardware riguardano alcuni pin di controllo.

L'interfaccia con il computer.
Il modo piu' diretto e semplice per sfruttare questi display e' un'interfaccia parallela (unidirezionale, anche SPP va bene) verso un computer fisso; non solo per l'esiguo hardware necessario, quanto per la maggior semplicita' nella gestione e visualizzazione dei contenuti. Supponendo infatti un'implementazione su microcontrollore, bisogna necessariamente mettere in conto un sostanzioso quantitativo di memoria nel quale conservare tutti i frame e le immagini!
Il collegamento al pc permette inoltre la visualizzazione dei contenuti piu' vari, dalle note interfacce per winamp allo stato della rete, dalle temperature interne al pc all'utilizzo della memoria RAM, solo per fare alcuni esempi.

Sostanzialmente lo schema da realizzare ricalca questo esempio:



ATTENZIONE: Lo schema riporta una piedinatura assolutamente generica per il display; all'atto della realizzazione, è necessario controllare l'effettiva piedinatura del proprio display, e prevedere gli eventuali adattamenti.

Si nota l'assoluta semplicità di questa soluzione, che prevede un collegamento immediato e diretto fra i pin della porta parallela e i corrispondenti pin del display.
Ovviamente questa e' la soluzione piu' rudimentale; personalmente ho realizzato un'interfaccia utilizzando gli arcinoti 74LS245, buffer ottali bidirezionali, che per questa applicazione sono in effetti un po' sprecati.

Da notare anche la presenza di un pin indicato con "Vout". Ebbene, da tale pin esce una tensione negativa di circa -10V, generata internamente dall'elettronica del display, che è necessaria per l'alimentazione del pannello LCD.
Mediante un trimmer da 10Kohm fra questo pin e la massa, prima di rientrare nel pin "Vo", si ottiene la regolazione del contrasto.

Per il collegamento alla porta parallela ho usato un cavo flat da 20 poli, che si e' rivelato particolarmente versatile e riutilizzabile per i progetti futuri.


L'interno:



Per il collegamento al display ho utilizzato un'interfaccia IDE da 40 poli; ne utilizzo solamente la metà, ma la praticita' di questa soluzione non ha rivali.
Per completare l'opera ho aggiunto un regolatore 7805 e il trimmer per il contrasto sulla stessa scheda. I 40 poli dell'interfaccia IDE mi possono tornare utili per realizzare contemporaneamente un'interfaccia per display grafici e alfanumerici, sfruttando semplicemente le due righe di contatti una alla volta.
In futuro perfezionero' l'interfaccia per gli alfanumerici.

La scheda di interfaccia risulta quindi cosi' costituita:


Trattandosi di scheda millefori, la parte posteriore e' molto popolata; in effetti il lavoro piu' lungo e' stato il collegamento dei fili verso i vari connettori:


Il lavoro non sara' pulito ma e' molto robusto e versatile. Nasce da qui la naturale considerazione sulla scelta dei buffer. Qualcuno potrebbe chiedersi: come mai non usare dei 74LS244? Osservando il datasheet, in particolare l'effettiva disposizione dei buffer interni, la risposta e' evidente: nel '245 i buffer sono tutti allineati, e gli 8 pin adiacenti possono essere assegnati tutti ad ingresso o ad uscita, mentre nel '244 si ha l'alternanza di un ingresso con l'uscita del pin opposto.

Inizialmente avevo fatto un tentativo (funzionante peraltro) di utilizzo dei 244, con questo risultato:


La confusione regna sovrana. Confesso di non aver previsto un tale groviglio di collegamenti; l'utilizzo di un 74LS244 e' vantaggioso praticamente solo nel caso di PCB realizzati appositamente, o nel caso in cui lo si utilizzi in modo "trasversale", ossia con gli ingressi in testa e le uscite ai piedi del chip, in modo da evitare troppi accavallamenti.

Nel suo complesso l'interfaccia risulta cosi' composta:


Il software.
Per la gestione di questi display esistono numerosi software, piu' o meno "artigianali". Personalmente ho usato LCDHype (Home), che ho trovato piuttosto intuitivo e ricco di funzioni pre-compilate per chi (come me) non ha molta voglia di star li' a programmare!
Esistono altri programmi piu' specifici, indicati ad esempio per le interfacce Winamp.

I piu' noti:
LCDStudio, analogo a LCDHype: Home
Microchipc, per le librerie da scaricare nei microcontrollori serie PIC: Home
LCDSmartie, piu' adatto per display alfanumerici es. 4 x 40: Home

Un interessante articolo di Hardware Upgrade in merito al noto programma jaLCDs: Articolo.

Alcuni esempi di funzionamento.

L'interfaccia per Winamp:


L'interfaccia a barre, sempre per winamp:


Visualizzazione di un'immagine:



Un orologio analogico:




Tutte le immagini sono visibili in alta risoluzione su PICASA.

4 commenti:

  1. Perchè utilizzare dei buffer? Le linee di controllo dell' LCD non assorbono tanta corrente da giustificare l'utilizzo di un buffer. E' forse per una questione di sicurezza?

    RispondiElimina
  2. Ciao, e grazie per aver letto il mio blog!

    Certamente, i buffer garantiscono solo un po' di sicurezza in più nel collegamento con la porta parallela; non si sa mai quale guasto possa capitare, lavorando con cavi volanti e display sconosciuti. L'ideale sarebbe integrare i buffer internamente al PC, ed uscire dal case direttamente con il cavo flat!

    RispondiElimina
  3. Ciao ho un lcd di una videocamera ho visto che ci sono dei chip in uno c'è scritto an2545n e in un altro a21sc si può riutilizzare per interfacciarlo con arduino?la video camera e una samsung vp-d20

    RispondiElimina
  4. Ciao,
    A giudicare dal datasheet del circuito integrato AN2546FH http://pdf1.alldatasheet.com/datasheet-pdf/view/98872/PANASONIC/AN2546FH-A.html che è parente del 2545, dovresti poter usare comodamente il display anche con un segnale videocomposito. Per l'Arduino la vedo un po' dura, dovresti bypassare il 2545 e lavorare direttamente con i segnali R G e B. La via più comoda è convertire la palette grafica generata da Arduino in videocomposito con un IC intermedio, e usare il display come se fosse un monitor TV. Buon lavoro!

    RispondiElimina

Grazie per il tuo commento!

Electronic Affiliate

DISCLAIMER

Qualsiasi progetto, foto, o schema presentato nel blog è esclusivamente a titolo esemplificativo della mia personale esperienza.
Declino ogni responsabilità per ogni conseguenza a cose, persone ed animali, derivante dall'utilizzo delle informazioni contenute nel blog.