Icono del sitio Programando a medianoche

Como utilizar displays de 7 segmentos con Arduino

Display de 7 segmentosLos displays de 7 segmentos no son más que 7 LEDs dispuestos de tal forma que podamos «dibujar» todos los dígitos del sistema decimal, y algunos además poseen un octavo LED para mostrar un punto.  Obviamente, para poder manejar el display, necesitamos 8 puertos (uno para cada LED), y si necesitamos utilizar 2 displays deberíamos tener 16 puertos, pero exceptuando algunos modelos particulares, la mayoría de las placas de Arduino tienen 14 puertos digitales, como el Arduino Uno que es el más utilizado (se puede observar en el artículo Plataformas de hardware que escribí hace un tiempo). Incluso si no utilizáramos el punto necesitaríamos 7 puertos por cada display, lo que nos daría 14 puertos y nos quedaríamos sin más puertos para otros dispositivos.

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!

Salir de la versión móvil