Skip to Content

Più ingressi con il registro a scorrimento 74HC165

Più ingressi con il registro a scorrimento 74HC165

In questo tutorial ti mostrerò come aggiungere più ingressi al tuo Arduino o ESP8266/ESP32 utilizzando il registro a scorrimento 74HC165.

Il popolare Arduino UNO ha 14 pin GPIO che puoi usare per leggere (o scrivere) dati. Spesso sono sufficienti, ma a volte servono più ingressi. Potresti acquistare un Arduino più costoso come un  Arduino Mega  con 54 pin GPIO oppure un  GPIO expander board . Ma il modo più economico è usare un registro a scorrimento come il  74HC165 .

Il 74HC165 offre 8 ingressi, occupa solo 3 pin del tuo Arduino e può essere collegato in cascata per leggere quanti ingressi vuoi. L’unico svantaggio è che è più lento rispetto all’uso diretto dei pin GPIO di Arduino. Le applicazioni più comuni sono la decodifica di tastiere o la lettura di molti sensori digitali.

Iniziamo con i componenti necessari prima di vedere più nel dettaglio il funzionamento del registro a scorrimento 74HC165.

Componenti necessari

Ho usato un Arduino Uno per questo progetto, ma qualsiasi altra scheda Arduino o una scheda ESP8266/ESP32 andrà benissimo. Ho elencato dei pulsanti, ma per la mia realizzazione ho usato un DIP switch, perché è più compatto. Anche i pulsanti vanno comunque bene.

Arduino

Arduino Uno

Dupont wire set

Set di cavi Dupont

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

74HC165 Shift Register

Registro a scorrimento 74HC165

Pulsante

Kit di resistenze & LED

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Funzionamento del registro a scorrimento 74HC165

Il 74HC165 è un registro a scorrimento a 8 bit con caricamento parallelo che legge 8 ingressi digitali in parallelo e poi li invia in serie su un singolo pin. Richiede un ingresso di clock per temporizzare lo spostamento degli 8 ingressi digitali verso l’uscita seriale, e un altro segnale per controllare il caricamento dei dati in ingresso.

Questo significa che con tre pin e un solo 74HC165 puoi leggere fino a 8 ingressi digitali. Tuttavia, puoi anche collegare in cascata più 74HC165 e leggere praticamente un numero illimitato di ingressi digitali, sempre usando solo tre pin del tuo microcontrollore!

Schema a blocchi funzionale

L’immagine qui sotto mostra lo schema a blocchi funzionale del registro a scorrimento 74HC165. Puoi vedere gli 8 ingressi digitali paralleli (A…H) in alto. L’uscita seriale Q H e la sua complementare Q̅ H sono a destra. Al centro trovi i latch ( flip-flops ) in cui vengono caricati i dati in ingresso.

Functional Block Diagram of the 74HC165 Shift Register
Schema a blocchi funzionale del registro a scorrimento 74HC165 ( source )

I pin di controllo sono a sinistra. SH/L̅D̅ abilita gli 8 ingressi digitali quando è portato a livello basso. CLK (o CLK INH) sposta i dati uno alla volta verso l’uscita seriale Q H . SER è l’ingresso seriale usato quando si collegano più registri 74HC165 in cascata.

Schema logico

L’immagine seguente mostra lo schema logico del processo. Il segnale CLK temporizza lo spostamento degli ingressi digitali (A…H) verso l’uscita seriale Q H e la sua inversa Q̅ H .

Logic diagram of the 74HC165 Shift Register
Schema logico del registro a scorrimento 74HC165 ( source )

Il segnale di clock è disabilitato finché clock-inhibit (CLK INH) è alto. Allo stesso modo, per caricare gli ingressi digitali, SH/L̅D̅ deve andare a livello basso. SER viene usato solo quando si collegano più registri a scorrimento.

In sintesi, per spostare gli 8 ingressi digitali A…H verso l’uscita seriale Q H dobbiamo eseguire i seguenti passaggi.

  1. Porta SH/L̅D̅ a livello basso per caricare i dati
  2. Riporta SH/L̅D̅ a livello alto
  3. Ripeti 8 volte i seguenti passaggi
    • Porta CLK a livello alto per spostare i dati
    • Riporta CLK a livello basso

CLK INH non è necessario e possiamo tenerlo basso per tutto il tempo. Inoltre, se usi un solo registro a scorrimento 74HC165, l’ingresso SER non viene utilizzato.

