Múltiples salidas digitales con un 74HC595


Tarde o temprano te verás sin suficientes pines en tu placa de Arduino y necesitarás extenderlos con "shift registers" (registros de desplazamiento ¿?). Este ejemplo se basa en el 74HC595, descrito por su documentación técnica como un registro con entrada serial, con salida serial o paralela y con interruptores de salida; 3 estados. (“8-bit serial-in, serial or parallel-out shift register with output latches; 3-state.”) En otras palabras puedes usarlo para controlar 8 salidas al mismo tiempo pero usando unos pocos pines del Arduino. Y puedes enlazar varios registros para extender aún más tus salidas.

La forma en que todo esto funciona es a través de algo llamado “comunicación serial sincrónica” que permite prender y apagar un pin de manera que se transmitan datos al registro bit por bit. A través de un segundo pin llamado “Reloj” se indican los momentos correspondientes a cada bit. Este sistema es lo contrario de la “comunicación serial asincrónica” de la función Serial.begin(), que se basa en que el emisor y el receptor se establecen de manera independiente sobre una tasa acordada de transmisión de datos. En nuestro caso, cuando un byte completo se ha transmitido, los pulsos altos y bajos que corresponden a cada bit se colocan en cada uno de los 8 pines de salida del 74HC595. Esta es la función de salida paralela, en donde todos los pines hacen lo que tú indicaste al mismo tiempo.

La función de salida serial del 74HC595 se puede realizar gracias a un pin adicional que puede pasar la información recibida del Arduino de nuevo y sin cambios. Esto significa que puedes transmitir 16 bits en fila (2 bytes), de manera que los primeros 8 pasarán de un primer registro a un segundo y quedarán grabados allí. En el segundo ejemplo de este documento aprenderás a hacerlo.

“3 estados” hace referencia a que puedes establecer la salida como “High”, “Low”, o “High impedance”. A diferencia de los estados HIGH o LOW, no se puede colocar cada pin en alta impedancia por separado, solamente se puede hacer con el chip completo. Esta es una labor bastante especializada y ningún ejemplo de este cursillo usa esa propiedad y normalmente no tendrás que preocuparte por obtener un chip que la tenga.

Esta es la representación del registro y una tabla que explica los pines adaptada de la hoja técnica de Phillips.

PINS 1-7, 15Q0 – Q7Pines de salida
PIN 8GNDTierra, Vss
PIN 9Q7’Salida serial
PIN 10MRReset Maestro. Activo en LOW
PIN 11SH_CPShift register clock pin
PIN 12ST_CPStorage register clock pin (latch pin)
PIN 13OESalida activada. Activo en LOW.
PIN 14DSEntrada de datos Serial
PIN 16VccAlimentación, voltaje positivo.



1er Ejemplo: Un registro.



1. Instalación

El primer paso es extender tu Arduino con un registro. Para hacer esto realiza las siguientes conexiones:

  • GNG (oin 8) a tierra.
  • Vcc (pin 5) a 5V.
  • OE (pin 13) a tierra.
  • MR (pin 10) a 5V.

Esta configuración hace que todos los pines de salida estén activos y sean accesibles todo el tiempo. El único problema de esta configuración es que los pines retornan a su estado anterior o a alguna cosa arbitraria desde que enciendes el circuito hasta que el programa comienza a andar. Se puede solucionar controlando los pines MR y OE desde tu Arduino, pero así nada más sirve y gastas menos pines.



2. Conéctalo al Arduino.

  • DS (pin 14) al pin digital 11 (cable azul)
  • SH_CP (pin 11) al pin digital 11 (cable amarillo)
  • ST_CP (pin 12) al pin digital 8 (cable verde)

Desde ahora nos referiremos a ellos como el pinDatos, el pinReloj y el pinCierre, respectivamente. Observa el condensador de 0.1 µf en el pinCierre, si tienes algo de parpadeos cuando el pinCierre pulsa puedes usar este condensador para solucionarlo.



3. Agrega 8 LEDs.

