ArduinoElettronica digitale

Arduino: gestire 8 output con solo 3 pin digitali

Guida per l'utilizzo dei registri a scorrimento con schede Arduino

I registri a scorrimento, in inglese shift register, sono dei circuiti integrati basati sui flip-flop che prevedono una serie di memorie ad 1 bit connesse tra loro e gestite da un segnale di clock che, a sua volta, permette di traslare lo stato logico da una memoria alla memoria più vicina.

La gestione di uno (o più) registri a scorrimento avviene tramite tre segnali: il segnale di clock, il segnale di latch e il segnale del dato. Queste informazioni vengono fornite dal microcontrollore e quindi sono gestite a livello software. Nel caso di Arduino vi è un comando specifico (shiftOut) che si occupa dell’intera gestione dei segnali.

Nel nostro esempio sfrutteremo lo stesso integrato utilizzato nelle guide ufficiali del progetto Arduino, ovvero il componente 74HC595. Si tratta di un registro a scorrimento a 8 bit integrato avente 16 pin. Permette sia la gestione serial-in che la gestione parallel-out. Di seguito  viene riportato  il  pinout.

Nella seguente tabella, prelevata dal datasheet completo, vengono riportati i parametri limite del componente integrato oltre ai quali non è garantito un corretto funzionamento.
Di seguito, invece, sono riportati i parametri consigliati per il normal funzionamento per gli shift-register SN54HC595 e SN74HC595.

Da notare la tensione nominale di 5V e la massima corrente di output di 35mA.

Il nostro obiettivo è la gestione di 8 OUTPUT digitali sfruttando solo 3 pin della scheda Arduino (o microcontrollore generico). Per prima cosa è necessario realizzare fisicamente su breadboard (o altro supporto) il seguente schema elettrico e dobbiamo interfacciarlo al microcontrollore tramite i pin digitali clock, latch e data. Se la nostra alimentazione Vcc (5V) non è stabilizzata è consigliato inserire un condensatore elettrolitico di valore tra i 10uF e i 220uF tra Vcc e GND. Se l’alimentazione proviene da una porta USB di un computer il condensatore si può tranquillamente omettere.

Sarà compito del programma gestire i terminali data, latch e clock in modo opportuno.


Il sistema verrà gestito da un byte trasmesso dalla linea data e, via software, è essenziale specificare l’ordine dei bit da seguire indicando se si vuole trasmettere per primo il bit LSB (meno significativo) o il bit MSB (più significativo). Ciò cambia profondamente il risultato finale: a seconda del metodo, il byte sottostante può essere 10101010 se si segue l’ordine da MSB a LSB, oppure 01010101 se si segue da LSB verso MSB. La modalità verrà indicata a livello software grazie alla libreria shiftOut.

Procediamo ora a capire come gestire il sistema. Prendiamo come esempio il seguente disegno dove si vogliono attivare i led: LED2, LED3, LED7 e LED8. I corrispettivi bit verranno portati al valore 1 e di conseguenza il byte si potrà riportare in numero decimale avente il valore 2^7+2^6+2^2+2^1 = 198

Se volgiamo quindi inviare il dato per impostare i led come da esempio basterà seguire il seguente codice:

    digitalWrite(latch_Pin, LOW); //attivo la modifica del registro
    shiftOut(dataPin, clockPin,LSBFIRST, 198 ); //imposto il valore 198 (11000110)
    digitalWrite(latchPin, HIGH); //disabilito la modifica del registro

 

Programma esempio:

Realizzare un sistema basato sui registri a scorrimento che gestisca 8 diodi led. Si vuole attivare un led alla volta, dall’uscita Qa a Qh con intervalli di 500ms.

Un piccolo trucco è creare un array contenente i valori decimali dei bit da attivare. Dato che si vogliono attivare un led alla volta basterà seguire le potenze di 2, quindi l’array dovrà contenere i seguenti valori: 0, 1, 2, 4, 8, 16, 32, 64, 128

0 –> tutti i led off
1 –> led 1 ON
2 –> led 2 ON
4 –> led 3 ON
8 –> led 4 ON
16 –> led 5 ON
32–> led 6 ON
64 –> led 7 ON
128 –> led 8 ON

// pin per la gestione del shiftregister
int latchPin = 13;
int clockPin = 12;
int dataPin = 11;

//array con i valori decimali dei byte da inviare
int attivazione[] = {0, 1, 2, 4, 8,16,32,64,128};

void setup() {
//imposto i pin di gestione come output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
for (int i = 0; i <= 8; i++) {
    digitalWrite(latchPin, LOW); //abilito modifica shiftregister
    shiftOut(dataPin, clockPin,MSBFIRST, attivazionea[i]); //imposto shiftregister
    delay(500); //attendo 500ms
    digitalWrite(latchPin, HIGH); //disabilito modifica shiftregister
  }
}

 

MST-Admin

Appassionato di elettronica, elettrotecnica generale e programmazione. Fondatore del progetto MST-tutorial, desideroso di condividere con voi l'entusiasmo per l'innovazione tecnologica e la sperimentazione di novità tecniche in questi campi.

Articoli Correlati

Pulsante per tornare all'inizio