Pinout

Nell’immagine qui sotto trovi il pinout del registro a scorrimento 74HC165. L’alimentazione viene fornita tramite V CC e GND. La tensione di alimentazione V CC può variare tra 2V e 6V, e la tensione di uscita sul pin Q H è determinata da V CC .

Pinout of the 74HC165 Shift Register
Pinout del registro a scorrimento 74HC165 ( source )

La funzione degli altri pin l’abbiamo già discussa sopra, ma la tabella seguente riassume le funzioni di tutti i pin. Ulteriori dettagli si trovano nel Datasheet for the 74HC165 Shift Register .

Pin functions of the 74HC165 Shift Register
Funzioni dei pin del registro a scorrimento 74HC165 ( source )

Nella prossima sezione collegheremo il registro a scorrimento 74HC165 a un Arduino.

Collegare il registro a scorrimento 74HC165 ad Arduino

Per semplicità, colleghiamo il 74HC165 all’Arduino senza segnali sui pin di ingresso dati A…H per prima cosa. L’immagine qui sotto mostra il cablaggio di questo primo passaggio.

Connecting the 74HC165 Shift Register to Arduino
Collegamento del registro a scorrimento 74HC165 ad Arduino

Iniziamo con i collegamenti di alimentazione. Collega un filo nero dal pin GND dell’Arduino alla barra negativa della breadboard. Poi usa un filo rosso per collegare i 5V dell’Arduino alla barra positiva. Successivamente colleghiamo le due barre negative della breadboard con un filo nero. Non usiamo la seconda barra positiva, quindi non serve collegarla.

Ora colleghiamo l’alimentazione per il 74HC165. Collega il pin 8 (GND) del 74HC165 alla barra negativa (filo nero) e il pin 16 (V CC ) alla barra positiva (filo rosso).

Infine, i fili di segnale. Non usiamo CLK INH sul pin 15 e quindi lo colleghiamo direttamente alla barra negativa (filo nero). SH/L̅D̅ sul pin 1 va collegato al pin 3 dell’Arduino (filo verde). Il segnale CLK sul pin 2 va collegato al pin 2 dell’Arduino (filo arancione). E l’uscita seriale Q H sul pin 9 va collegata al pin 4 (filo giallo).

Questi sono i collegamenti necessari per controllare il 74HC165 e leggere i dati. Nella prossima sezione collegheremo dei pulsanti come ingressi digitali ai pin di ingresso.

Collegare pulsanti al registro a scorrimento 74HC165

Possiamo collegare qualsiasi tipo di segnale digitale ai pin di ingresso (A…H) del 74HC165. Ma per provare, collegheremo alcuni pulsanti. Inizieremo collegando un solo pulsante. Lo schema qui sotto mostra lo stesso circuito di prima più il collegamento per un pulsante.

Connecting a button to the 74HC165 Shift Register
Collegamento di un pulsante al registro a scorrimento 74HC165

Il pulsante è collegato in una pull-down configuration con una resistenza da 10KΩ. Questo significa che quando il pulsante viene premuto il segnale va a massa. Per ottenere questo, colleghiamo un pin del pulsante alla barra positiva (filo rosso) e il pin opposto alla barra negativa tramite la resistenza da 10KΩ.

L’uscita del pulsante è collegata all’ingresso digitale A sul pin 11 del 74HC165 (filo viola). Nota che l’altra estremità del filo viola è collegata allo stesso pin della resistenza, perché il collegamento interno del pulsante è il seguente:

Internal wiring of Push Button
Collegamento interno del pulsante

Assicurati di inserire il pulsante nella breadboard con l’orientamento corretto. Se vuoi saperne di più sui pulsanti, dai un’occhiata al nostro tutorial How to use a Push Button with Arduino.

Nota che potresti anche collegare il pulsante in configurazione pull-up, ma l’uscita su Q H sarebbe invertita. Per compensare puoi usare l’uscita complementare Q̅ H per invertirla di nuovo oppure gestire l’inversione nel codice.

Collegare più pulsanti

Lo schema qui sotto mostra come collegare altri 7 pulsanti per creare segnali per tutti gli 8 ingressi digitali A…H del 74HC165. Sono tutti collegati allo stesso modo del singolo pulsante sopra, solo che le uscite vanno agli altri ingressi B…H del 74HC165 (fili viola).

