Select Page

¿Alguna vez te has encontrado con ganas de controlar muchos LED?

  • Como un cubo de led con 74HC595.
  • Muchos semáforos en una maqueta.
  • Muchos relee´s
  • ¡Muchos UNOs y CEROs por todos lados !

¿O simplemente necesitaba más pines de E / S para controlar botones, sensores y servos a la vez? Bueno, podrías conectar algunos sensores a los pines Arduino, pero rápidamente comenzaría a quedarse sin pines.

No por esto vas a comprar un Arduino MEGA. Con un 595 estás salvado o salvada.

La solución para esto es utilizar un «Registro de desplazamiento» o shift register en inglés. Un registro de desplazamiento le permite expandir la cantidad de pines de E / S que puede usar desde su Arduino (o cualquier microcontrolador). Y el registro de desplazamiento 74HC595 (apodado «595») es uno de los más famosos entre todos.

Antes de seguir:

  • No funciona como entrada al Arduino. Solo como salida (está escrito E/S porque así es como se llaman a los pines de un micro). Si queres usar un chip para ahorrar entradas usas el 74HC165.
  • No podes usar PWM, solo UNOs y CEROs. Para multiplicar los PWM usa un PCA9685. ¡PERO podemos usar un truco!
  • Si podes en cascada todos los que quieras. Pero ¡CUIDADO! ¡Ojito ojete con la latencia! Porque según la velocidad del clock, vas a tardar en actualizar el último.

El 595 controla 8 pines de salida separados, utilizando solo tres pines de entrada. Y si necesitás más de 8 líneas de E / S adicionales, puedes conectar fácilmente tantos registros de desplazamiento como desees y crear toneladas de líneas de E / S. Todo esto se logra mediante lo que se conoce como desplazamiento de bits. Si desea saber más sobre el desplazamiento de bits, este recurso de Wikipedia es invaluable. Esta en ingles, pero el español no es tan bueno.

Cuándo usar un shift register

Los registros de desplazamiento a menudo se usan con el propósito de ahorrar los pines en el microcontrolador, ya que cada microcontrolador tiene un número limitado de pines de E / S (GPIO).

Si tu proyecto necesita controlar 16 LED individuales, eso normalmente requeriría 16 pines de un Arduino. En el caso de que no tenga 16 pines de E / S disponibles, aquí es donde el registro de desplazamiento es útil. Con dos registros de desplazamiento conectados en serie, podemos realizar la tarea de controlar los 16 LED con el uso de solo 3 pines de E / S. Y no solo esto; puedes ahorrar aún más pines cuanto más registros de desplazamiento hayas encadenado.

SIPO Vs PISO Shift Registers

Los registros de desplazamiento vienen en dos tipos básicos, SIPO (Serial-In-Parallel-Out) o PISO (Parallel-In-Serial-Out). El popular chip SIPO es 74HC595, y el chip PISO es 74HC165.

El primer tipo, SIPO o entrada serie – salida paralelo, es útil para controlar una gran cantidad de salidas, como los LED. Mientras que el último tipo, PISO o entrada paralelo – salida serial, es bueno para reunir una gran cantidad de entradas, como botones o sensores digitales; como el usado en el Controlador original de Nintendo.

Shift register 74HC595 PinOut

Echemos un vistazo a su Pinout. Observe que dos pines tienen una línea sobre su nombre; Esto significa que operan en «lógica negativa». Lo sabrás un poco más adelante.

Pero significa que se activa con CERO lógico.

74HC595 Shift Register 2

GND debe estar conectado a la tierra de Arduino.

VCC es la fuente de alimentación para el registro de desplazamiento 74HC595 al que conectamos el pin de 5V en el Arduino.

El pin SER (entrada en serie) se utiliza para alimentar datos en el registro de desplazamiento de a poco.

SRCLK (Shift Register Clock) es el reloj para el registro de desplazamiento. El 595 funciona con reloj en el flanco ascendente. Esto significa que para cambiar bits en el registro de desplazamiento, el reloj debe ser ALTO. Y los bits se transfieren en el borde ascendente del reloj.

RCLK (Register Clock / Latch) es un pin muy importante. Cuando se conduce ALTO, el contenido del Registro de desplazamiento se copia en el Registro de almacenamiento / enganche; que finalmente aparece en la salida. Por lo tanto, el pasador de retención se puede ver como el paso final en el proceso para ver nuestros resultados en la salida, que en este caso son LED.

El pin SRCLR (Shift Register Clear) nos permite restablecer todo el Shift Register, haciendo que todos sus bits sean 0, a la vez. Este es un pin lógico negativo, así que para realizar este reinicio; necesitamos establecer el pin SRCLR BAJO. Cuando no se requiere reinicio, este pin debe ser ALTO.

OE (Salida habilitada) también es lógica negativa: cuando el voltaje en él es ALTO, los pines de salida están deshabilitados / configurados en estado de alta impedancia y no permiten que la corriente fluya. Cuando el OE tiene bajo voltaje, los pines de salida funcionan normalmente.

QA – QH (Salida habilitada) son los pines de salida y deben conectarse a algún tipo de salida, como LED, 7 segmentos, etc.

QH ’Pin genera el bit 7 del Shift Register. Está allí para que podamos conectar en cadena los 595: si conecta este QH ‘al pin SER de otro 595, y le da a ambos IC la misma señal de reloj, se comportarán como un solo IC con 16 salidas. Por supuesto, esta técnica no se limita a dos circuitos integrados: puede conectar en cadena tantos como desee, si tiene suficiente potencia para todos ellos.

