Ho questo disply a 4 cifre e 12 pin che vorrei collegare con Arduino ma non riesco a trovare uno schema che utilizzi questo tipo di display. Sono riuscito a salitre al datasheet e quindi stabilire che si tratta di un modello a catodo comune ma nient'altro. Mi potete dare qualche indicazione, link.....
Infatti, anche dal datasheet si vede che sono internamente gia connessi tutti i segmenti uguali in parallelo, e che i catodi sono indipendenti.
Per poter usare quel tipo di display ti serve per forza di multiplexarli (in pratica, il micro ne pilota uno alla volta, accendendo di volta in volta i relativi segmenti, in modo molto veloce, per cui all'occhio sembrano tutti accesi contemporaneamente) ... la configurazione minima e' di usare 7 resistenze ( 8 se devi usare anche il punto decimale ) connesse fra i pin dei segmenti ed i pin di arduino, dimensionate per un massimo di 15mA (ad esempio sui 330 ohm), piu 4 transistor pilotati da altre 4 uscite di arduino per i catodi (devi poi ovviamente scrivere il software per pilotarci i segmenti ed il multiplexing, su questo Leo e gli altri sono molto piu esperti di me, io al massimo ti posso buttare giu lo schema elettrico) ...
Si possono usare anche altri sistemi, se si devono usare meno pin, tipo uno shift register, ma se vuoi farci per ora solo degli esperimenti, puoi iniziare con il multiplexing diretto.
ok sto iniziando a capire, quindi penso che la cosa piu giusta adesso e munirmi di multiplexer e poi chiederti aiuto per lo schema, cosi almeno ho modo di provarlo direttamente, il multiplexer è la scelta migliore perche questo display dovra esssere utilizzato come cronometro (minutiminuti.secondisecondi)
Una domanda da novizio dal data sheet ho capito come hanno illustrato i pin ma per capire la numerazione come è stat fatta per capire i pin corrispondenti come devo fare(tenedo il display difronte parto dal basso e poi verso destra in senso antiorario da 1 a 12?)
nikola291:
penso che la cosa piu giusta adesso e munirmi di multiplexer
Il multiplexing lo devi fare tu, non è un componente che acquisti
Se il display è a catodo comune, non si può pilotare in multiplexing direttamente con l'Arduino perché rischieresti di bruciare i pin del chip: se accendessi tutti i 7 segmenti di una cifra contemporaneamente, anche ammettendo di usare una corrente bassa, diciamo 10 mA, tollerata dai pin, riverseresti questa corrente di 70 mA (7*10 mA) in un unico pin collegato al catodo, friggendolo, visto che esso può gestire al max 40 mA.
Devi per forza usare un altro sistema come quello suggerito da Etemenanki, 4 transistor per mandare a massa i 4 catodi.
Per gli anodi, usa uno shift register, è più sicuro, eviti di sottodimensionare le resistenze dei segmenti LED e bruciare i pin della scheda.
Detto questo, la modalità per accendere le cifre è la seguente:
inizi con tutti i catodi aperti, così non si accende nulla
dai corrente ai segmenti che compongono il numero che vuoi rappresentare nella 1a cifra e poi chiudi a massa il primo catodo
fai passare un certo lasso di tempo
apri quel catodo, e setti i pin per il numero sulla 2a cifra
chiudi a massa il 2° catodo
fai passare un certo lasso di tempo
ecc..
Il "certo lasso di tempo" lo devi calcolare affinché la frequenza di aggiornamento non sia inferiore ai 30 Hz, soglia sotto la quale l'occhio umano riesce a percepire il cambio di cifra per cui inizi a notare lo sfarfallìo dell'immagine.
Non deve neanche essere troppo elevata perché se non tieni la cifra accesa per un tempo sufficiente, non dai modo ai led di emettere abbastanza luce, e questi risulteranno di debole luminosità.
Devi fare dei test e trovare il giusto bilanciamento.
le connessioni possono essere di due tipi, diretta o con uno shift (o un driver) ... ti ho fatto un paio di disegni di entrambe le possibilita'.
Nel primo caso non usi uno shift register, ma piloti i segmenti direttamente con i pin di uscita di arduino, ma in questo modo oltre ad occupare molti piu pin, devi fare attenzione che la corrente richiesta da ogni pin non superi la soglia massima come ha precisato Leo, altrimenti rischi di friggere il micro ... quindi non bisogna usare valori troppo bassi, indicativamente starei su un minimo di 330 ohm, meglio se 390, ed i display non saranno mai troppo luminosi.
Nel secondo caso, per pilotare i segmenti usi uno shift register ... in questo modo si usano molti meno pin, ma devi scrivere il tuo sketch in modo da pilotare lo shift (con il comando shiftout, se non ricordo male) e poi trasferire il contenuto dello shift alle uscite con un impulso sul latch ... un piu complesso, ma ha anche il vantaggio di poter dare piu corrente ai segmenti per farli risultare piu luminosi, usando resistenze di valore piu basso, ad esempio 270 o 220 ohm (non esagerare, c'e' sempre il limite di corrente dello shift, ma e' piu alto di quello del micro, circa 35mA invece di 20)
Se non sbaglio per arduino c'è una libreria per questi display, però non so come si chiama per cui ti consiglio di cercare nel playgroud.
Io ho usato un buffer di 4 caratteri, su cui scrivo il dato che voglio visualizzare. Ho usato una funzione che viene eseguita ogni
4 ms aggangiata ad un timer hardware interno al microcontroller, quando scrivo nel buffer però disabilito gli interrupt e li riabilito a scrittura terminata.
La funzione eseguita ogni 4ms fa più o meno quello che ha spiegato leo, cioè prendi il buffer[0] lo converti nella codifica 7 segmenti e accendi gli 8 bit di una porta, alla prossima chiamata spegni la porta prendi il buffer[1], converti e imposti la porta e via di seguito fino a buffer[3], per poi ripartire da buffer[0] e così all'infinito.
Sfruttando le 4 uscite di catodo puoi anche gestire 4 tasti a costo zero.
Se vuoi posso postare il codice C, no arduino style, però è lunghetto, e usa altre librerie e quindi non lo puoi direttamente usare, ma puoi prendere spunto per scrivere tuo codice.
In un progettino che ho fatto come "giocattolo" ho usato anch'io la scrittura in background, questa volta con il leOS che mi accende ogni 5 ms i led di una cifra a rotazione.
//displays the value of the timer on the display
void showDisplay() {
byte num;
num = mainCode[cipher];
if (activeDisplay) {
PORTD = (1<<cipher);
} else {
PORTD = 0;
}
PORTC = num;
if (cipher > 0 ) {
cipher--;
} else {
cipher = 3;
}
}
Spedisco i dati direttamente alla porta ed uso anch'io un buffer (mainCode) dove mettere il dato da visualizzare, una cella per cifra. Accendo poi in rotazione l'anodo che mi serve tramite 4 transistor collegati ai pin di un'altra porta. activeDisplay mi serve per far lampeggiare le cifre visualizzate in determinate condizioni (tramite un altro task, metto ad 1 oppure a 0 la variabile). PS: ho usato un 74LS47 ed un display ad anodo comune ma il concetto non cambia.