THE BIG ONE

torna alla Home Page




Le dimensioni contano...

Per la serie "I display non sono mai abbastanza grossi", questa è la volta buona che ne faccio uno come dico io !

Il progetto

I display a 16 segmenti mi hanno sempre affascinato, ho provato a usarli, ma non sono mai riuscito a trovare un driver economico e dei digit dalle dimensioni che mi andavano bene. Quindi, dopo averci pensato un pò, mi sono detto: e perchè non farli in casa ?

Ovviamente il singolo display dovrà essere a 16 segmenti, e grande a sufficienza per essere visibile da lontano. In piu dovrà essere modulare, in modo da poter collegare in cascata tutti i display che si vogliono.

Cosa serve

Prima di tutto la lista della spesa per ogni modulo:

  • Strip di led, colore a scelta. Densità: 120 LED/metro
  • Basetta millefori 16x10cm
  • 2 shift register SN74HC595
  • 2 array darlington ULN2803
  • pazienza

La lista è abbastanza limitata, ma tenete conto che dovete moltiplicarla per il numero di moduli che intendete realizzare. Considerando che una strip di led è da 5 metri, e per ogni modulo occorrono 10 strisce da 5 cm più 6 strisce da 2,5cm (in totale 65cm), ci potete ricavare 7 moduli.

Fate attenzione al tipo di strip: è consigliabile quella NON-waterproof, in quanto l'isolamento è parecchio noioso da rimuovere per ogni contatto da saldare, e ci sono parecchi contatti come potete vedere dalla foto a destra. Meglio avere la strip senza rivestimento, già pronta per la saldatura.


Shift register ? 

Gli integrati HC595 sono degli shift-register, il cui funzionamento è ampiamente descritto nella pagina dedicata del sito istituzionale di Arduino. Per farla breve, e per chi non ha troppa dimestichezza con l'inglese, si tratta di un chip che riporta sulle proprie uscite gli 8 bit che formano il byte inviato alla sua porta di ingresso. Ad ogni caricamento di un nuovo byte, quello esistente viene "spinto" verso la sua uscita, che può alimentare a sua volta un altro shift-register collegato in cascata. Il risultato è la presentazione sulle uscite dei byte inviati di tutti gli shift-register presenti.

Nello specifico, per usarlo occorrono tre pin: uno di "clock", uno di "latch" e uno di "data". La funzione shiftOut() di Arduino provvede al trasferimento del byte, e ogni volta che viene invocata, lo shift-register incorpora il nuovo bye, buttando quello  precedentemente memorizzato verso la propria uscita. In questo modi, mettendo in cascata diversi shift-register si può tenere memorizzato il pattern desiderato, ricordando che l'ultimo  byte della sequenza è quello che resterà sul primo shift-register di tutta la catena.

LED... ma quanto mi consumi ?

Ora facciamo due conti sulle strip da 12V che andrò ad usare: in realtà sono gruppi paralleli di 3 led in serie, con una resistenza di limitazione di 150 Ohm (nel caso di una strip con led blu), ognuno dei quali assorbe circa 20mA, collegati in parallelo secondo lo schema sotto riportato:

Un digit da 16 segmenti, realizzato come l'ho fatto conta 10 strip da 6 led, e 6 strip da 3 led, per cui abbiamo:

Dalla teoria alla pratica

Dal momento che lo shift register da solo non è in grado di sostenere più di una decina di mA per ogni pin di uscita, occorre uin amplificatore che sia in grado di reggere il carico delle strip. Il chip ULN2803 è proprio quello che serve, è un driver "open collecor" pilotabile direttamente da segnali TTL, che può alimentare carichi fino ad un massimo di 500mA totali. 

Anche se secondo i calcoli fatti prima siamo poco oltre la soglia massima, conto sul fatto che nessun simbolo significativo corrisponde a tutta la matrice accesa, e che userò la modulazione PWM per abbassare la luminosità (vedi linea 12V associata al driver PWM). 

Mettendo insieme lo schema dello shift register e del driver ULN, moltiplicato per due in quanto il display è a 16 segmenti, ottengo lo schema riportato qui sotto, che si può ovviamente ripetere per tutti i display che si vogliono mettere in serie.

Personalmente ho adottato la regola che il primo shift register si occupa dell'anello esterno (lettere da "A" ad "H"), metre il secondo si occupa della doppia croce interna (lettere da "K" a "M")



Proviamo come va


Detto fatto, ho realizzato il primo prototipo, montando il tutto su una perfboard standard, di 16x10cm. La prima difficoltà è stata come incollare in modo accurato le strip evitando un aspetto "da ubriaco". 

Si sa che la necessità aguzza l'ingegno, e prendendo lo spunto della tecnica del "toner transfer" per fare i circuiti stampati, ho usato lo stesso metodo per trasferire il disegno, fatto prima in scala 1:1, direttamente sulla vetronite e non sul lato ramato (il video finale mostra come).

Come si può notare, i quattro bracci diagonali sono leggermente sovrapposti a quelli verticali, per cui occorrerà avere l'accortezza di tagliare gli angoli delle strip che si sovrappongono per poterle incollare in piano. 

I collegamenti ad Arduino sono limitati alle tre linee di controllo (Data, Latch e Clock), la massa comune e  la linea 5V. 

L'alimentazione principale è costituita dalla linea a 12V, usata per alimentare sia gli anodi delle strip, che per l'Arduino, entrando sulla linea Vin che accetta 9-12V

Il codice di test è al questo link, mentre qui sotto vedere il video del primo prototipo in funzione con diversi simboli in rotazione continua. Citazione obbligatoria: si ... può ... fare !!!





Controllo della luminosità

Per evitare di tenere accesi i segmenti sempre alla massima luminosità, con il rischio di fondere il povero ULN, a questo punto ho pensto a modulare la tensione di alimentazione con un segnale PWM, che il nostro buon Arduino ci elargisce con un paio di righe di codice (ma anche una sola).

Sto parlando ovviamente dell'istruzione writeAnalog, che fa generare sulla porta voluta un segnale PWM la cui modulazione è proporzionale al valore indicato, che va da 0 a 255.

Il segnale PWM verrà applicato ad un transistor, che pilota un MOSFET a canale P, il quale a sua volta è collegato al carico (strip). Il transistor intermedio serve in quanto il Gate del MOSFET viene portato a 12V (tramite una resistenza da 10K) per tenerlo normalmente in interdizione, ma questa tensione farebbe del male al nostro Arduino, che gradisce un massimo di 5V.

Nello schema sottostante, ho incluso anche il cablaggio relativo alla scheda Arduino, di cui ho usato i pin digitali 6 per il segnale PWM e 7/8/9 per la gestione dello shift register.





Gran finale

La "proof of concept" ha dato esito positivo, ora si tratta di comperare abbastanza materiale da eBay per realizzare un cartelllone da 8 digit. Si possono trovare buoni prezzi, ma occorre avere pazienza per ricevere il materiale ordinato, ci potrebbe volere anche più di un mese !

Il video che vedete qui a lato documenta tutta la storiella di questo progetto, con lo stesso sketch del test su un solo digit. L'unica variazione è l'uso di un Arduino Nano invece dell'Arduino UNO, che consente di contenere le dimensioni finali.

Si può vedere che ora ogni pattern passa da un digit a quello successivo ad ogni nuova combinazione. Il codice è stato leggermente modificato per gestire il a luminosità tramite PWM. (qui il link al nuovo sketch)

La cosa interessante è che non essendo di tipo multiplexato, questo schema non richiede che Arduino continui a tenere il display "vivo", ma è sufficiente inviare una sola volta la stringa opportuna: questa resterà visualizzata in modo statico fino al prossimo cambiamento.

Portroppo è più grosso di quello che immaginavo, e sta diventando un problema trovare un posto degno, anche solo per pacheggiarlo, ma voglio essere filosofo: l'importante è il viaggio, non la meta !

CONCLUSIONE E COMMENTI

Nota di creatività extra: non avendo "sbatta" (come dicono i ggiovani) di fare schemi con Eagle, quelli  pubblicati qui li ho fatti con Excel e l'opzione "bordi". Non mi sembrava male come risultato, ma va bene solo per pochi componenti. Se a qualcuno può interessare, questo è il link del file excel.

Leggerò con piacere i vostri commenti, se vorrete scrivermi al seguente indirizzo: mnicolato@hotmail.com




Aggiornato il 5 maggio 2014