¿Te gustaría aprender cómo utilizar el registro de desplazamiento 74HC595 con tu Arduino? En este artículo vamos a explicar paso a paso cómo funciona este componente y cómo puedes conectarlo a tu placa para ampliar las posibilidades de tus proyectos. ¡Sigue leyendo para descubrir todo lo que necesitas saber!
Una de las cosas buenas de Arduino es que tiene un montón de pines de E/S con los que trabajar. Puedes conectar algunos botones, sensores, servos, etc., pero a medida que la lista crece, rápidamente te quedarás sin pines.
La solución es utilizar un “registro de desplazamiento” que le permita agregar más pines de E/S al Arduino (o cualquier microcontrolador). Con diferencia, el registro de desplazamiento más utilizado es el 74HC595, también llamado simplemente “595”.
El 74HC595 controla ocho pines de salida diferentes con sólo tres pines de entrada. Si necesita más de 8 pines de E/S, puede hacer esto cadena de margaritas tantos registros de desplazamiento como sean necesarios para generar una gran cantidad de pines de E/S.
El 74HC595 logra esto mediante una técnica llamada cambio de bits. Si desea obtener más información sobre el cambio de bits, esto es lo que puede encontrar Artículo de Wikipedia extremadamente útil.
¿Cuándo debería utilizar un registro de desplazamiento?
Los registros de desplazamiento se utilizan a menudo para aumentar el número de pines de E/S en un microcontrolador.
Por ejemplo, si su proyecto necesita controlar 16 LED individuales, por supuesto necesitará 16 pines de un Arduino, lo cual no es posible. Aquí es donde entra en juego el registro de desplazamiento.
Con dos registros de desplazamiento conectados en serie, puede controlar 16 LED con solo tres pines de E/S. Esa es una gran diferencia, y cuantos más registros de desplazamiento encadene, más pines se agregarán. En teoría, se puede agregar un número infinito de pines de E/S encadenando registros de desplazamiento.
El Mando original de Nintendo, publicado en 1985, es una aplicación práctica de un registro de desplazamiento. El microcontrolador principal de Nintendo Entertainment System utilizaba registros de desplazamiento para capturar las pulsaciones de botones del controlador.
Registros de desplazamiento SIPO vs. PISO
Hay dos tipos de registros de desplazamiento: SIPO (Serial-In-Parallel-Out) y PISO (Parallel-In-Serial-Out).
SIPO es adecuado para controlar una gran cantidad de salidas, como por ejemplo LED. Mientras que PISO se utiliza para capturar una gran cantidad de entradas como: B. Botones, es útil, similar al controlador original de Nintendo discutido anteriormente.
El chip SIPO más popular es 74HC595y es el chip PISO más popular 74HC165.
¿Cómo funciona el registro de turnos 74HC595?
El 74HC595 tiene dos registros de 8 bits (que podemos considerar como “contenedores de memoria”). El primero se llama registro de desplazamiento y el segundo se llama registro de memoria/enclavamiento.
Cada vez que el 74HC595 recibe un pulso de reloj, suceden dos cosas:
- Los bits contenidos en el registro de desplazamiento se desplazan una posición hacia la izquierda. El valor del bit 0 se desplaza al bit 1, mientras que el valor del bit 1 se desplaza al bit 2, y así sucesivamente.
- El bit 0 en el registro de desplazamiento toma el valor actual en el pin DATA. Si el pin DATA está alto en el flanco ascendente del pulso de reloj, se empuja 1 al registro de desplazamiento; de lo contrario, 0.
Este proceso continúa mientras el 74HC595 esté sincronizado.
Cuando el pasador de pestillo está habilitado, el contenido del registro de desplazamiento se copia en la memoria/registro de pestillo. Cada bit del registro de memoria está conectado a uno de los pines de salida QA-QH del IC. Esto hace que la salida cambie cada vez que cambia el valor en el registro de almacenamiento.
La siguiente animación te ayudará a entenderlo mejor.
Distribución de pines del registro de desplazamiento 74HC595
Es importante tener en cuenta que varias empresas fabrican el mismo chip 74HC595. En este artículo discutiremos la omnipresente SN74HC595N de Texas Instruments. Si tienes uno diferente, lee atentamente la hoja de datos y anota cualquier diferencia.
Echemos un vistazo al pinout.
Tierra es el pin de tierra.
VCC es la fuente de alimentación para el registro de desplazamiento 74HC595, que debe conectarse a 5V.
SER (entrada serie) El pin se utiliza para enviar datos al registro de desplazamiento bit a bit.
SRCLK (reloj de registro de desplazamiento) es el reloj para el registro de desplazamiento y se activa mediante un flanco positivo. Esto significa que los bits se desplazan con el flanco ascendente del reloj.
RCLK (registro de reloj/cierre) Es un pin muy importante. Cuando este pin se coloca en ALTO, el contenido del registro de desplazamiento se copia en el registro de memoria/enclavamiento, que eventualmente aparece en la salida. Por lo tanto, el pasador de seguridad puede verse como el paso final antes de ver nuestros resultados en la salida.
SRCLR (borrar registro de desplazamiento) Con este pin podemos restablecer todo el registro de desplazamiento y poner todos los bits a cero. Dado que es un pin activo bajo, debemos colocar el pin SRCLR en BAJO para realizar el reinicio.
OE (versión de salida) También es un pin activo-bajo: cuando se tira a ALTO, los pines de salida se desactivan (se ponen en el estado de alta impedancia). Cuando se baja, los pines de salida funcionan normalmente.
QA–QH (versión de salida) son los pines de salida.
QH' El pin emite el bit 7 del registro de desplazamiento. Esto le permite conectar el 74HC595 en serie. Si conecta este pin al pin SER de otro 74HC595 y suministra la misma señal de reloj a ambos IC, se comportarán como si fueran un solo IC con 16 salidas. Por supuesto, puede utilizar esta tecnología para conectar cualquier número de circuitos integrados en serie.
Cableado de un registro de desplazamiento 74HC595 a un Arduino
Ahora que conocemos los conceptos básicos de cómo funciona el 74HC595, ¡podemos comenzar a conectarlo a nuestro Arduino!
Comience colocando el registro de turnos en su placa. Asegúrese de que cada lado del IC esté en un lado diferente de la placa. Con la pequeña muesca en forma de U hacia arriba, el pin 1 del chip está a la izquierda de esta muesca.
Conecte los pines 16 (VCC) y 10 (SRCLR) a la salida de 5 V del Arduino y los pines 8 (GND) y 13 (OE) a tierra. Esto debería mantener el IC en modo de funcionamiento normal.
Luego, conecte los tres pines utilizados para controlar el registro de desplazamiento. Conecte el pin 11 (SRLKK), el pin 12 (RCLK) y el pin 14 (SER) del registro de desplazamiento a los pines 6, 5 y 4 del Arduino.
Todo lo que queda es conectar los LED a los pines de salida. Conecte el cátodo (pin corto) de cada LED a una tierra común y el ánodo (pin largo) de cada LED a su respectivo pin de salida del registro de desplazamiento.
No olvide conectar una resistencia de 220 Ω en serie para proteger los LED de sobrecargas.
Al conectar los LED, asegúrese de que QA esté conectado al primer LED y QH al último. De lo contrario, los LED no se encenderán en el orden correcto.
El siguiente diagrama le muestra cómo cablear todo.
Usar el registro de desplazamiento para suministrar energía de esta manera se llama Adquisición de electricidad. Algunos registros de desplazamiento no pueden suministrar energía, sino que sólo pueden hacer lo que se llama corriente decreciente. Si tienes uno de estos, necesitarás invertir la dirección de los LED y conectar los ánodos directamente a la fuente de alimentación y los cátodos a las salidas del registro de desplazamiento.
código de ejemplo de arduino
Aquí hay un boceto de ejemplo que enciende cada LED uno a la vez hasta que están todos encendidos, luego los apaga todos y el ciclo se repite.
Primero, prueba el boceto y luego lo analizaremos en detalle.
int latchPin = 5; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4; // Data pin of 74HC595 is connected to Digital pin 4
byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off
/*
* setup() - this function runs once when you turn your Arduino on
* We initialize the serial connection with the computer
*/
void setup()
{
// Set all the pins of 74HC595 as OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
/*
* loop() - this function runs over and over again
*/
void loop()
{
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
}
/*
* updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
Después de cargar el código en Arduino, debería ver el siguiente resultado:
Explicación del código:
El primer paso es definir los tres pines de control del 74HC595, es decir, los pines de cierre, reloj y datos, que están conectados a los pines digitales n.° 5, n.° 6 y n.° 4 del Arduino respectivamente.
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
A continuación se llama una variable leds
del tipo de datos byte
se define. El tipo de datos byte puede almacenar ocho bits, lo cual es ideal para rastrear el estado de encendido/apagado de ocho LED.
// Variable to hold the pattern of which LEDs are currently turned on or off
byte leds = 0;
En la función “Setup” simplemente configuramos los tres pines como salida digital.
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
La función de bucle primero apaga todos los LED configurando todos los bits de las variables. leds
establecer en 0 y llamar a una función definida por el usuario updateShiftRegister()
. hablamos de como updateShiftRegister()
Funciona más tarde.
El programa se detiene durante medio segundo antes de contar del 0 al 7. for
bucle y la variable i
.
Durante cada iteración, la función incorporada bitSet()
Se llama para establecer el bit en la variable. leds
que controla un LED específico, y la función updateShiftRegister()
Se llama para cambiar el estado de los LED. Luego hay un retraso de medio segundo antes de incrementar i
y encendiendo el siguiente LED.
void loop()
{
leds = 0;
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(500);
}
}
La función updateShiftRegister()
Primero establece el pasador de retención en BAJO y luego llama a la función integrada shiftOut()
antes de volver a colocar el pasador de bloqueo en ALTO.
El IDE de Arduino incluye un Desplazar fuera() Función diseñada específicamente para registros de desplazamiento. Usando esta función podemos desplazar un byte de datos bit a bit.
El shiftOut()
La función acepta cuatro entradas, las dos primeras son pines de datos y reloj. El tercer parámetro especifica si los bits deben desplazarse en el orden MSBFIRST o LSBFIRST (primero el bit más significativo o primero el bit menos significativo). El último parámetro en este caso son los datos reales que se enviarán. leds
.
Cuando configura el pasador de retención en ALTO, el contenido del registro de desplazamiento se copia al registro de memoria/retención. Tenga en cuenta que configuramos el pasador de bloqueo en BAJO antes de cambiar los bits; de lo contrario, los LED incorrectos parpadearían mientras se cargan datos en el registro de desplazamiento.
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
Ejemplo 2 de Arduino: control de brillo mediante PWM
Aquí hay otro proyecto basado en la misma configuración pero con una ligera variación: ¡manipulamos el pin OE en el IC para controlar el brillo de los LED de salida!
Ya sabemos que el pin OE (Output Enable) actúa como un interruptor. Cuando este pin está configurado en ALTO, los pines de salida están deshabilitados (recuerde, está activo-bajo). Cuando OE está configurado en BAJO, los pines de salida funcionan normalmente.
En nuestro ejemplo anterior conectamos OE a tierra para que la salida pueda estar activa en cualquier momento. Si conectamos este pin a uno de los pines digitales del Arduino y lo programamos para alternar su estado, podemos obtener el siguiente resultado.
Sin embargo, al conectar OE a uno de los pines habilitados para PWM de Arduino, podemos controlar el brillo de los LED como se muestra a continuación.
alambrado
Todo lo que necesitas hacer es cambiar la conexión al pin 13 (OE) del 74HC595. En lugar de conectar OE a tierra, conéctelo al pin 3 de Arduino.
Código de ejemplo
Este boceto funciona de manera similar al anterior, excepto que una vez que todos los LED estén encendidos, se volverán a apagar gradualmente.
int latchPin = 5; // Latch pin of 74HC595 is connected to Digital pin 5
int clockPin = 6; // Clock pin of 74HC595 is connected to Digital pin 6
int dataPin = 4; // Data pin of 74HC595 is connected to Digital pin 4
int outputEnablePin = 3; // OE pin of 74HC595 is connected to PWM pin 3
byte leds = 0; // Variable to hold the pattern of which LEDs are currently turned on or off
/*
* setup() - this function runs once when you turn your Arduino on
* We initialize the serial connection with the computer
*/
void setup()
{
// Set all the pins of 74HC595 as OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
}
/*
* loop() - this function runs over and over again
*/
void loop()
{
setBrightness(255);
leds = 0; // Initially turns all the LEDs off, by giving the variable 'leds' the value 0
updateShiftRegister();
delay(500);
for (int i = 0; i < 8; i++) // Turn all the LEDs ON one by one.
{
bitSet(leds, i); // Set the bit that controls that LED in the variable 'leds'
updateShiftRegister();
delay(500);
}
for (byte b = 255; b > 0; b--) // Gradually fade all the LEDs back to off
{
setBrightness(b);
delay(50);
}
}
/*
* updateShiftRegister() - This function sets the latchPin to low, then calls the Arduino function 'shiftOut' to shift out contents of variable 'leds' in the shift register before putting the 'latchPin' high again.
*/
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
/*
* setBrightness() - Generates PWM signal and writes it to OE pin.
*/
void setBrightness(byte brightness) // 0 to 255
{
analogWrite(outputEnablePin, 255-brightness);
}
Cuando cargue el código en Arduino, debería ver el siguiente resultado:
Cómo funciona el registro de desplazamiento 74HC595 y cómo conectarlo a Arduino
Una de las cosas atractivas de Arduino es que tiene una cantidad considerable de pines de E/S para trabajar. Puedes conectar algunos botones, sensores, servos, y más, pero a medida que la lista crece, rápidamente te quedarás sin pines.
La solución es usar un ‘registro de desplazamiento’, que te permite agregar más pines de E/S a Arduino (o cualquier microcontrolador). El registro de desplazamiento más ampliamente utilizado es el 74HC595, también conocido como simplemente «595».
¿Cuándo deberías usar un registro de desplazamiento?
Los registros de desplazamiento se utilizan a menudo para aumentar el número de pines de E/S en un microcontrolador.
Por ejemplo, si tu proyecto necesita controlar 16 LED individuales, por supuesto, requerirás 16 pines de Arduino, lo cual no es posible. Aquí es donde el registro de desplazamiento resulta útil.
Con dos registros de desplazamiento conectados en serie, puedes controlar 16 LEDs con solo tres pines de E/S. Esa es una diferencia considerable, y cuantos más registros de desplazamiento en cadena, más pines agregarás. En teoría, mediante la encadenación de registros de desplazamiento, se puede agregar un número infinito de pines de E/S.
SIPO frente a PISO Registros de Desplazamiento
Hay dos tipos de registros de desplazamiento, SIPO (serial-in-parallel-out) y PISO (parallel-in-serial-out). SIPO es útil para controlar un gran número de salidas, como LEDs. Mientras que PISO es útil para recopilar un gran número de entradas, como botones, similar al controlador original de Nintendo discutido anteriormente.
El chip SIPO más popular es el 74HC595, y el chip PISO más popular es el 74HC165.
¿Cómo funciona el registro de desplazamiento 74HC595?
El 74HC595 tiene dos registros de 8 bits (que se pueden considerar como «contenedores de memoria»). El primero se denomina Registro de Desplazamiento, y el segundo como Registro de Almacenamiento/Latch.
Al recibir un pulso de reloj, el 74HC595 realiza dos cosas:
- Los bits contenidos en el registro de desplazamiento se desplazan a la izquierda en una posición. El valor del bit 0 se empuja al bit 1, mientras que el valor del bit 1 se empuja al bit 2, y así sucesivamente.
- El bit 0 en el registro de desplazamiento acepta el valor actual en el pin de DATOS.
Este proceso continuará siempre que el 74HC595 sea sincronizado.
Pinout del Registro de Desplazamiento 74HC595
Es importante tener en cuenta que varias empresas fabrican el mismo chip 74HC595. En este artículo, discutiremos el ubicuo SN74HC595N de Texas Instruments. Si tienes un chip diferente, lee detenidamente la hoja de datos y toma nota de cualquier diferencia.
Vamos a echar un vistazo a su pinout:
- GND es el pin de tierra.
- VCC es la fuente de alimentación para el registro de desplazamiento 74HC595, que debe estar conectada a 5V.
- El pin SER (Entrada Serial) se utiliza para enviar datos al registro de desplazamiento uno por uno.
- SRCLK (Reloj del Registro de Desplazamiento) es el reloj para el registro de desplazamiento y es activado por el flanco positivo. Esto significa que los bits se empujan en el flanco ascendente del reloj.
- RCLK (Reloj del Registro / Latch) es un pin muy importante. Cuando este pin se activa (HIGH), los contenidos del Registro de Desplazamiento se copian en el Registro de Almacenamiento/Latch, que aparece eventualmente en la salida.
No olvides añadir una resistencia de 220 Ω en serie para proteger los LEDs de sobrecargas.
Conexión de un Registro de Desplazamiento 74HC595 a Arduino
Ahora que conocemos los fundamentos de cómo funciona el 74HC595, podemos comenzar a conectarlo a nuestro Arduino.
Comienza colocando el registro de desplazamiento en tu protoboard. Asegúrate de que cada lado del CI esté en un lado diferente de la protoboard. Con la muesca en forma de U mirando hacia arriba, el pin 1 del chip debe estar a la izquierda de esta muesca.
Conecta los pines 16 (VCC) y 10 (SRCLR) a la salida de 5V de Arduino, y los pines 8 (GND) y 13 (OE) a la tierra. Esto debe mantener el CI en modo de trabajo normal.
A continuación, conecta los tres pines que se utilizarán para controlar el registro de desplazamiento. Conecta el pin 11 (SRCLK), el pin 12 (RCLK), y el pin 14 (SER) del registro de desplazamiento a los pines 6, 5 y 4 de Arduino, respectivamente.
Todo lo que queda es conectar los LEDs a los pines de salida. Conecta el cátodo (pin corto) de cada LED a una tierra común, y el ánodo (pin largo) de cada LED al respectivo pin de salida del registro de desplazamiento.
La siguiente imagen muestra cómo cablear todo:
Cuando conectes los LEDs, asegúrate de que QA esté conectado al primer LED y QH al último; de lo contrario, los LEDs no se iluminarán en el orden correcto.
Código de Ejemplo para Arduino
Aquí tienes un ejemplo de código que enciende cada LED sucesivamente hasta que todos estén encendidos, luego los apaga y se repite el ciclo:
«`cpp
// Coloca aquí tu código de Arduino
«`
Explorar el código y experimentar con diferentes configuraciones te permitirá comprender mejor cómo funciona el registro de desplazamiento 74HC595 con Arduino y cómo utilizarlo en tus proyectos.
¡Interesante artículo! Justo lo que necesitaba para entender mejor cómo funciona el registro de desplazamiento 74HC595 con Arduino. ¡Gracias por compartir esta información!
¡Excelente explicación! Me dejó todo clarísimo sobre cómo utilizar el registro de desplazamiento 74HC595 con Arduino. ¡Gracias por este tutorial tan útil!
¡Qué buena guía! Me ayudó un montón a entender cómo usar el registro de desplazamiento 74HC595 con Arduino. ¡Gracias por la ayuda, ahora puedo poner en práctica lo aprendido!
¡Vaya artículo completo y claro! Me siento mucho más seguro ahora sobre cómo conectar el registro de desplazamiento 74HC595 a Arduino. ¡Gracias por la explicación detallada!