Come funziona il display a sette segmenti e l’interfaccia con Arduino
Quante volte avete visto un film dove qualcuno deve disattivare una bomba? L’eroe guarda il display mentre il tempo scorre, ogni secondo più prezioso del precedente. Beh, se ci fate caso, tutte quelle bombe nei film hanno display a sette segmenti. Deve essere così! Altrimenti, come potrebbe un eroe sapere quanto tempo gli rimane?
Forse i display a sette segmenti non ti sembrano abbastanza moderni, ma sono il modo più pratico per visualizzare i numeri. Sono facili da usare, convenienti e altamente leggibili, sia in condizioni di luce limitata che in forte luce solare.
Un esempio nel mondo reale che utilizza display a sette segmenti è il famoso orologio per il conto alla rovescia a Cape Canaveral, in Florida, usato dalla NASA per l’atterraggio dell’Apollo.
Sintesi dell’hardware
Discutiamo brevemente le caratteristiche e le funzionalità del display a 7 segmenti prima di collegarlo ad Arduino.
I display a 7 segmenti sono in realtà solo sette LED allineati in un particolare schema. In questo caso, la forma del numero ‘8’ che tutti conosciamo. Ognuno dei sette LED è chiamato segmento perché quando è illuminato il segmento forma parte di una cifra numerica (sia Decimale che Hex) da visualizzare. Un ottavo LED aggiuntivo è talvolta usato per indicare un punto decimale.
Ognuno dei sette LED del display è dotato di un segmento posizionale con uno dei suoi pin di connessione che viene portato direttamente fuori dal pacchetto di plastica rettangolare. Questi singoli pin LED sono etichettati da a fino a g e rappresentano ogni singolo LED. Gli altri pin dei LED sono collegati insieme e cablati per formare un pin comune.
Per accendere e spegnere una particolare parte del display, si imposta il pin appropriato in ALTO o in BASSO proprio come si farebbe con un normale LED. In modo che alcuni segmenti saranno chiari e altri saranno scuri permettendo al modello di carattere desiderato del numero di essere generato sul display. Questo ci permette di visualizzare ognuna delle dieci cifre decimali da 0 a 9 sullo stesso display a 7 segmenti.
Pinout del display a 7 segmenti
Ora andiamo oltre la configurazione dei segmenti così sappiamo quali pin accendono quali segmenti. La piedinatura del display a 7 segmenti è la seguente.
a-g & DP Su 10, gli 8 pin i.e. a, b, c, d, e, f, g e il segmento DP (punto decimale) sono collegati ai pin digitali di Arduino. Controllando ogni LED sul segmento collegato, i numeri possono essere visualizzati.
COM I pin 3 e 8 sono collegati internamente per formare un pin comune. Questo pin dovrebbe essere collegato a GND (catodo comune) o 5V (anodo comune) a seconda del tipo di display.
Catodo comune (CC) Vs Anodo comune (CA)
I display a sette segmenti sono di due tipi: Catodo comune (CC) e Anodo comune (CA). La struttura interna di entrambi i tipi è quasi la stessa. La differenza è la polarità dei LED e del terminale comune. Come suggerisce il nome, il catodo comune ha tutti i catodi dei LED in un 7-segmento collegati insieme e l’anodo comune ha tutti gli anodi dei LED in un 7-segmento collegati insieme.
Nel display a catodo comune, tutti i collegamenti catodici dei segmenti LED sono collegati insieme a ‘logica 0’ / GND. I singoli segmenti sono poi illuminati applicando un segnale HIGH / ‘logic 1’ ai singoli terminali dell’anodo (a-g).
Nel display ad anodo comune, tutte le connessioni anodiche dei segmenti LED sono unite a “1” logico. I singoli segmenti sono illuminati applicando una massa, un segnale logico “0” o “LOW” al catodo del particolare segmento (a-g).
In generale, i display ad anodo comune (quello che abbiamo usato negli esperimenti qui sotto) sono più popolari in quanto molti circuiti logici possono assorbire più corrente di quanta ne possano generare.
Nota anche che un display a catodo comune non è una sostituzione diretta in un circuito per un display ad anodo comune e viceversa, in quanto è lo stesso che collegare i LED al contrario, e quindi l’emissione di luce non avrà luogo.
Come funziona un display a 7 segmenti?
A seconda della cifra decimale da visualizzare, il particolare set di LED è illuminato. Per esempio, per visualizzare la cifra numerica 4, avremo bisogno di accendere quattro dei segmenti LED corrispondenti a b, c, f e g. Così le varie cifre da ‘0 a 9’ e i caratteri da ‘A a F’ possono essere visualizzati utilizzando un display a 7 segmenti come mostrato.
La seguente tabella di verità mostra i singoli segmenti che devono essere illuminati per produrre cifre e caratteri. Si prega di notare che la tabella di verità per il display a 7 segmenti ad anodo comune è esattamente opposta a quella del display a 7 segmenti a catodo comune.
Cablaggio – Collegamento del display a 7 segmenti ad Arduino UNO
Ora che abbiamo capito come funziona il display a 7segmento funziona, possiamo iniziare a collegarlo ad Arduino!
Inizia mettendo il display a 7 segmenti sulla tua breadboard, assicurandoti che ogni lato del display sia su un lato separato della breadboard. Con il punto decimale rivolto verso il basso, i pin sono 1-5 sul lato inferiore da sinistra a destra e 10-6 sul lato superiore da sinistra a destra come si può vedere nell’illustrazione qui sotto.
Per iniziare colleghiamo uno dei pin comuni 3 o 8 al pin 5V su Arduino (se si utilizza un display a 7 segmenti ad anodo comune) o al pin GND su Arduino (se si utilizza un display a 7 segmenti a catodo comune). Gli altri 4 pin sulla posizione superiore sono collegati al pin digitale 2 al pin digitale 5. Gli altri 4 pin sulla posizione inferiore con punto decimale sono collegati ai pin digitali da 6 a 9.
Sebbene il display possa funzionare senza resistenze di limitazione della corrente, è sempre una buona idea averle nel circuito per evitare di bruciare il display.
In genere, per un display standard a 7 segmenti di colore rosso, ogni segmento LED può assorbire circa 15 mA per illuminarsi correttamente, quindi su un circuito logico digitale a 5 volt, il valore della resistenza di limitazione della corrente sarebbe di circa 200Ω (5v – 2v)/15mA, o 220Ω al valore preferito più vicino.
Una volta che hai finito dovresti avere qualcosa che assomiglia alla figura mostrata qui sotto.
Codice Arduino
Ora, è il momento di illuminare il display con un po’ di codice.
Prima di iniziare a scrivere il codice per controllare i display a 7 segmenti, è necessario scaricare la libreria SevSeg Arduino. Potete farlo visitando il repo di GitHub e scaricando manualmente la libreria o, semplicemente, cliccare su questo pulsante per scaricare lo zip:
Per installarla, aprite l’IDE di Arduino, andate su Sketch > Include Library > Add .ZIP Library, e poi selezionate il file ZIP SevSeg che avete appena scaricato. Se hai bisogno di maggiori dettagli sull’installazione di una libreria, visita questo tutorial Installing an Arduino Library.
Una volta installata la libreria, puoi copiare questo sketch nell’IDE di Arduino. Il seguente sketch di prova conterà da 0 a 9. Provate lo sketch e poi ve lo spiegheremo in dettaglio.
#include "SevSeg.h"SevSeg sevseg;void setup(){//Set to 1 for single digit displaybyte numDigits = 1;//defines common pins while using multi-digit display. Left empty as we have a single digit displaybyte digitPins = {};//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};bool resistorsOnSegments = true;//Initialize sevseg object. Uncomment second line if you use common cathode 7 segmentsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);//sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);sevseg.setBrightness(90);}void loop(){ //Display numbers one by one with 2 seconds delay for(int i = 0; i < 10; i++) { sevseg.setNumber(i); sevseg.refreshDisplay(); delay(2000); }}
Spiegazione del codice:
Lo sketch inizia includendo la libreria SevSeg che semplifica i controlli e i segnali al 7-segmenti. Poi dobbiamo creare un oggetto SevSeg che possiamo poi usare in tutto lo sketch.
#include "SevSeg.h"SevSeg myDisplay;
In seguito, dobbiamo specificare quante cifre ha il display. Dato che stiamo usando un display a una cifra, lo impostiamo a 1. Nel caso in cui stiate usando un display a 4 cifre, impostatelo a 4.
//Set to 1 for single digit displaybyte numDigits = 1;
L’array digitPins definisce semplicemente i ‘pin comuni’ quando usate un display a più cifre. Lasciatelo vuoto se avete un display a cifra singola. Altrimenti, fornite i numeri dei pin di arduino a cui sono collegati i ‘pin comuni’ delle singole cifre. Ordinali da sinistra a destra.
//defines common pins while using multi-digit display//Left empty as we have a single digit displaybyte digitPins = {};
Il secondo array che vediamo essere inizializzato è l’array segmentPins. Questo è un array di tutti i numeri di pin di Arduino che sono collegati ai pin del display a LED che controllano i segmenti; quindi in questo caso questi sono quelli che abbiamo collegato direttamente dalla breadboard ad Arduino. Anche questi devono essere messi nell’ordine corretto poiché la libreria presuppone che i pin siano nel seguente ordine: A, B, C, D, E, F, G, DP.
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};
Dopo aver creato queste variabili, le passiamo al costruttore di SevSeg usando la funzione begin()
.
//Initialize sevseg objectsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
Nella sezione ‘loop’: Il programma inizia a contare da 0 a 9 usando il ciclo ‘for’ e la variabile ‘i’. Ogni volta, usa la funzione della libreria SevSeg setNumber()
insieme a refreshDisplay ()
per impostare il numero sul display.
for(int i = 0; i < 10; i++){ sevseg.setNumber(i); sevseg.refreshDisplay(); delay(1000);}
Progetto Arduino
Rolling Dice
Come supplemento, ecco un altro progetto, che permette alle persone che hanno bisogno di tecnologia di accessibilità di “lanciare” i dadi. Si può usare per giocare a giochi come Yahtzee, Ludo ecc. Utilizza la stessa configurazione di Arduino, tranne che per il fatto che usiamo un interruttore tattile per un lancio veloce.
Lo scopo di un dado è di fornire un modo per ottenere casualmente un numero da 1 a 6. E il modo migliore per ottenere un numero casuale è quello di utilizzare una funzione integrata random(min,max). Questa prende due parametri, il primo specifica il limite inferiore del valore casuale (incluso questo numero) e il secondo parametro specifica il limite superiore del valore casuale (escluso questo numero). Significa che il numero casuale sarà generato tra min e max-1
#include "SevSeg.h"SevSeg sevseg; const int buttonPin = 10; // the number of the pushbutton pin// variables will change:int buttonState = 0; // variable for reading the pushbutton statusvoid setup(){ byte numDigits = 1; byte digitPins = {}; byte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9}; bool resistorsOnSegments = true; sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments); sevseg.setBrightness(90);// initialize the pushbutton pin as an input:pinMode(buttonPin, INPUT);}void loop(){// read the state of the pushbutton value:buttonState = digitalRead(buttonPin); if (buttonState == HIGH) {sevseg.setNumber(random(1,7));sevseg.refreshDisplay(); }}