Connecting multiple buttons to the 74HC165 Shift Register
Collegamento di più pulsanti al registro a scorrimento 74HC165

Come puoi vedere, sono un bel po’ di fili ; ) Vediamo ora cosa bisogna fare per leggere lo stato di questi pulsanti.

Codice per leggere i pulsanti con il registro a scorrimento 74HC165

In questa sezione leggiamo lo stato dei pulsanti collegati al 74HC165. Il codice è semplice e segue i passaggi definiti dallo schema logico del 74HC165:

  1. Porta SH/L̅D̅ a livello basso per caricare i dati
  2. Riporta SH/L̅D̅ a livello alto
  3. Ripeti 8 volte i seguenti passaggi
    • Porta CLK a livello alto per spostare i dati
    • Riporta CLK a livello basso

Guarda prima il codice completo qui sotto, poi ne discuteremo i dettagli.

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}
 
void loop() {
  // Load input bits into latches
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
 
  for (int i = 0; i < 8; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    // Shift out the next bit to QH
    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }
 
  Serial.println();
  delay(1000);
}

Nel codice qui sopra, leggiamo 8 bit di ingresso digitale dal registro a scorrimento 74HC165 e li stampiamo ogni secondo.

Costanti e variabili

Iniziamo definendo le costanti dataPin , clockPin , e latchPin che rappresentano i pin collegati ai pin data (QH), clock (CLK) e latch (SH/LD) del registro a scorrimento 74HC165. Nota che puoi usare anche altri pin di Arduino. Basta che il cablaggio e il codice corrispondano.

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD

Funzione di setup

Nella funzione setup() inizializziamo la comunicazione seriale a 9600 baud. Impostiamo anche il dataPin come INPUT e i clockPin e latchPin come OUTPUT, dato che leggeremo i dati dal pin data e controlleremo i pin clock e latch.

void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

Funzione loop

Nella funzione loop() per prima cosa carichiamo i bit di ingresso nei latch del registro a scorrimento attivando il pin latch.

void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);

  ...
}

Poi cicliamo su ciascuno degli 8 bit, leggiamo il loro valore dal pin data, li stampiamo (come ‘1’ o ‘0’) e spostiamo il bit successivo attivando il pin clock. Infine, aggiungiamo un ritardo di 1 secondo tra ogni ciclo di lettura.

void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);

  for (int i = 0; i < 8; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }

  Serial.println();
  delay(1000);
}

Con questo circuito e codice puoi ora leggere 8 ingressi digitali usando solo tre pin del tuo Arduino. E, ovviamente, funziona allo stesso modo anche su ESP8266 o ESP32. Se esegui questo codice dovresti vedere un output simile a questo sul Serial Monitor.

Output on Serial Monitor
Output sul Serial Monitor

Il pattern effettivo dei bit dipenderà dai pulsanti che premi mentre il programma è in esecuzione. Come dicevo, in realtà ho usato un DIP switch e collegato solo i primi quattro switch per testare il circuito e il codice. L’immagine qui sotto mostra la mia breadboard con il circuito.

Arduino with 74HC165 Shift Register and DIP switch
Arduino con registro a scorrimento 74HC165 e DIP switch

Con il circuito e il codice sopra puoi leggere fino a 8 ingressi digitali. Se ti servono ancora più ingressi, puoi collegare in cascata più registri a scorrimento 74HC165. Come si fa, lo vediamo nella prossima sezione.

Collegamento in cascata di registri a scorrimento 74HC165

Puoi collegare l’uscita seriale Q H di un registro a scorrimento 74HC165 all’ingresso seriale SER di un altro 74HC165 per metterli in cascata. In questo modo puoi leggere 16 invece di 8 ingressi digitali.

Chaining two 74HC165 via QH and SER
Collegamento in cascata di due 74HC165 tramite Q H e SER

E non devi fermarti qui. Puoi continuare a collegarne quanti vuoi; così puoi avere praticamente un numero arbitrario di ingressi digitali. E la cosa migliore è che tutti questi registri a scorrimento 74HC165 sono controllati sempre dagli stessi tre pin.

Lo schema qui sotto mostra come collegare 16 pulsanti come ingressi a un Arduino usando due registri a scorrimento 74HC165. Sembra complicato ma in realtà è solo una duplicazione del cablaggio visto sopra.

Chaining two 74HC165 two read 16 Buttons
Collegamento in cascata di due 74HC165 per leggere 16 pulsanti

Nota che CLK e SH/LD dei 74HC165 sono collegati in parallelo e l’unica differenza rispetto al collegamento di un singolo 74HC165 è la cascata tramite i pin Q H e SER.

Codice per leggere da registri a scorrimento 74HC165 in cascata

Il codice per leggere i dati da due registri a scorrimento 74HC165 in cascata è una semplice estensione del codice per un singolo 74HC165. Vedi sotto:

const int dataPin = 4;   // QH
const int clockPin = 2;  // CLK
const int latchPin = 3;  // SH/LD

const byte numBits = 16;  
  
void setup() {
  Serial.begin(9600);
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}
 
void loop() {
  digitalWrite(latchPin, LOW);
  digitalWrite(latchPin, HIGH);
 
  for (int i = 0; i < numBits; i++) {
    int bit = digitalRead(dataPin);
    Serial.print(bit ? "1" : "0");

    digitalWrite(clockPin, HIGH); 
    digitalWrite(clockPin, LOW);
  }
 
  Serial.println();
  delay(1000);
}

Aggiungiamo solo una costante numBits che ci permette di definire quanti bit vogliamo leggere. Nel caso di un solo 74HC165 sarebbero 8 bit. Se usiamo due registri a scorrimento possiamo leggere 8 * 2 = 16 bit, e così via.

Usare ArduinoShiftIn per leggere dal registro a scorrimento 74HC165

Se non vuoi scrivere il tuo codice per gestire il controllo del registro a scorrimento 74HC165, esiste una comoda libreria che ti aiuta. Si chiama ArduinoShiftIn ma dovrebbe funzionare anche su ESP32 o ESP8266. È particolarmente utile quando colleghi in cascata più registri 4HC165 e vuoi leggere i dati di ingresso in una sola variabile.

Per installare la libreria ArduinoShiftIn vai su ArduinoShiftIn github repo , scarica il Zip file e poi aggiungilo all’Arduino IDE tramite: Sketch > Include Library > Add .ZIP > seleziona il file zip.

Il seguente esempio di codice è tratto da uno degli esempi di ArduinoShiftIn e mostra come leggere da due registri a scorrimento 74HC165:

#include "ShiftIn.h"

ShiftIn<2> shift;  // 2 = two 74HC165 

void setup() {
  Serial.begin(9600);
  // pLoadPin, clockEnablePin, dataPin, clockPin
  shift.begin(8, 9, 11, 12);
}

void displayValues() {
  for(int i = 0; i < shift.getDataWidth(); i++)
    Serial.print(shift.state(i));
  Serial.println();
}

void loop() {
  if(shift.update()) 
    displayValues();
  delay(1);
}

Devi specificare il numero di registri a scorrimento 74HC165 in cascata quando dichiari l’oggetto shift :

ShiftIn<2> shift;

Nella funzione di setup avviamo la comunicazione seriale e definiamo i pin per controllare il registro a scorrimento 74HC165.

void setup() {
  Serial.begin(9600);
  // pLoadPin, clockEnablePin, dataPin, clockPin
  shift.begin(8, 9, 11, 12);
}

Nota che la libreria ArduinoShiftIn usa tutti e quattro i pin, mentre negli esempi di codice e circuito abbiamo collegato CLK INH a massa e non l’abbiamo usato. Qui invece devi definire clockEnablePin (= CLK INH) e collegarlo.

La funzione displayValues() , come dice il nome, mostra i valori di ingresso letti da

void displayValues() {
  for(int i = 0; i < shift.getDataWidth(); i++)
    Serial.print(shift.state(i));
  Serial.println();
}

La funzione shift.getDataWidth() riceve il numero di bit da leggere. Non devi moltiplicare tu il numero di registri a scorrimento per 8. E shift.state() restituisce lo stato dell’ingresso numero i .

Infine, la funzione loop. Chiama displayValues() , ma solo se lo stato di uno degli ingressi è cambiato, cosa segnalata dalla funzione shift.update() .

void loop() {
  if(shift.update()) 
    displayValues();
  delay(1);
}

Nota però che shift.update() non è event-driven e semplicemente interroga lo stato dei registri a scorrimento 74HC165 alla velocità del loop – in questo esempio con un ritardo di 1 microsecondo.

