Tag

,

Un display a 7 segmenti (7-segment display) è un ottimo punto di partenza per imparare a giocare con qualcosa di più divertente di un semplice LED. Servono solamente un po’ di dimestichezza con il codice, e un po’ di pazienza per ottenere i giusti collegamenti.

Per festeggiare l’Anno Nuovo, ho pensato di realizzare un semplice conto alla rovescia.

Arduino 7-digit

Arduino 7-digit studio

Gli ingredienti per la ricetta sono un pulsante e un display 7-digit. Premendo il pulsante, partirà il conto alla rovescia da 9 a 0.

Per assicurarmi che tutto funzioni al meglio, comincio con il collegare l’Arduino all’iMac e posiziono un LED con il catodo sul pin 13 e l’anodo sul pin GND. Apro l’IDE di Arduino e scelgo: Esempi > 01. Basic > Blink

Il LED ha cominciato a lampeggiare. Benissimo. Siamo pronti per partire!

Adesso posiziono il pulsante sulla breadboard, e collego con un cavo un piedino al pin 5V, l’altro piedino lo collego alla terra con una resistenza di 10K Ohm (marrone, rosso, nero) e aggiungo un terzo cavetto per portare il segnale al pin 2. In questo modo quando premo il pulsante, la corrente attraversa il circuito e il mio pin 2 segna HIGH.

Dopo qualche perplessità iniziale, credo di aver capito che esistono decine di modi per far funzionare un circuito elettrico. Ma probabilmente per farlo funzionare “bene”, non ne esistono che uno o due. Altre volte è una questione di gusto personale.

Per controllare che tutto funzioni bene modifico leggermente il codice, in modo che una pressione del pulsante accenda il LED. Per comodità ho definito buttonPin e ledPin sugli ingressi 2 e 13 rispettivamente.

void loop()
{
  int buttonState = digitalRead(buttonPin);
  // Se ALTO accendo il LED
  if ( buttonState == HIGH )
  {
    digitalWrite(ledPin,HIGH);
  }
  // Se BASSO spengo il LED
  else
  {
    digitalWrite(ledPin,LOW);
  }
}

Funziona. Perfetto. Adesso non resta che collegare il display 7-segment. Il componente migliore per questo studio è probabilmente quello che offre Sparkfun o un equivalente (https://www.sparkfun.com/products/8546). Nella cassetta degli attrezzi, avevo soltanto un 7-segmenti da 4 cifre. Il migliore è probabilmente sempre di Sparkfun perché ha solo 12 piedini per controllare tutte le 4 cifre (https://www.sparkfun.com/products/11405). Quello che avevo trovato alla Fiera dell’Elettronica, invece, necessita di 40 piedini, ed è un po’ troppo ingombrante per un Arduino. Così mi sono limitato a collegare una cifra.

Controllando le specifiche del componente sul sito http://www.datasheetarchive.com/ o equivalente andiamo a scoprire quali sono le connessioni necessarie per farlo funzionare.

Questo è un 7-digit display ad anodo comune. Significa che per ogni cifra esistono 7 pin positivi (più uno per il punto decimale) e un solo pin negativo. Il pin negativo “accende” la cifra, mentre ciascun pin positivo attiva un diverso segmento della cifra da comporre.

Sistemato il display sulla breadboard, collego il pin comune all’ingresso A0 dell’Arduino e sistemo uno alla volta, seguendo il datasheet, tutti gli altri pin – che attiveranno i vari segmenti. (NB: non è importante che l’ingresso sia analogico, verrà usato come output)

L’indicazione dei segmenti è piuttosto standard: partendo dall’alto, in senso orario, sono contraddistinti dalle lettere a, b, c, d, e, f – mentre g è il trattino centrale. La disposizione dei piedini, invece, è più particolare: 37, 36, 4, 2, 1, 39, 40; il punto decimale dp è al pin 5. Adesso collego a questi piedini (che controllano ognuno un segmento) a 7 ingressi sul mio Arduino.

Le connessioni tra i pin del display e Arduino dovrebbero avere una resistenza, che non ho messo perché volevo concentrarmi sul codice e tenere acceso Arduino solo per pochi istanti. Se però pensate di costruire un vero circuito dovete metterle. Modifico il codice così, e vediamo se il display si accende:

void loop()
{
  int buttonState = digitalRead(buttonPin);
  // Se ALTO accendo il LED
  if ( buttonState == HIGH )
  {
    digitalWrite(ledPin,HIGH);
    digitalWrite(dig1,HIGH);
  }
  // Se BASSO spengo il LED
  else
  {
    digitalWrite(ledPin,LOW);
    digitalWrite(dig1,LOW);
  }
}

Compilo, installo, premo il pulsante e… fantastico, un 8 luminoso è apparso sul display! Perciò, adesso andiamo a scrivere una semplice routine che componga ogni secondo un numero da 9 a 0. È necessaria un’ultima accortezza, perché essendo il display ad anodo comune, è necessario che i segmenti siano “chiusi” perché la corrente li attraversi e così vanno impostati su LOW per accendersi.

// Digit on/off, segment on/off (anodo comune)
#define DIG_ON  HIGH
#define DIG_OFF  LOW
#define SEG_ON   LOW
#define SEG_OFF HIGH

void loop()
{
  int buttonState = digitalRead(buttonPin);
  // Se ALTO accendo il LED
  if ( buttonState == HIGH )
  {
    digitalWrite(ledPin,HIGH);
    digitalWrite(dig1,DIG_ON);

    // Scrivo 9
    digitalWrite(segA,SEG_ON);
    digitalWrite(segB,SEG_ON);
    digitalWrite(segC,SEG_ON);
    digitalWrite(segD,SEG_ON);
    digitalWrite(segE,SEG_OFF);
    digitalWrite(segF,SEG_ON);
    digitalWrite(segG,SEG_ON);
    digitalWrite(segDP,SEG_OFF);
    delay(1000);

    // Scrivo 8
    // ecc.
  }
  // Se BASSO spengo il LED
  else
  {
    digitalWrite(ledPin,LOW);
    digitalWrite(dig1,DIG_OFF);
  }
}

Dopo aver aggiunto un paio di costanti e alcune semplici funzioni al codice, ecco il nostro conto alla rovescia che parte: premo il pulsante e compaiono: 9, 8, 7, 6, 5, 4, 3, 2, 1, 0!

Buon Anno!

Download: _7digit_countdown.zip

Studio Arduino Logo

Annunci