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
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
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.