
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!
