Para solucionar esto podemos utilizar el integrado 74HC595 que nos permite enviarle de forma serial el estado de cada bit de un byte (o sea, le pasamos el estado de 8 bits) y después éste se encarga de pasar ese estado a cada una de sus salidas. Cada vez que enviamos un bit los anteriores se «mueven» un lugar hacia la derecha y el nuevo queda a la izquierda. Si enviamos más de 8 bits el más antiguo se envía a una pata de salida que se puede conectar a la entrada de otro integrado 74HC595, permitiéndonos conectar tantos integrados como bytes necesitemos sin utilizar más pines del microcontrolador.
Para utilizar el integrado 74HC595 sólo necesitamos 3 pines de nuestro microcontrolador: una para enviar los bits (entrada, pin 14), otro para decir cuándo terminamos de enviar los datos (latch, pin 12) y un último para el avisar cuándo estamos enviando cada uno de los bits (clock, pin 11). Si vamos a conectar más de un integrado tenemos que conectar la salida de cada uno (pin 9) a la entrada del siguiente, de esta forma se van a ir pasando los bits de uno a otro.
Un ejemplo de esto se puede ver en el siguiente diagrama que utiliza dos integrados para controlar 16 LEDs utilizando sólo 3 salidas del microcontrolador:
En mi caso en lugar de conectar 16 LEDs conecté 2 displays, lo que es casi lo mismo. A continuación les muestro cómo conecté a mi Arduino los displays:
Este tipo de conversión de serie a paralelo (o sea, le enviamos de forma serial uno a uno cada bit y el integrado los devuelve todos juntos en paralelo), también conocido como «ShiftOut», se explica de forma más detallada en el artículo de Arduino «Serie a Paralelo con un 74HC595«.
También pueden encontrar más información en el data sheet del integrado: Phillip’s datasheet.
El prototipo puede quedar un poco «engorroso» por la cantidad de cables, pero cuando lo pasemos a una placa se verá mejor.
A continuación les dejo una función que armé para facilitar el envío de número de dos dígitos a los displays:
const int latchPin ; //Salida conectada al pin 12 del 74HC595 (Latch) const int dataPin ; //Salida conectada al pin 14 del 74HC595 (Data) const int clockPin ; //Salida conectada al pin 11 del 74HC595 (Clock)*/ /* Los bits 0 son los encendidos (escribí cada posicion en base 1) --8-- | | 3 7 | | --2-- | | 4 6 | | --5-- .1 */ byte const numbers[10] = { 0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000011, 0b11111000, 0b10000000, 0b10011000 }; void showNumber(byte num) { //Tomo cada dígito del número que me pasan byte digit1 = num / 10; byte digit2 = num - (digit1 * 10); //Paso bit a bit al multiplexor digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numbers[digit2]); shiftOut(dataPin, clockPin, MSBFIRST, numbers[digit1]); digitalWrite(latchPin, HIGH); }
Por último les dejo un Archivo con el esquema de cómo conectar un Arduino a dos displays de 7 segmentos (se puede abrir con la aplicación Fritzing, una herramienta gratuita para diseñar esquemas, diagramas y el PCB), y un video del proyecto funcionando:
Espero les sea de utilidad.
Suerte!