Arduino: pilotare un sette segmenti con il minor numero di pin

In questo articolo scopriremo come grazie:

  • ad una funzione messa a disposizione dall’IDE di Arduino
  • un integrato semplice ed economico

è possibile pilotare numerosi led diminuendo il numero di pin necessari.

Andremo a sviluppare un piccolo progetto nel quale piloteremo le linee di un sette segmenti utilizzando solo tre pin dell’Arduino invece di sette sfruttando il 74HC595 e la funzione ShiftOut dell’Arduino.

Iniziamo! 

Lista della spesa

Oltre all’Arduino, una breadboard e connettori avremo bisogno di:

  Sette segmenti (anodo o catodo comune, poi spiegheremo cosa comporta) Costo: 1 euro circa
  74HC595 (integrato SIPO: Serial In Parallel Out) Costo: meno di un’euro
Resistenze (8, a 220 Ohm)  Costo: meno di un’euro 

Come pilotare il sette segmenti

Per pilotare i led dei sette segmenti potremo utilizzare le singole uscite dell’Arduino ma se il sette segmenti rappresenta solo una parte del nostro progetto si capisce che non possiamo impiegare così tante uscite. Ora scopriremo come con soli 3 pin possiamo pilotare tutti i led che vogliamo!

Il sette segmenti: anodo o catodo comune?

Esistono due tipologie di sette segmenti: quelli a catodo comune e quelli ad anodo comune e, come si può vedere qui sotto sono due le differenze essenziali che dipendono da come essi sono stati orientati:

Nel sette segmenti ad anodo comune noi pilotiamo direttamente il catodo mentre l’anodo, che è in comune tra tutti i Led, viene alimentato a tensione costante( Vcc) il che implica che per far accendere un singolo led dovremo impostare la singola uscita dell’Arduino a LOW. Viceversa i Led che costituiscono il sette segmenti a catodo comune hanno la stessa massa e noi pilotiamo gli anodi il che implica che per far accendere un Led dovremo impostare l’uscita del pin a HIGH, che permette alla corrente di scorrere.

In definitiva quando prendiamo un sette segmenti dovremo tener conto del suo tipo per:

  • L’alimentazione.
  • La logica di pilotaggio dei singoli segmenti.

L’integrato 74HC595

L’integrato 74HC595 ci consentirà, utilizzando un numero ridotto di pin, di pilotare il sette segmenti. Successivamente si possono mettere numerosi di questi integrati in “cascata” per pilotare ancora più Led, per esempio dei barled da 10 o 20 elementi.

Il datasheet lo identifica come “8-bit serial-in, serial or parallel-out shift register with output latches; 3-state”: questo integrato consente in breve di ricevere in modo seriale le informazioni che poi successivamente tramette in uscita in modo parallelo

In più, se ci sono altri dati ricevuti in ingresso, c’è u ulteriore trasmesso in seriale da un pin, che permette di poter collegare un’altro integrato in “cascata” così, in un sol colpo, possiamo pilotare ancora più led.

Per iniziare la comunicazione seriale c’è bisogno di mettere l’integrato in uno stato di “ascolto” che avviene utilizzando un opportuno pin detto di “latch” e settandolo a LOW. Quando abbiamo terminato la comunicazione seriale basterà rimetterlo ad HIGH.

Inoltre “3-state” fa riferimento al fatto che i dati in uscita possono essere oltre che ad HIGH o LOW anche ad “alta impedenza” ma non si può settare un singolo pin di uscita in questa modalità, ma bensì tutti insieme.

Qui abbiamo il pinout dell’integrato:

PIN 1-7, 15 Q0 ” Q7 Pin di output
PIN 8 GND Massa
PIN 9 Q7″ Serial Out( per utilizzarne di più in cascata)
PIN 10 MR Master Reclear, attivo quando è impostato a LOW
PIN 11 SH_CP Shift register clock pin
PIN 12 ST_CP Storage register clock pin (latch pin)
PIN 13 OE Output enable, attivo quando è impostato a LOW
PIN 14 DS Serial data input, da questo pin mandiamo i dati in modo seriale dall’Arduino
PIN 16 Vcc Alimentazione (5v)

Risorse utili : 74HC595 datasheet

Il circuito

Per quanto riguarda l’integrato dovremo collegare:

  • Pin16( Vcc) all’alimentazione a 5v
  • Pin13(OE) a massa
  • Pin10(MR) all’alimentazione a 5v
  • pin8(GND) a massa.
Per quanto riguarda il sette segmenti:
  • Vcc all’alimentazione a 5v se parliamo del sette segmenti ad anodo comune, invece gli stessi pin verranno collegati a massa se usiamo quello a catodo comune
  • il pin1(Q1), pin2(Q2), pin3(Q3), pin4(Q4) , pin5(Q5) , pin6(Q6) e pin7(Q7) dell’integrato rispettivamente ai pin a,b,c,d,e,f,g del sette segmenti mostrato poco sopra N.B.: inserire le resistenze da 220Ohm tra i pin di uscita dell’integrato e il sette segmenti altrimenti si rischia per tempi prolungati di utilizzo che esso si possa rompere!

