Pilotare correttamente display a 7 segmenti SA23-12SRWA

Salve, sono semi-nuovo del forum. Ho realizzato un progetto relativamente banale con Arduino Uno R3: si tratta di un orologio da crossfit con funzioni basilari quali, data, ora, cronometro, timer e tabata (sequenza automatica di timer ripetuti). Il tutto è funzionante su breadboard, con display a 7 segmenti ( sono 6) di ridotte dimensioni, quelli classici, pilotabili direttamente da arduino, a catodo comune. Ho adottato la tecnica del multiplexing, utlizzando anche uno shift register ( lo 74ch595) per utilizzare il minor numero possibile di pin su Arduino. Seleziono poi i display con dei transistor classici NPN bc547.

Le difficoltà le incontro nel passare alla realizzazione vera e propria, con display piu grossi, gli SA23-12SRWA. nessun problema per portare l'ATmega328p su basetta millefori ( utilizzo un alimentatore a 12v, tagliato a 5V con un 7805 ). da quello che ho capito, non posso collegare lo shift register direttamente ai display, ma devo metterci di mezzo un uln2803a, array di transistor Darlington perchè i display assorbirebbero troppa corrente per il register. Ora il problema viene con i transistor per selezionarli nel multiplexing: essendo questi display ad Anodo Comune, devo ( penso ) passare ai PNP. Non capisco però come fare a pilotarli, avendo a disposizione solo i 5V di un pin Arduino, e dovendo collegare Emettitore (12v) con Collettore ( pin anodo del display). Inoltre quanta corrente devono supportare? Immagino la totalità della corrente in caso i led di un solo display siano tutti accesi. E' una corrente considerevole ( oltre 600 ma). Avete qualche dritta da darmi? Delucidazioni e altro è tutto ben accetto! Grazie a tutti!!

Dal data sheet del SA23-12SRWA si ricavano 20mA per segmento. Da dove ti derivano gli oltre 600mA? A me ne risultano al massimo 160 con tutti i segmenti + dot point accesi.

Ciao,
P.

Ciao, grazie per l'attenzione. Hai perfettamente ragione, ho fatto evidentemente confusione, non so nemmeno io se ho moltiplicato per i 6 digit o ho sommato le correnti erroneamente ( per ogni singolo led in ogni segmento). Per cui dallo shift register posso senza problemi interfacciarmi con quel display proprio come faccio ora. Rimane il problema del PNP. Hai qualche idea? Grazie ancora!

Edit: ma se utilizzassi ancora i transistor NPN bc547? Ci sarebbero problemi?

Per il multiplexing devono essere utilizzati dei PNP tipo BC327 che reggono 800mA max. Purtroppo non sono un circuitista e non ti posso aiutare per pilotarli. Mi ricordo di aver visto un circuito con un NPN (per pilotare il PNP), ma non ricordo com'era fatto. L'unica soluzione che mi viene in mente è un optocoupler: piloti il led con il multiplex e usi il transistor per comandare la 12V. Bisogna vedere corrente e tempi di commutazione.

Ciao,
P.

… intendi questo ?

esempio-opencollector.png

Se ne servono un po, c’e’ anche l’UDN2981, che e’ l’equivalente PNP dell’ULN2803 in NPN :wink:

Con un solo NPN non ce la fai.
ecco un paio di modalita'


Se usi due NPN ricordati che il segnale di uscita è invertito

oppure si potrebbe usare un Source driver , tipo Questo

Grazie a tutti ragazzi, mi state chiarendo le idee di parecchio!! Non vedo l'ora di tornare a casa e mettere mani al saldatore (si, avevo iniziato senza aver controllato che tutto fosse a posto, ah la scimmia:D )

Etemenanki:
... intendi questo ?

Sì, Etemenanki, propio quello.
Memorizzato nel block notes dei circuiti da ricordare.
Grazie

Ciao,
P.

Etemenanki:
… intendi questo ?

esempio-opencollector.png

Se ne servono un po, c’e’ anche l’UDN2981, che e’ l’equivalente PNP dell’ULN2803 in NPN :wink:

una domanda:

come calcoli la resistenza di 47K nel primo schema con NPN? Grazie in anticipo.