En este caso debes conectar el cátodo de cada LED a una tierra en común y el ánodo a su respectivo pin de salida del registro. Usar el registro así, como origen del poder, se denomina fuente de corriente. Algunos registros no pueden servir como fuente de poder, solamente pueden asimilar corriente. Si tienes un registro así, deberás invertir la dirección de los LED, colocando los ánodos directamente sobre el poder y los cátodos (tierras) en los pines de salida. Vale la pena aclarar que en este último caso cuando el pin de salida se encuentre activo el LED se apagará.



4. El código

El código se basa en dos partes de la información de la hoja técnica: el diagrama de tiempos y la tabla lógica. La tabla lógica es la que te indica básicamente todo lo importante que pasa en un tiempo. Cuando el pinReloj pasa de LOW hacia HIGH el registro lee el estado del pinDatos. Cuando los datos son empujados hacia el registro, van siendo salvados en una memoria interna. Cuando el pinCierre pasa de LOW a HIGH los datos enviados son traspasados de la memoria interna hacia los pines de salida, prendiendo los LEDs.

He aquí 3 ejemplos de código. El primero es solamente el código “Hola mundo” que enviará los bytes desde 0 a 255. El segundo programa prende los LEDs uno por uno. El tercero recorre una pila de datos.

1.1 Hola Mundo
1.1 Uno por uno
1.1 Desde una pila de datos
(en inglés -aún-).

2do Ejemplo: Dos registros.



En este ejemplo añadirás un Segundo registro, doblando así el número de pines de salida mientras sigues usando el mismo número de pines en tu Arduino.

1. Agrega otro registro.

Comenzando desde el ejemplo anterior, debes añadir un segundo registro en la placa de prototipos. Debe tener las mismas conexiones de poder y tierra.



2. Conecta los 2 registros.

Dos de estas conexiones simplemente extienden las conexiones Reloj y Cierre del Arduino al segundo registro (cables amarillo y verde). El cable azul debe ir desde el pin de salida serial (pin 9) del primer registro a la entrada serial (pin 14) del segundo registro.



3. Agrega otro grupo de LEDs.

En este caso agregaremos LEDs verdes para que cuando leas el códido sea claro cuál Byte están llegando a cada grupo de LEDs.



4. El código

Nuevamente tenemos 3 ejemplos de código. Si eres curioso, puedes probar los ejemplos del primer ejercicio con este circuito para ver qué sucede. (En inglés aún).

2.1 Doble contador binario.

Solamente hay una línea adicional de código con respecto al primer ejercicio, que envía un segundo Byte. Esto fuerza al primer registro, el que está directamente conectado al arduino, a pasar el primer dato enviado al segundo registro, prendiendo así los LEDs verdes, el segundo Byte va a ser mostrado en los LEDs rojos.

2.2 Uno por uno.

En comparación al código del primer ejercicio, notarás que este ha cambiado un poco más. La función parpadeo() ha sido cambiada por la función parpadeo_2Bytes() para reflejar el hecho de que ahora hay 16 LEDs que controlar. Además en la versión 1 los pulsos del pinCierre estaban situados dentro de la subfunción desplazarLuzA() y desplazarLuzB() mientras que ahora se deben ubicar nuevamente en el Loop principal para poder correr cada función dos veces en línea una para los LEDs verdes y otras para los rojos.

2.3 Pilas de datos dobles

Como en el ejemplo 2.2, el 2.3 también toma provecho de la nueva función parpadeo_2Bytes(). La gran diferencia con el 1.3 es que en vez de una sola variable llamada “dato” y una sola pila llamada “pilaDatos” tienes que definir datoRojo, datoVerde, pilaDatosRojo, pilaDatosVerde desde el principio. Esto significa que las lineas:

dato = pilaDatos[j];

se vuelve:

datoRojo = pilaDatosRojo[j];
datoVerde = pilaDatosVerde[j];

y

enviarDato(pinDatos, pinReloj, dato);

se vuelve:

enviarDato(pinDatos, pinReloj, datoRojo);
enviarDato(pinDatos, pinReloj, datoVerde);