Invece collegheremo dall’Arduino

  • L’alimentazione a 5V in comune col circuito
  • La massa in comune col circuito
  • il pin12 dell’Arduino al pin11 dell’integrato(SH_CP): filo GIALLO
  • il pin11 dell’Arduino al pin14 dell’integrato(DS): filo BLU
  • il pin8 dell’Arduino al pin12 dell’integrato(ST_CP): filo VERDE

Ed ecco il nostro risultato(per non apparire ancora più confusionario non ho inserito le resistenze da 220Ohm)

Si può notare che per pilotare i sette led del sette segmenti si utilizzano solo tre porte dell’Arduino invece di sette.

Codice per l’Arduino : utilizzo di shiftOut()

Adesso andremo ad implementare un semplice programma che utilizza il sette segmenti e che mostra i valori compresi tra 0 e 9 in modo ciclico con un intervallo di 500 ms.

byte values[]={
B11110011,
B01001001,
B01100001,
B00110011,
B00100101,
B00000101,
B11110001,
B00000001,
B00100001,
B10000000,};

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup(){
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop(){
for(int i=0;i<10;i++){ digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, values[i]); digitalWrite(latchPin, HIGH); delay(500);}

}

Il codice è molto semplice:

L'array di byte values[] ha dei valori al suo interno espressi in modo binario. Il valore 0 identifica un led acceso, 1 viceversa( utilizzando un sette segmenti ad anodo comune, se avessimo avuto un sette segmenti a catodo comune avremmo avuto bisogno di invertire le cifre binarie) e , in ordine , corrispondono ai pin g,f,e,d,c,b,a del sette segmenti.

Vengono impostati i tre pin che utilizzeremo per l'integrato nella fase di setup e, nel loop che scorre i valori da 1 a 10 nel quale viene impostato il latchPin a LOW che permette di poter trasmettere i dati all'integrato.

Poi viene richiamata la funzione shiftOut al quale passiamo il pin nel quale trasmettiamo i dati, quello relativo al clock per il funzionamento dell'integrato, indichiamo se il primo bit sia quello più significativo( MSBFIRST) o il meno significativo ( LSBFIRST) e poi uno dei valori dell'array che passiamo in seriale all'integrato utilizzando come indice il numero i del ciclo for.

Infine viene rimesso il pin di latch a HIGH e richiamata la funzione delay().

Conclusioni, fonti e riferimenti

In definitiva questo è uno dei migliori metodi per pilotare un sette segmenti (ma anche un numero arbitrario di Led utilizzando più integrati in cascata) utilizzando solo 3 pin dell'Arduino e un semplice integrato.

In un prossimo articolo parleremo del problema contrario, ossia come poter leggere un numero arbitrario di porte digitali( come tanti interruttori o un tastierino numerico ad esempio) sempre riducendo il numero di pin dell'Arduino da dover utilizzare al minimo.

Riferimenti: Arduino - Shiftout

Luca Panebianco

Ciao! Mi chiamo Luca e frequento la magistrale in Ingegneria Informatica e dell’Automazione all’Università Politecnica delle Marche. Qui ho apprezzato pian piano la programmazione su microcontrollori oltre che la canonica sul PC. Sono interessato ai vari campi della programmazione su diversi dispositivi.


By Luca Panebianco | maggio 15th, 2012 | SHOW COMMENTS (7)

7 Responses

  1. Sandro says

    Ciao

    il post è molto chiaro e utile; solo non ho capito a cosa serve il PIN 10 dello shift register (MR).

  2. Wirpool says

    ciao mi chiamo matteo e stò facendo un programma per rilevare la temperatura con un lm35 e poi mostrarla con il display, quindi ho seguito le tue istruzioni per pilotare il 7seg. solo che non capisco una cosa nel testo tu parli del segmento “c” come se fosse normalmente collegato ma poi nella raffigurazione del circuito esso non è collegato da nessuna parte, mi potresti dare una spiegazione perchè senza quello mancano vari numeri.

    attendo risposta grazie ciao

    • Automazione Open Source
      automazioneos says

      Ciao Matteo,
      Ho controllato meglio il file Fritzing e c’è un piccolo errore.
      Nell’immagine il pin attaccato al DP(il punto) nella breadboard in basso dovrebbe essere attaccato al pin corrispondente al segmento “C”(quindi il foro adiacente della scheda).
      Nel codice l’ultima cifra delle variabili binarie dell’array corrisponde al valore che prende il pin Q0 del 74HC595 che però non è attaccato a nulla e dovrebbe pilotare(se uno ne ha bisogno) il pin DP(da collegare).
      Spero di essere stato utile 🙂 Per qualunque altro problema chiedi pure! 
      Luca.

      • Wirpool says

         quindi, correggimi se sbaglio, in fin dei conti il DP va collegato al Q0 giusto?

        • Automazione Open Source
          automazioneos says

          Sisi, e il “C” deve esser collegato al Q3…per pilotare correttamente il DP bisogna che venga gestito l’ultimo bit di quei valori binari.

          • Wirpool says

             ok mille grazie mi sei stato molto utile

  3. Pilotare lo schermo di un Nokia 5110 con Arduino | Automazione Open Source says

    […] accorto che alcuni nomi di alcuni pin non sono nuovi: infatti, come avevamo parlato in un articolo precedente nel quale si parlava di come utilizzare un 74HC595 per pilotare in modo efficiente un sette […]