Il cablaggio necessario è essenzialmente lo stesso di prima, con la differenza che si usano pin di controllo diversi e che bisogna collegare anche il CLK INH ad Arduino.

Wiring of two 74HC165 for the  ArduinoShiftIn library
Collegamento di due 74HC165 per la libreria ArduinoShiftIn

In sintesi, la libreria ArduinoShiftIn semplifica il codice per leggere gli ingressi da registri a scorrimento 74HC165 in cascata ma ha il piccolo svantaggio di occupare un pin GPIO in più (CLK INH). Tuttavia, se colleghi molti (fino a 8) registri a scorrimento, di solito non è un problema, visto che hai molti più ingressi disponibili.

Conclusioni

In questo tutorial hai imparato come usare il registro a scorrimento 74HC165 per aggiungere un numero arbitrario di ingressi digitali al tuo microcontrollore. Il circuito e il codice mostrati usano Arduino, ma funzionano anche su ESP32 ed ESP8266.

Al contrario di GPIO expanders che può leggere e scrivere ingressi e uscite analogiche, il registro a scorrimento 74HC165 è limitato alla lettura di soli ingressi digitali. Tuttavia, il 74HC165 è generalmente molto più economico di una scheda GPIO expander.

Se vuoi anche scrivere molte uscite, dai un’occhiata al nostro tutorial More Arduino Outputs With 74HC595 Shift Register , che usa un altro tipo di registro a scorrimento per scrivere dati invece che leggerli.

Se ti servono ingressi e uscite analogiche, un GPIO expander come l’MCP23017, ad esempio, è la scelta migliore. Dai un’occhiata al nostro tutorial Using GPIO Expander MCP23017 With Arduino , per maggiori informazioni.

E ora, sentiti libero di realizzare progetti con un sacco di ingressi e uscite ; )

Domande frequenti

Ecco alcune domande frequenti sull’uso del registro a scorrimento 74HC165.

D: Cos’è un registro a scorrimento 74HC165?

R: Il 74HC165 è un registro a scorrimento parallel-in/serial-out che ti permette di espandere il numero di ingressi digitali sul tuo Arduino usando solo tre pin.

D: Quanti ingressi può gestire il registro a scorrimento 74HC165?

R: Il registro a scorrimento 74HC165 può gestire fino a 8 ingressi digitali, utile per progetti che richiedono più dispositivi di input.

D: Come collego il registro a scorrimento 74HC165 al mio Arduino?

R: Puoi collegare il registro a scorrimento 74HC165 al tuo Arduino cablando gli ingressi paralleli ai tuoi dispositivi di input e collegando il pin di uscita seriale ai pin digitali dell’Arduino.

D: Posso collegare in cascata più registri a scorrimento 74HC165?

R: Sì, puoi collegare in cascata più registri a scorrimento 74HC165 per espandere ulteriormente il numero di ingressi, permettendoti di collegare più dispositivi di input al tuo Arduino.

D: Quali sono i principali vantaggi dell’uso del registro a scorrimento 74HC165 nei progetti Arduino?

R: I principali vantaggi dell’uso del registro a scorrimento 74HC165 sono l’espansione del numero di ingressi senza occupare tutti i pin dell’Arduino, la semplificazione del cablaggio riducendo il numero di collegamenti necessari e la possibilità di interfacciarsi in modo efficiente con più dispositivi di input.

D: Il registro a scorrimento 74HC165 può essere usato anche con altri microcontrollori oltre ad Arduino?

R: Sì, il registro a scorrimento 74HC165 può essere usato con altri microcontrollori che supportano operazioni di input/output digitale.

D: Posso usare il registro a scorrimento 74HC165 in progetti che richiedono il monitoraggio in tempo reale degli ingressi?

R: Sì, il registro a scorrimento 74HC165 è adatto a progetti che richiedono il monitoraggio in tempo reale degli ingressi, perché permette di leggere rapidamente più ingressi digitali.

D: Ci sono suggerimenti comuni per la risoluzione dei problemi con il registro a scorrimento 74HC165?

R: I suggerimenti più comuni per la risoluzione dei problemi con il registro a scorrimento 74HC165 includono il ricontrollo dei collegamenti, assicurarsi che i segnali di clock e latch siano corretti e verificare che il formato dei dati in ingresso nel codice corrisponda alla configurazione del registro a scorrimento.