Se intendi la resistenza fra base e massa, non "si calcola", perche' non e' uno stadio di amplificazione o conversione ... in questo utilizzo, sia quella sul NPN del primo schema, sia quella sul PNP dello schema corretto, servono a portare la base al valore di tensione degli emettitori in caso si scollegasse qualcosa a causa di un guasto o di un'incidente o falso contatto, in modo da evitare che il transistor vada in conduzione a causa di disturbi o segnali parassiti se rimanesse con il circuito di base aperto ... sono una specie di "sicura", che in genere a livello industriale si mette sempre, a prescindere dal fatto che possa servire, ed e' un valore qualsiasi che puo andare da 47K a 100K, tale comunque da non interferire con il normale funzionamento ... ovviamente, se il sistema e' tutto saldato e se il transistor non pilota altro che qualche led o lampada, si puo anche evitare di metterle, ma per prudenza e' meglio abituarsi ad inserirle sempre negli schemi ... metti ad esempio che il transistor pilotasse qualche motore o generatore AT, per qualsiasi motivo la base o il pin della logica si scollega, ed il tutto parte quando non vuoi a causa di disturbi RF ... meglio se non puo succedere, giusto ? :wink:

Ah ok, sono delle classiche resistenze di "pull down", corretto? Nel frattempo ho provato il primo schema consigliato da Brunello(npn con in cascata un pnp), ma qualcosa non va, ora controllo e mi accerto che il problema sia sui transistor, in caso posto tutto lo schema con qualche foto ( se possibile).

ogni volta che leggo uno che vuole usare i 7 seg senza il max 7219
gli consiglio di usarlo,

poi sicuro di avere le capacita di programmazione minime per far visualizzare un numero corretto a i 7 seg?

visualizzare un numero correttamente su 6 cifre non è un impresa da poco
che significa spegnere le cifre più a sinistra se un numero a poche cifre :confused:
se è un numero col meno davanti il meno dovrebbe stare vicino alla prima cifra di sinistra,
se un numero con la virgola come si fa a farla accendere al posto giusto
insomma non è un lcd che invii es 12.3456 e fa tutto lui

elrospo:
ogni volta che leggo uno che vuole usare i 7 seg senza il max 7219
gli consiglio di usarlo,

poi sicuro di avere le capacita di programmazione minime per far visualizzare un numero corretto a i 7 seg?

visualizzare un numero correttamente su 6 cifre non è un impresa da poco
che significa spegnere le cifre più a sinistra se un numero a poche cifre :confused:
se è un numero col meno davanti il meno dovrebbe stare vicino alla prima cifra di sinistra,
se un numero con la virgola come si fa a farla accendere al posto giusto
insomma non è un lcd che invii es 12.3456 e fa tutto lui

guarda, mi spiace, ma hai frainteso tutto. Io ho gia finito lo sviluppo del programma su Arduino. Funziona tutto (oltre 1000 righe di codice, compresa la libreria creata apposta per i display), dall'orologio (utilizzando uno shield esterno), al timer, cronometro e tabata. Sto solamente cercando di passare da display CC che lavorano con i 5 V ( 2.1 ovviamente), a dei display piu grossi con anodo comune.

a tal proposito ieri sera ho fatto un po di prove. Ho escluso per ora lo schema di Brunello per selezionare i display( ho collegato direttamente anodo con 12v), ho voluto ignorare per un attimo i problemi derivati dal multiplexing per vedere se funziona tutto il resto. Cosi ho riprogrammato atmega in modo tale che visualizzi "i" su tutti i display. Ho dovuto quindi modificare la libreria e invertire i Byte inviati allo shift register, avendo ora un AC e dovendo mandare segnale alto per spegnere il led. Il problema è che il segnale alto che atmega mi manda è da 5v, risultato: mi accende bene i led giusti, ma quelli spenti rimangono in realtà accesi con una corrente minore 8mA. Deduco che a questo punto devo utilizzare dei transistor ( con una tecnica simile a quella consigliatami da voi per la selezione dei display) per portare le uscite dello shift register da 5v a 12v, consigli su quale integrato usare? Grazie a tutti, come sempre. :slight_smile:

Come gia suggerito ... l'UDN2981 e' l'equivalente PNP di un ULN2803, e lo puoi usare per pilotarci gli anodi ...

Etemenanki:
Come gia suggerito ... l'UDN2981 e' l'equivalente PNP di un ULN2803, e lo puoi usare per pilotarci gli anodi ...

Si si questo mi è chiaro, ma voglio capire come portare le uscite dello shift register da 5v a 12v. Posso usare qualcosa di simile?

Ma e' proprio a quello, che servono i driver in open-collector ... ad esempio, nei due circuiti corretti (non il secondo che e' un'esempio di come non farlo) proposti prima, solo la massa ed i pin di uscita sono collegati ad arduino, ma NON il positivo, che e' collegato ai 12V ... i transistor collegati in quel modo disaccoppiano la parte 5V da quella 12V, anche se non isolano galvanicamente i due circuiti, in modo da poter pilotare carichi a 12V con il segnale a 5V di arduino ... ed i driver fanno la stessa cosa (sia gli ULN che gli UDN contengono in pratica 8 stadi a collettore aperto, come se li costruissi tu con componenti esterni, solo piu comodi) ... ovviamente, il positivo dell'UDN, in quel caso, NON e' il VCC a 5V di arduino, ma il +12V del tuo carico ... che devi fornire tu con un'alimentatore a parte per la sezione "di potenza" ...

Ok, scusami ma con pilotare i display pensavo (ovviamente sbagliando) ti riferissi alla selezione durante la fase di multiplexing. ora mi chiarisco le idee, ma dovrebbe essere relativamente semplice. Quando avrò finito mi piacerebbe condividere il progetto, nella seziona adatta ovviamente :slight_smile:

Pounii:
guarda, mi spiace, ma hai frainteso tutto. Io ho gia finito lo sviluppo del programma su Arduino. Funziona tutto (oltre 1000 righe di codice, compresa la libreria creata apposta per i display), dall'orologio (utilizzando uno shield esterno), al timer, cronometro e tabata. Sto solamente cercando di passare da display CC che lavorano con i 5 V ( 2.1 ovviamente), a dei display piu grossi con anodo comune.

a tal proposito ieri sera ho fatto un po di prove. Ho escluso per ora lo schema di Brunello per selezionare i display( ho collegato direttamente anodo con 12v), ho voluto ignorare per un attimo i problemi derivati dal multiplexing per vedere se funziona tutto il resto. Cosi ho riprogrammato atmega in modo tale che visualizzi "i" su tutti i display. Ho dovuto quindi modificare la libreria e invertire i Byte inviati allo shift register, avendo ora un AC e dovendo mandare segnale alto per spegnere il led. Il problema è che il segnale alto che atmega mi manda è da 5v, risultato: mi accende bene i led giusti, ma quelli spenti rimangono in realtà accesi con una corrente minore 8mA. Deduco che a questo punto devo utilizzare dei transistor ( con una tecnica simile a quella consigliatami da voi per la selezione dei display) per portare le uscite dello shift register da 5v a 12v, consigli su quale integrato usare? Grazie a tutti, come sempre. :slight_smile:

mah che te devo di ..... hai fatto il "software funzionante" senza il suo hardware,

di solito quando vedo qualcuno che scrive software senza hardware consiglio sempre di scriverlo con l hardware,
almeno su breadboard
se no è una gran perdita di tempo e per di più trovare i bug diventa difficile,

quindi.... usate il 7219 solo per il fatto che fa tutto lui e può variare la luminosità via software
poi non iniziate niente se non c'è hardware almeno su breadbord

:o :confused: :frowning:

elrospo:
mah che te devo di ..... hai fatto il "software funzionante" senza il suo hardware,

di solito quando vedo qualcuno che scrive software senza hardware consiglio sempre di scriverlo con l hardware,
almeno su breadboard
se no è una gran perdita di tempo e per di più trovare i bug diventa difficile,

quindi.... usate il 7219 solo per il fatto che fa tutto lui e può variare la luminosità via software
poi non iniziate niente se non c'è hardware almeno su breadbord

:o :confused: :frowning:

"Il tutto è funzionante su breadboard"....Primo post... terza riga... magari leggilo tutto il post prima di rispondere :slight_smile: