Skip to Content

Más entradas con el registro de desplazamiento 74HC165

Más entradas con el registro de desplazamiento 74HC165

En este tutorial te mostraré cómo añadir más entradas a tu Arduino o ESP8266/ESP32 usando el registro de desplazamiento 74HC165.

El popular Arduino UNO tiene 14 pines GPIO que puedes usar para entrada (o salida) de datos. Muchas veces esto es suficiente, pero a veces necesitas más. Podrías comprar un Arduino más caro como un  Arduino Mega  con 54 pines GPIO o un  GPIO expander board . Pero la forma más económica es usar un registro de desplazamiento como el  74HC165 .

El 74HC165 proporciona 8 entradas, solo utiliza 3 pines de tu Arduino y se puede encadenar para leer tantas entradas como necesites. La única desventaja es que es más lento que usar directamente los pines GPIO del Arduino. Es muy útil, por ejemplo, para decodificar teclados o si tienes muchos sensores digitales.

Vamos a empezar con las piezas necesarias antes de ver en detalle cómo funciona el registro de desplazamiento 74HC165.

Componentes necesarios

Usé un Arduino Uno para este proyecto, pero cualquier otra placa Arduino o una placa ESP8266/ESP32 funcionará igual de bien. He puesto un conjunto de pulsadores en la lista, pero en mi montaje real utilicé un DIP switch, ya que es más compacto. Sin embargo, los pulsadores también sirven perfectamente.

Arduino

Arduino Uno

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

USB Data Sync cable Arduino

Cable USB para Arduino UNO

74HC165 Shift Register

Registro de desplazamiento 74HC165

Pulsador

Kit de resistencias y LEDs

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.

Función del registro de desplazamiento 74HC165

El 74HC165 es un registro de desplazamiento de 8 bits con carga paralela que lee 8 entradas digitales en paralelo y luego las saca en serie por un solo pin. Necesita una entrada de reloj para sincronizar el desplazamiento de los 8 bits de entrada al pin de salida serie, y otra señal para controlar la carga de los datos de entrada.

Esto significa que con solo tres pines y un 74HC165 puedes leer hasta 8 entradas digitales. Además, puedes encadenar varios 74HC165 y así leer un número prácticamente ilimitado de entradas digitales, ¡usando solo tres pines de tu microcontrolador!

Diagrama funcional en bloques

La imagen de abajo muestra el diagrama funcional en bloques del registro de desplazamiento 74HC165. Puedes ver las 8 entradas digitales en paralelo (A…H) en la parte superior. La salida serie Q H y su complemento Q̅ H están a la derecha. Y en el centro se encuentran los latches ( flip-flops ) donde se cargan los datos de entrada.

Functional Block Diagram of the 74HC165 Shift Register
Diagrama funcional en bloques del registro de desplazamiento 74HC165 ( source )

Las entradas de control están a la izquierda. SH/L̅D̅ habilita las 8 entradas digitales cuando está en bajo. CLK (o CLK INH) desplaza los datos uno a uno hacia la salida serie Q H . Y SER es la entrada serie que se usa al encadenar varios registros de desplazamiento 74HC165.

Diagrama lógico

La siguiente imagen muestra el diagrama lógico del proceso. La señal CLK sincroniza el desplazamiento de las entradas digitales (A…H) hacia la salida serie Q H y su inversa Q̅ H .

Logic diagram of the 74HC165 Shift Register
Diagrama lógico del registro de desplazamiento 74HC165 ( source )

La señal de reloj está deshabilitada mientras clock-inhibit (CLK INH) esté en alto. De igual forma, para cargar las entradas digitales, SH/L̅D̅ debe estar en bajo. SER solo se usa al encadenar varios registros de desplazamiento.

En resumen, para desplazar las 8 entradas digitales A…H a la salida serie Q H hay que seguir los siguientes pasos.

  1. Pon SH/L̅D̅ en bajo para cargar los datos
  2. Pon SH/L̅D̅ de nuevo en alto
  3. Repite 8 veces los siguientes pasos
    • Pon CLK en alto para desplazar los datos
    • Pon CLK de nuevo en bajo

CLK INH no es necesario y podemos dejarlo en bajo todo el tiempo. Además, si solo usas un registro de desplazamiento 74HC165, la entrada SER no se utiliza.

Distribución de pines

En la imagen de abajo encontrarás la distribución de pines del registro de desplazamiento 74HC165. La alimentación se suministra a través de V CC y GND. El voltaje de alimentación V CC puede variar entre 2V y 6V, y el voltaje de salida en el pin Q H está determinado por V CC .

Pinout of the 74HC165 Shift Register
Distribución de pines del registro de desplazamiento 74HC165 ( source )

La función del resto de los pines ya la hemos comentado antes, pero la siguiente tabla resume la función de todos los pines. Puedes encontrar más detalles en el Datasheet for the 74HC165 Shift Register .

Pin functions of the 74HC165 Shift Register
Funciones de los pines del registro de desplazamiento 74HC165 ( source )

En la siguiente sección, conectaremos el registro de desplazamiento 74HC165 a un Arduino.

Conexión del registro de desplazamiento 74HC165 a Arduino

Para simplificar, vamos a conectar el 74HC165 al Arduino sin ninguna señal en los pines de entrada de datos A…H al principio. La imagen de abajo muestra el cableado de este primer paso.

Connecting the 74HC165 Shift Register to Arduino
Conexión del registro de desplazamiento 74HC165 a Arduino

Empecemos con las conexiones de alimentación. Lleva un cable negro desde el pin GND del Arduino al carril negativo de la protoboard. Luego usa un cable rojo para conectar el 5V del Arduino al carril positivo. Después, conecta los dos carriles negativos de la protoboard con un cable negro. No usamos el segundo carril positivo, así que no hace falta conectarlo.

Ahora, conectemos la alimentación del 74HC165. Conecta el pin 8 (GND) del 74HC165 al carril negativo (cable negro) y el pin 16 (V CC ) al carril positivo (cable rojo).

Por último, los cables de señal. No usamos CLK INH en el pin 15, así que lo conectamos directamente al carril negativo (cable negro). SH/L̅D̅ en el pin 1 se conecta al pin 3 del Arduino (cable verde). La señal CLK en el pin 2 se conecta al pin 2 del Arduino (cable naranja). Y la salida serie Q H en el pin 9 se conecta al pin 4 (cable amarillo).

Y estas son las conexiones necesarias para controlar el 74HC165 y obtener datos de él. En la siguiente sección conectaremos algunos botones como entradas digitales a los pines de entrada.

Conexión de botones al registro de desplazamiento 74HC165

Podríamos conectar cualquier tipo de señal digital a los pines de entrada (A…H) del 74HC165. Pero para probarlo, vamos a conectar algunos botones. Empezaremos conectando un solo botón. El diagrama de cableado de abajo muestra el mismo circuito de antes más el cableado para un botón.

Connecting a button to the 74HC165 Shift Register
Conexión de un botón al registro de desplazamiento 74HC165

El botón está conectado en una configuración pull-down configuration con una resistencia de 10KΩ. Esto significa que cuando se pulsa el botón, la señal se lleva a tierra. Para lograr esto, conectamos un pin del botón al carril positivo (cable rojo) y el pin opuesto al carril negativo a través de la resistencia de 10KΩ.

La salida del botón se conecta a la entrada digital A en el pin 11 del 74HC165 (cable morado). Ten en cuenta que el otro extremo del cable morado se conecta al mismo pin que la resistencia, ya que el cableado interno del botón es el siguiente:

Internal wiring of Push Button
Cableado interno del pulsador

Asegúrate de insertar el botón en la orientación correcta en la protoboard. Y si necesitas más información sobre pulsadores, échale un vistazo a nuestro tutorial How to use a Push Button with Arduino.

Ten en cuenta que también podrías cablear el botón en configuración pull-up, pero la salida en Q H estaría entonces invertida. Para compensar esto, podrías usar la salida complementaria Q̅ H para invertirla de nuevo o gestionar la inversión en el código.

Conexión de varios botones

El diagrama de cableado de abajo muestra cómo conectar 7 botones más para crear señales para las 8 entradas digitales A…H del 74HC165. Todos están cableados igual que el botón anterior, solo que las salidas se conectan a las otras entradas B…H del 74HC165 (cables morados).

Connecting multiple buttons to the 74HC165 Shift Register
Conexión de varios botones al registro de desplazamiento 74HC165

Como puedes ver, eso son muchos cables ; ) Vamos a ver qué hay que hacer para leer el estado de estos botones.

Código para leer botones con el registro de desplazamiento 74HC165

En esta sección leemos el estado de los botones conectados al 74HC165. El código es sencillo y sigue los pasos definidos por el diagrama lógico del 74HC165:

  1. Pon SH/L̅D̅ en bajo para cargar los datos
  2. Pon SH/L̅D̅ de nuevo en alto
  3. Repite 8 veces los siguientes pasos
    • Pon CLK en alto para desplazar los datos
    • Pon CLK de nuevo en bajo

Echa un vistazo al código completo de abajo y luego comentamos los detalles.

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);
}

En el fragmento de código anterior, estamos leyendo 8 bits de entrada digital del registro de desplazamiento 74HC165 y mostrándolos cada segundo.

Constantes y variables

Empezamos definiendo las constantes dataPin , clockPin y latchPin que representan los pines conectados a los pines de datos (QH), reloj (CLK) y latch (SH/LD) del registro de desplazamiento 74HC165. Ten en cuenta que puedes usar otros pines del Arduino si lo prefieres. Solo asegúrate de que el cableado y el código coincidan.

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

Función setup

En la función setup() , inicializamos la comunicación serie a 9600 baudios. También configuramos el dataPin como INPUT y los clockPin y latchPin como OUTPUT, ya que vamos a leer datos del pin de datos y controlar los pines de reloj y latch.

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

Función loop

En la función loop() , primero cargamos los bits de entrada en los latches del registro de desplazamiento activando el pin latch.

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

  ...
}

Luego, recorremos cada uno de los 8 bits, leemos su valor del pin de datos, los mostramos (como ‘1’ o ‘0’) y desplazamos el siguiente bit activando el pin de reloj. Finalmente, añadimos un retardo de 1 segundo entre cada ciclo de lectura.

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 este código y circuito ya puedes leer 8 entradas digitales usando solo tres pines de tu Arduino. Y, por supuesto, esto funciona igual en un ESP8266 o ESP32. Si ejecutas este código deberías ver una salida como esta en tu Monitor Serie.

Output on Serial Monitor
Salida en el Monitor Serie

El patrón real de bits dependerá de los botones que pulses mientras se ejecuta el programa. Como mencioné antes, yo usé un DIP switch y solo conecté los primeros cuatro para probar el circuito y el código. La imagen de abajo muestra mi protoboard con el circuito.

Arduino with 74HC165 Shift Register and DIP switch
Arduino con registro de desplazamiento 74HC165 y DIP switch

Con el circuito y el código anteriores puedes leer hasta 8 entradas digitales. Si necesitas aún más entradas, puedes encadenar varios registros de desplazamiento 74HC165. Cómo hacerlo es el tema de la siguiente sección.

Encadenamiento de registros de desplazamiento 74HC165

Puedes conectar la salida serie Q H de un registro de desplazamiento 74HC165 a la entrada serie SER de otro 74HC165 para encadenarlos. Así puedes leer 16 en vez de 8 entradas digitales.

Chaining two 74HC165 via QH and SER
Encadenando dos 74HC165 mediante Q H y SER

Y no tienes que parar ahí. Puedes seguir encadenando tantos como quieras, permitiéndote un número prácticamente ilimitado de entradas digitales. Y lo mejor es que todos los registros de desplazamiento 74HC165 se controlan con los mismos tres pines.

El diagrama de cableado de abajo muestra cómo conectar 16 botones como entradas a un Arduino usando dos registros de desplazamiento 74HC165. Parece complicado, pero en realidad es solo duplicar el cableado anterior.

Chaining two 74HC165 two read 16 Buttons
Encadenando dos 74HC165 para leer 16 botones

Ten en cuenta que los pines CLK y SH/LD de los 74HC165 están conectados en paralelo y la única diferencia respecto al cableado de un solo 74HC165 es el encadenamiento mediante Q H y los pines SER.

Código para leer desde registros de desplazamiento 74HC165 encadenados

El código para leer datos de dos registros de desplazamiento 74HC165 encadenados es una simple extensión del código para leer de un solo 74HC165. Mira abajo:

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);
}

Simplemente añadimos una constante numBits que nos permite definir cuántos bits queremos leer. En el caso de un solo 74HC165 serían 8 bits. Si usamos dos registros de desplazamiento podemos leer 8 * 2 = 16 bits, y así sucesivamente.

Usando ArduinoShiftIn para leer desde el registro de desplazamiento 74HC165

Si no quieres escribir tu propio código para controlar el registro de desplazamiento 74HC165, hay una pequeña librería que te puede ayudar. Se llama ArduinoShiftIn y también funciona en ESP32 o ESP8266. Es especialmente útil cuando encadenas varios registros de desplazamiento 74HC165 y quieres leer los datos de entrada en una sola variable.

Para instalar la librería ArduinoShiftIn ve al ArduinoShiftIn github repo , descarga el Zip file y añádelo a tu Arduino IDE desde: Sketch > Include Library > Add .ZIP > selecciona el archivo zip.

El siguiente ejemplo de código es de uno de los ejemplos de ArduinoShiftIn y muestra cómo leer desde dos registros de desplazamiento 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);
}

Tienes que especificar el número de registros de desplazamiento 74HC165 encadenados al declarar el objeto shift :

ShiftIn<2> shift;

En la función setup establecemos la comunicación serie y definimos los pines para controlar el registro de desplazamiento 74HC165.

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

Ten en cuenta que la librería ArduinoShiftIn usa los cuatro pines, mientras que en los ejemplos de código y circuito conectamos CLK INH a tierra y no lo usamos. Aquí tienes que definir el clockEnablePin (= CLK INH) y conectarlo.

La función displayValues() , como su nombre indica, muestra los valores de entrada leídos de la v

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

La función shift.getDataWidth() recibe el número de bits a leer. No tienes que multiplicar tú mismo el número de registros de desplazamiento por 8. Y shift.state() devuelve el estado de la entrada número i .

Por último, la función loop. Llama a displayValues() , pero solo si el estado de alguna de las entradas ha cambiado, lo que se indica con la función shift.update() .

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

Ten en cuenta, sin embargo, que shift.update() no es por eventos, simplemente consulta el estado de los registros de desplazamiento 74HC165 a la velocidad del loop, en este ejemplo con un retardo de 1 microsegundo.

El cableado necesario es básicamente el mismo que antes, con la diferencia de que se usan diferentes pines de control y que tienes que conectar el CLK INH al Arduino.

Wiring of two 74HC165 for the  ArduinoShiftIn library
Cableado de dos 74HC165 para la librería ArduinoShiftIn

En resumen, la librería ArduinoShiftIn simplifica el código para leer entradas de registros de desplazamiento 74HC165 encadenados, pero tiene la pequeña desventaja de que ocupa un pin GPIO más (CLK INH). Sin embargo, si encadenas muchos (hasta 8) registros de desplazamiento, normalmente no es un problema, ya que tendrás muchas entradas adicionales.

Conclusiones

En este tutorial has aprendido cómo usar el registro de desplazamiento 74HC165 para añadir un número arbitrario de entradas digitales a tu microcontrolador. El circuito y el código mostrados usan un Arduino, pero también funcionarán en un ESP32 o ESP8266.

A diferencia de GPIO expanders que puede leer y escribir entradas y salidas analógicas, el registro de desplazamiento 74HC165 solo permite leer entradas digitales. Sin embargo, el 74HC165 suele ser mucho más barato que una placa expansora de GPIO.

Si también quieres controlar muchas salidas, échale un vistazo a nuestro tutorial More Arduino Outputs With 74HC595 Shift Register , que usa otro tipo de registro de desplazamiento para escribir datos en vez de leerlos.

Si necesitas entradas y salidas analógicas, una expansión GPIO como la MCP23017, por ejemplo, es mejor opción. Consulta nuestro tutorial Using GPIO Expander MCP23017 With Arduino , para más información sobre esto.

Y ahora, ¡anímate a crear proyectos con un montón de entradas y salidas! ; )

Preguntas frecuentes

Aquí tienes algunas preguntas frecuentes sobre el uso del registro de desplazamiento 74HC165.

P: ¿Qué es un registro de desplazamiento 74HC165?

R: El 74HC165 es un registro de desplazamiento de entrada paralela/salida serie que te permite ampliar el número de entradas digitales en tu Arduino usando solo tres pines.

P: ¿Cuántas entradas puede manejar el registro de desplazamiento 74HC165?

R: El registro de desplazamiento 74HC165 puede manejar hasta 8 entradas digitales, lo cual es útil para proyectos que requieren varios dispositivos de entrada.

P: ¿Cómo conecto el registro de desplazamiento 74HC165 a mi Arduino?

R: Puedes conectar el registro de desplazamiento 74HC165 a tu Arduino cableando las entradas paralelas a tus dispositivos de entrada y conectando el pin de salida serie a los pines digitales del Arduino.

P: ¿Puedo encadenar varios registros de desplazamiento 74HC165?

R: Sí, puedes encadenar varios registros de desplazamiento 74HC165 para ampliar aún más el número de entradas, permitiéndote conectar más dispositivos de entrada a tu Arduino.

P: ¿Cuáles son las principales ventajas de usar el registro de desplazamiento 74HC165 en proyectos con Arduino?

R: Las principales ventajas de usar el registro de desplazamiento 74HC165 son que puedes ampliar el número de entradas sin ocupar todos los pines de tu Arduino, simplificar el cableado al reducir el número de conexiones necesarias y poder conectar varios dispositivos de entrada de forma eficiente.

P: ¿Se puede usar el registro de desplazamiento 74HC165 con otros microcontroladores además de Arduino?

R: Sí, el registro de desplazamiento 74HC165 se puede usar con otros microcontroladores que soporten operaciones de entrada/salida digital.

P: ¿Puedo usar el registro de desplazamiento 74HC165 en proyectos que requieren monitorización de entradas en tiempo real?

R: Sí, el registro de desplazamiento 74HC165 es adecuado para proyectos que requieren monitorización de entradas en tiempo real, ya que permite leer rápidamente varias entradas digitales.

P: ¿Hay algún consejo común para solucionar problemas con el registro de desplazamiento 74HC165?

R: Algunos consejos comunes para solucionar problemas con el registro de desplazamiento 74HC165 son revisar bien las conexiones, asegurarse de que se envían correctamente las señales de reloj y latch, y verificar que el formato de los datos de entrada en tu código coincida con la configuración del registro de desplazamiento.