Parere tecnico collegamento display led 7segmenti e shift register con arduino

Salve a tutti, ho bisogno di un parere tecnico per il collegamento di un display led (7 segmenti * 4 cifre) ed uno shift register (74HC595) ad Arduino.

Premetto che sono già riuscito a collegare display e shift register ad arduino ed il progetto è già stato testato e funzionante (sia hardware che software),
ora sto cercando di capire se una versione modificata dello schema iniziale produce lo stesso risultato o no,
quindi chiedo il parere di qualcuno che abbia una conoscenza sicuramente migliore della mia in elettronica per capire se è sbagliato o meno quello che dico

Il mio dubbio probabilmente è una questione veramente banale ma non sapendo come spiegarlo in poche parole e per evitare di essere frainteso cerco di essere il più chiaro possibile

Le caratteristiche dei componenti usati sono:

Arduino Uno Rev3

Classico display a led a 7 segmenti (cifre di colore biano)

Shift register 74HC5959

  • Tensione di pilotaggio: 5Vcc
  • Massima frequenza di clock: 100MHz (in teoria mi sembra di aver capito che se alimentato a 5V dovrebbe essere più o meno la metà)
  • Massima corrente emessa da ogni pin: +/-35mA
  • Massima corrente assorbita da ogni pin: +/-20mA
  • Massima corrente tra VCC e GND: +/-75mA
  • datasheet: http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf

Lo schema del circuito è il seguente (chiedo scusa per l'immagine poco professionale ma è colpa della mia pigrizia nel non usare programmi tipo Eagle,Kicad,..)

Per visualizzare i numeri nel display uso la tecnica del multiplexing, in modo che in ogni istante solo 1segmento alla volta sia accesso

Per spiegarmi meglio cerco di fare un esempio concreto, per visualizzare un 1 sul display le azioni che compio sono:

  • per prima cosa imposto il display in modo che risulti spento, in questo modo:
    [Digit 1 : Digit 4] cioè pin [8:11] di arduino tutti su LOW
    Scrivo sullo shift tutti HIGH, cioè SHIFT [1 1 1 1 1 1 1 1]
    In questo modo il display risulta spento perchè i diodi polarizzati inversamente non conducono, si comportano come una resistenza infinita fino ad un limite di soglia
    e visto che da datasheet riporta che in tensione inversa conduce 10microAmpere dovrebbe essere tollerabile (correggetemi se sbaglio)

  • poi inizio a ciclare per ogni cifra
    per le prime tre cifre non devo visualizzare niente quindi non cambio nulla
    poi arrivo all'ultima cifra (Digit 4)

  • imposto Digit 4 (pin 8 di arduino) su HIGH

  • inizio a ciclare su ogni segmento della cifra

segmento A : spento (non faccio nulla)
segmento B : accesso
-> scrivo sullo shift [1 0 1 1 1 1 1 1], accendo il segmento B
in questo modo il diodo conduce perchè c'è differenza di potenziale tra Pin e GND e basta quella resistenza che si vede nel circuito (giusto?)
-> delay di qualche microsecondo per far vedere il segmento acceso
-> scrivo sullo shift [1 1 1 1 1 1 1 1], spengo tutti i segmenti
segmento C : accesso
-> scrivo sullo shift [1 1 0 1 1 1 1 1], accendo il segmento C
-> delay di qualche microsecondo per far vedere il segmento acceso
-> scrivo sullo shift [1 1 1 1 1 1 1 1], spengo tutti i segmenti
segmento D-E-F-G-DP : spento (non faccio nulla)

  • imposto Digit 4 (pin 8 di arduino) su LOW

La prima versione del progetto includeva una resistenza per ogni cifra, ma secondo i miei calcoli con un multiplexing di questo tipo ne basta una sola,
una soluzione di questo tipo è corretta?
Quale formula devo utilizzare per capire qual'è il refresh rate (Hz) di una soluzione di questo tipo?
cioè se visualizzo il numero 8888 ogni segmento per quanto dovrebbe rimanere attivo per poter essere visible ad occhio nudo con una luminosità accettabile?

Ma in questo modo arrivi al caso in cui hai 7 segmenti accesi tutti alimentati da un unico pin dell'Arduino e questo non va bene: dal pin andresti a prelevare troppa corrente.
Devi anteporre 4 transistor, uno per ogni linea del display, le cui basi poi colleghi ai pin dell'Arduino. In questo modo lo piloti in sicurezza.

Sulla frequenza devi fare dei test. Sopra ai 30 Hz l'occhio umano non riesce più a percepire la transizione per cui dovresti essere a posto con tempi dell'ordine di 1/30=33 ms max, meglio 20 ms (50 Hz).

EDIT:
inoltre anche l'idea di mettere 1 unica resistenza per tutti i led non mi pare corretta. Meglio sempre 1 resistenza per segmento, magari di valore più basso rispetto a quello teorico ma sempre e comunque presente.

leo72:
Ma in questo modo arrivi al caso in cui hai 7 segmenti accesi tutti alimentati da un unico pin dell'Arduino e questo non va bene: dal pin andresti a prelevare troppa corrente.
Devi anteporre 4 transistor, uno per ogni linea del display, le cui basi poi colleghi ai pin dell'Arduino. In questo modo lo piloti in sicurezza.

Non capisco quale sia il caso in cui tutti e 7 i segmenti siano accesi come dici te, perchè come ho già detto ne accendo sempre e solo uno alla volta quindi non sono mai tutti accesi,
i possibili stati in cui si può trovare sono:
-qundo il display è spento cioè, tutti i Digit a LOW e tutti i segmenti ad HIGH (caso già descritto prima, sfruttail fatto che i diodi polarizzati inversamente non conducono)
-quando inizio il ciclo per ogni cifra, per esempio per Digit 1 parto impostandolo ad HIGH e tutti i segmenti sono in stato spento (cioè a livello HIGH perchè è ad anodo comune) ma quindi non essendoci differenza di potenziale non conduce e quindi non passa corrente)
-quando accendo un segmento e poi lo spengo, quindi ho la Digit corrispondente ad HIGH ed il segmento che voglio tenere acceso in quel momento a LOW (tutti gli altri sono ad HIGH) passa corrente solo per quel segmento

Dove sbaglio?

leo72:
inoltre anche l'idea di mettere 1 unica resistenza per tutti i led non mi pare corretta. Meglio sempre 1 resistenza per segmento, magari di valore più basso rispetto a quello teorico ma sempre e comunque presente.

perfettamente d'accordo, io sto solo cercando di capire se una soluzione del genere potrebbe andare bene e nel caso in cui non vada bene capirne il motivo, è semplice curiosità personale :slight_smile:

Avevo capito che tu accendevi 1 cifra su 4 per volta, non 1 segmento per volta.
Se multiplexi per segmento e non per cifra, allora possiamo riparlare dell'idea di togliere il transistor e della resistenza unica.

Non vanno bene piú cose.
Non limiti la corrente del LED mettendo una resistenza nel collegamento di massa del 595. Rischi che il 595 si rompe e sicuramnete non funziona perché alzi il potenziale della massa sul 595 in funzione della corrente. Le resistenze devono essere messe tra uscite 595 e display su ogni uscita/segmento una.

Non vedo la necessitá di progettare il tutto accendendo solo 1 segmento alla volta. Ok, in questo modo non servono transistori sui catodi/anodi comuni ma abbassi tanto lil tempo si acensione del singolo segmento.

opzione 1) un solo segmento acceso.
Ci sono 28 segmenti (diciamo che non ci sono punti decimali) con un tempo di ripetizione di 20 Hz arrivi a 1/28*20 = 1,78mS se sono 50Hz allora ca 0,7mS. Non puoi neanche non aspettare il tempo dei segmenti accesi per avere piú tempo pwe quelli accesi perché in questo modo cambi la luminositá a secondo del numero visualizzato / segmenti accesi.
opzione 2) una cifra accesa alla volta.
Sono 4 cifre e percui con 20 Hz ripetizione sono 12,5mS e con 50Hz sono 5mS ( 7 volte piú lungo accesi). per questa opzione servono dei transistori o transistor array tipo uln2803 o udn2981.

Ciao Uwe

Ok grazie per le risposte, sono d'accordo che con una soluzione di questo genere si hanno più svantaggi che altro (tipo cifre più luminose di altre) ma il mio interesse era più quello di capire se poteva essere tecnicamente corretta (non logicamente sensata!)

In genere per lo schema ho preso un pò spunto da quello del micrologio (vedi : Micrologio, un micro-orologio con un Atmega328P – Leonardo Miliani) aggiungendo lo shift register, ma da quanto ho capito allora non dovrebbe essere corretto neppure questo, sbaglio?

Beh, intanto il Micrologio usa 1 resistenza per ogni led, inoltre vengono usati diversi schemi di multiplexing e solo in un caso viene accesa un'intera cifra alla volta, ma sempre per tempi brevissimi. Le correnti in gioco sono molto basse, in modalità attiva siamo sui 2,5 mA di media con display acceso, quindi puoi capire come i valori rientrino ampiamente nelle specifiche del micro.

leo72:
Beh, intanto il Micrologio usa 1 resistenza per ogni led, inoltre vengono usati diversi schemi di multiplexing e solo in un caso viene accesa un'intera cifra alla volta, ma sempre per tempi brevissimi. Le correnti in gioco sono molto basse, in modalità attiva siamo sui 2,5 mA di media con display acceso, quindi puoi capire come i valori rientrino ampiamente nelle specifiche del micro.

Ma quindi se nello schema di sopra ci fosse 1resistenza per ogni led e usassi la tecnica del multiplexing descritta nel primo post (che vedo nel codice del micrologio essere quella commentata come //a digit per time) dovrebbe andare bene, senza l'utilizzo di transistor no?

skep:
Ma quindi se nello schema di sopra ci fosse 1resistenza per ogni led e usassi la tecnica del multiplexing descritta nel primo post (che vedo nel codice del micrologio essere quella commentata come //a digit per time) dovrebbe andare bene, senza l'utilizzo di transistor no?

La variante di multiplexing che citi, vista la brevità dell'accensione dei led (si parla di microsecondi), ha un consumo di corrente che resta comunque sempre a livelli accettabili anche accendendo tutti i led di una singola cifra. Personalmente però preferisco il multiplexing di 1 segmento per cifra (4 segmenti per volta, quindi). Alla fine è quello che rende meglio. Anche i dati confermano che alla fine è il miglior compromesso fra consumo e visibilità.

skep:

leo72:
Beh, intanto il Micrologio usa 1 resistenza per ogni led, inoltre vengono usati diversi schemi di multiplexing e solo in un caso viene accesa un'intera cifra alla volta, ma sempre per tempi brevissimi. Le correnti in gioco sono molto basse, in modalità attiva siamo sui 2,5 mA di media con display acceso, quindi puoi capire come i valori rientrino ampiamente nelle specifiche del micro.

Ma quindi se nello schema di sopra ci fosse 1resistenza per ogni led e usassi la tecnica del multiplexing descritta nel primo post (che vedo nel codice del micrologio essere quella commentata come //a digit per time) dovrebbe andare bene, senza l'utilizzo di transistor no?

quell'integrato IMHO e un integrato che è stato progettato per far funzionare una cifra sola,
quindi ci va un integrato per cifra un software scritto con "accortezza" che riscrive la cifra solo se la cifra e diversa da quella visualizzata pernso che cosi sia il massimo perche le cifre saranno visualizzate sempre e visualizzate in modo perfetto (anche se levi l'arduino) in piu ne puoi mettere veramente tante