74HC595 Shift Register 3

Cómo funciona un shift register 74HC595

El HC595 tiene dos registros (que pueden considerarse como «contenedores de memoria»), cada uno con solo 8 bits de datos. El primero se llama Shift Register. El registro de desplazamiento se encuentra en lo profundo del chip, aceptando silenciosamente la entrada.

Cada vez que aplicamos un pulso de reloj a un 595, suceden dos cosas:

  • Los bits en el Registro de desplazamiento se mueven un paso hacia la izquierda. Por ejemplo, el bit 7 acepta el valor que estaba anteriormente en el bit 6, el bit 6 obtiene el valor del bit 5, etc.
  • El bit 0 en el registro de desplazamiento acepta el valor actual en el pin DATA. En el borde ascendente del pulso, si el pin de datos es alto, entonces se introduce un 1 en el registro de desplazamiento. De lo contrario, es un 0.


Al habilitar el pin de Latch, el contenido del Registro de desplazamiento se copia en el segundo registro, denominado Registro de almacenamiento / Latch. Cada bit del Registro de almacenamiento está conectado a uno de los pines de salida QA – QH del IC, por lo que, en general, cuando cambia el valor en el Registro de almacenamiento, también cambian las salidas.

Pongamos un gif gráfico de lo que pasa.

74HC595 Shift Register 4

El pulso de Latch, debe ser dado en el momento justo. SI lo manas antes o después, el dato en el registro de almacenamiento quedará MAL.

Conectando UN 74HC595 Shift Register al Arduino UNO

Ahora que tenemos una comprensión básica de cómo funciona el 74HC595, ¡podemos comenzar a conectarlo a nuestro Arduino!

Comenzamos colocando el registro de desplazamiento en un protoboard, asegurándose de que cada lado del IC esté en un lado separado de la placa de pruebas. Con la pequeña muesca en forma de U mirando hacia arriba.

EMpecemos conectando los pines 16 (VCC) y 10 (SRCLR) al pin 5v del Arduino y conecte los pines 8 (GND) y 13 (OE) al pin Gnd del Arduino. Esto debería mantener el IC en el modo de trabajo normal.

A continuación, debemos conectar los tres pines con los que controlaremos el registro de desplazamiento:

  • Pin 11 (SRCLK) del registro de desplazamiento al pin 6 en el Arduino
  • Pin 12 (RCLK) del registro de desplazamiento al pin 5 en el Arduino
  • Pin 14 (SER) del registro de desplazamiento al pin 4 en el Arduino

Ahora, solo tenemos que conectar todos los pines de salida a nuestros LED, asegurando que se coloque una resistencia de 220Ω antes de los LED para reducir la corriente y que los cátodos de los LED vuelvan a tierra.

Tiene que quedar algo como esto.

74HC595 Shift Register 5

Código 74HC595 para Arduino

No requiere ninguna librería. Se utiliza una función llamada: shiftOut();

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);
}
74HC595 Shift Register 6
Con el programa anterior vas a poder ver estos leds.

74HC595 PWM

Como complemento, aquí hay otro proyecto, basado en la misma configuración pero con una pequeña diferencia, donde manipulamos otro pin de control en el IC, es decir, OE, y al hacerlo, ¡podemos controlar el brillo de los LED de salida!

TODOS POR IGUAL

Ya hemos aprendido 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 (funciona con lógica negativa, ¿recuerdas?). Y cuando el OE tiene bajo voltaje, los pines de salida funcionan normalmente.

En nuestro ejemplo anterior, habíamos conectado este pin permanentemente a tierra, habilitando las salidas todo el tiempo. Si conectamos este pin a cualquiera de los pines digitales del Arduino y lo programamos para alternar su estado, podemos obtener algo como se ilustra a continuación.

En realidad, las partes ALTAS de la señal PWM aún causarán que el pin OE deshabilite temporalmente todas las salidas IC. Pero, esto sucederá, por supuesto, más rápido de lo que nuestros ojos pueden percibir directamente, pero definitivamente sentiremos una variación en el brillo general.

Para hacer esto, todo lo que necesita hacer es cambiar la conexión al pin 13 del 74HC595. Para que en lugar de conectarlo a tierra, lo conecte al pin 3 del Arduino.

74HC595 Shift Register 7
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);
}
74HC595 Shift Register 8

Conectando DOS o más 74HC595 Shift Register al Arduino UNO

Una curiosidad del 74HC595, es que si le metemos un tren de más bits de los 8 que puede almacenar, sencillamente los va empujando hacia la salida por su pin 9 (que os habréis fijado no hemos utilizado en el ejemplo anterior) y los va dejando caer al olvido.

Pero si conectamos este pin 9, al pin 14 de entrada de datos de un segundo chip 74HC595, y compartimos entre ellos el Clock y el Latch, en lugar de caer en el olvido entrará en el siguiente chip de la cadena y seguirá en el juego.

Hemos conseguido una ampliación de otras 8 salidas digitales sin utilizar pines adicionales de nuestro Arduino. Y naturalmente una vez visto el truco, no hay límite en principio al número de chips que podemos concatenar.

74HC595 Shift Register 9

Donde comprar HC595

PatagoniaTec

Amazon

Alibaba

A %d blogueros les gusta esto: