Come impiegare uno shift register per incrementare le uscite di Arduino

La board Arduino UNO possieda pochi pin digitali, ma fortunatamente esistono dei metodi che ne incrementano il numero impiegando componenti esterni di facile impiego e con un costo contenuto. Il sistema che ho realizzato impiega uno shift register a 8 bit (SN74LS595) che viene controllato da Arduino tramite la funzione ShiftOut.

ShiftOut permette di serializzare un dato su una linea di 2 fili, mentre lo shift register parallelizza il dato pilotando le sue 8 uscite.

Lo schema seguente mostra i collegamenti tra il 74LS595 e l’Arduino. Il pin 12 di Arduino genera il clock del dato seriale disponibile in uscita al pin 11, mentre il pin 8 viene usato per permettere il caricamento del dato sullo shift register.

il diagramma seguente mostra l’andamento dei segnali sulle relative linee

shift register 74595 signal diagram

Quindi per scrivere un dato sullo shift register devo per prima cosa porre a zero il pin8, avviare la scrittura, che si compone nella generazione del clock(PIN12) e nella serializzazione del dato(PIN11) e settare nuovamente a uno il pin8. A fine scrittura, i pin dello shift register sono settati o resettati in funzione dei bit del dato inviato dall’Arduino.

Di seguito la pin function dello shift register

Pin Function 74LS595 shift register

Passiamo al codice per interagire con le uscite del 74595

//Il pin8 viene usato per abilitare la scrittura
//sullo shift register
int Abilitazione = 8;
//il pin11 viene usato per inviare il dato
int UscitaDatoSeriale = 11;
//Il pin12 viene usato per generare il clock
int DataClock = 12;

//variabile che contiene il dato da scrivere sullo
//shift register
byte dato = 0;

void setup()
{
  //Setto i pin come uscite
  pinMode(Abilitazione, OUTPUT);
  pinMode(DataClock, OUTPUT);
  pinMode(UscitaDatoSeriale, OUTPUT);
  //Per il serial monitor (debug)
  Serial.begin(9600);
}

void loop()
{
  //setto tutte le 8 uscite dello shift register a 1
  dato=0b11111111;
  //invio il valore al serial monitor
  Serial.println(dato);
  //abilita la scrittura
  digitalWrite(Abilitazione, LOW);
  //invia il dato
  shiftOut(UscitaDatoSeriale, DataClock, LSBFIRST, dato);
  //Disabilita scrittura
  digitalWrite(Abilitazione, HIGH);
  //ritardo
  delay(500);
}

 

Il codice pone a livello logico alto tutte le uscite dello shift register, da notare che ho utilizzato la notazione binaria per facilitare la gestione delle uscite del 74595, infatti se volessi porre bassa la linea QA, corrispondente al bit zero, cambierei il valore di dato a ob01111111.
Il flag LSBFIRST dell’istruzione shiftOut decide se il bit meno significativo, deve essere il bit zero dello shift register piuttosto che il bit7.