Introduction: Ejemplo Básico Con IC MAX7219 (Matriz LED Y Visualizadores De 7 Segmentos)

Controlar un par de diodos LED con un microcontrolador cualquiera es algo sencillo, simplemente nos hace falta poner una resistencia para limitar el flujo de corriente y no fundir nuestro LED y poco más. ¡Es muy simple!

Precisamente porque es muy simple, no suele ser lo habitual. Un LED nos ofrece muy poca información sobre lo que está sucediendo. Simplemente nos da un dato binario: ENCENDIDO o APAGADO, FUNCIONANDO o PARADO, SÍ o NO, BIEN o MAL...

Pero no podemos leer un número en un simple LED, ni una letra, menos aún una serie de números o un mensaje de texto... simplemente no es posible obtener esa información de un simple LED (a no ser que pretendas leer un código morse de un LED que parpadea o algo más extraño...).

Al conjunto de los mortales nos gusta leer números en visualizadores de 7 segmentos, esos elementos que tienen varios segmentos que se iluminan para formar uno o más dígitos. ¡En realidad son varios LED! ¡Y en realidad son 8 segmentos, no 7 (¿nadie se quiere acordar del punto decimal?)!

Pero aún hay mejores formas de visualizar información implicando diodos LED... ¡matrices! La mejor forma de tener un montón de LEDs en un mismo sitio, todos juntos. Normalmente sus dimensiones son de 8x8, con lo que tenemos 64 diodos LED en un mismo paquete, con los que podemos visualizar números, texto, formar e incluso hacer eso en toda una gama de colores... ¡hay matrices RGB que juntan un total de 192 diodos LED (64 x 3 colores)!

Pero nuestro microcontrolador necesitaba una salida digital para cada LED, ¿cómo vamos a iluminar todo eso? La placa Arduino Mega tiene tan solo (¡!) 53 salidas digitales, ¿cómo vamos a poner en funcionamiento 64 diodos LED?

No solo vamos a hacerlo con 64, sino que podríamos hacerlo con muchos más. Y empleando tan solo 3 cables... la respuesta es multiplexado y drivers.

Step 1: Comprender El Multiplexado

Entrando en materia, seguramente aún estés sorprendido de que se puedan manejar tantos diodos LED con tan pocas conexiones... la solución es incluso más sorprendente. Para ello debemos comprender la forma en la que funciona el ojo humano.

Modulación por ancho de pulso (~PWM)

¿Te suenan de algo "24 fotogramas por segundo"? A la hora de grabar vídeos, crear animaciones por ordenador o cualquier otro desarrollo audiovisual... el número de fotogramas diferentes que deben crearse para visualizarse por segundo no es algo aleatorio, sino que se basa en el propio ojo humano y la forma en la que el cerebro procesa información. Si actualizamos la información a un ritmo de 24 fotogramas por segundo, no podremos darnos cuenta de que se tratan en realidad de imágenes fijas sucesivas que se superponen. Simplemente no podemos procesar la información visual a un ritmo más rápido.

En electrónica esta limitación se convierte en una ventaja explotable que posiblemente ya has conocido, quizá sin darte ni cuenta... ¿Has probado a controlar la intensidad de un LED en un pin PWM? Es uno de los ejemplos básicos que encontramos en el entorno Arduino.

Ciertamente aparenta que el LED cambia su brillo progresivamente... pero en realidad el LED solo se enciende y se apaga. Lo hace tan rápido que somos incapaces de verlo. Pero lo que sí vemos es que brilla más o menos. Eso se consigue cambiando el tiempo que está encendido frente al tiempo que está apagado. Si viésemos el LED con una cámara de alta velocidad podríamos ver que realmente lo que hace es encenderse y apagarse muy rápido, ¡varios miles de veces cada segundo!

Multiplexado

Con el uso de PWM podemos ver que aún cuando un LED se enciende y se apaga realmente, nuestra percepción puede ser otra. Nosotros simplemente vemos ese LED un poco menos brillante si se apaga y enciende lo suficientemente rápido.

Sabiendo esto, podemos llegar a la conclusión de que quizá no hace falta encender todos los diodos LED de nuestro visualizador de 7 segmentos o nuestra matriz LED al mismo tiempo. Es más, no es que podamos hacer eso, es que no podemos encender individualmente y a gusto cada LED si quisiéramos. Para un visualizador de 8 segmentos y 4 dígitos (o bytes) necesitaríamos 64 conexiones (2 por cada LED X 8 segmentos X 4 dígitos)... para una matriz de un solo color y de dimensiones 8x8 necesitaríamos 128 y si fuésemos a usar una matriz RGB de las mismas dimensiones 384...

Bueno, quizá no tantas... podríamos unir todas las conexiones de los ánodos (+) juntas o bien de todos los cátodos (-)... aún así aún tendríamos la mitad de problemas (más uno) que solucionar en conexiones.

Aquí es dónde se presenta el multiplexado. Vemos el ejemplo más simple, que sería un visualizador de 2 bytes (ver imágenes).

Tenemos simplemente una conexión para cada dígito y 8 para los diferentes segmentos. Podría conectar los diferentes segmentos para visualizar un dígito sin emplear multiplexado, pero si quisiera visualizar los 2 dígitos que permite el elemento, los segmentos se iluminarían al mismo tiempo y no podría efectivamente ver nada (quizá un 88, pero eso no nos sirve para nada).

Pero sí podíamos encender un dígito de cada vez sin problemas, pudiendo encender los segmentos que quisiéramos. Además, como hemos visto antes, el ojo humano no puede distinguir parpadeos muy rápidos de los diodos LED. ¡Ahí está la solución! El multiplexado simplemente ilumina un dígito cada vez, pero lo hace tan rápido que nosotros lo percibimos como si todos los dígitos se iluminasen al mismo tiempo. Y no solo eso, sino que cada uno con el número que nos plazca.

Exactamente lo mismo sucede con las matrices LED, realmente no todos los LED de una matriz se iluminan al mismo tiempo, sino que se hacen barridos progresivos por todos los LED, iluminándolos momentáneamente con el valor que le corresponde a cada uno. Y todo ello sucede cientos o miles de veces cada segundo.

Aquí podemos ver un vídeo con una ralentización del proceso, para que podamos ver realmente lo que sucede:

https://www.youtube.com/watch?v=6mTT3MK64GM

Step 2: Drivers

Como hemos visto el proceso de multiplexado no es excesivamente complejo, pero aún así exige una cantidad grande de conexiones y un control del tiempo muy preciso. Si controlamos directamente desde nuestro microcontrolador el visualizador o la matriz LED u otra gran cantidad de diodos LED vamos a quedarnos sin conexiones. Además de que no podremos hacer otras cosas con el microcontrolador, ya que detenerlo para hacer otro trabajo implicaría que el visualizador se dejaría de ver. ¿No queremos tener una pantalla apagándose y encendiéndose, verdad?

Es por eso que necesitamos un driver, que no es otra cosa que un circuito integrado diseñado específicamente para cumplir la función de control de este tipo de elementos. Existen muchos modelos, con características específicas para determinados elementos, nosotros vamos a emplear un integrado MAX7219 pero podríamos emplear cualquier otro siempre que nos ajustemos a sus especificaciones.

El integrado MAX7219 nos permite controlar una matriz LED de 8x8 o bien un visualizador de 7 segmentos y 8 dígitos. Desde luego esas son sus características máximas, también podríamos manejar con él visualizadores o matrices más pequeñas.

Además, este integrado puede ser encadenado, esto significa que podemos emplear en un mismo circuito más de un MAX7219 sin emplear más conexiones que las que precisa un único MAX7219. Nosotros nos limitaremos en este ejemplo máximo a emplear un único MAX7219.

Step 3: Materiales

Para este ejemplo básico de cómo usar el IC MAX7219 como driver, vamos a usar los siguientes materiales:

2x Breadboards (cuanto menos una de 832 puntos)

1x Maxim MAX7219

1x Fuente de alimentación de 5 voltios (además necesitarás un alimentador para la fuente)

1x Placa Arduino (cualquier modelo vale, en nuestro caso empleamos un Arduino Nano)

1x Matriz LED de 8x8

1x Visualizador de 7 segmentos (preferiblemente de 2 o más dígitos)

Empleamos 2 breadboard porque nuestra matriz LED es demasiado grande para conectarse en una sola, normalmente las breadboard son modulares y se pueden unir todas las que necesitemos mediante los enganches que se encuentran en los bordes.

Es recomendable emplear una fuente de alimentación separada de nuestra placa de desarrollo, aunque dependiendo de la cantidad de LEDs que se controlen, se podría alimentar mediante los +5V que proporciona el regulador integrado en la placa de desarrollo.

Step 4: Conexiones Del MAX7219

Para ayudarnos a comprender el funcionamiento específico del MAX7219 como driver haremos uso de su esquema de conexiones así como de el esquema funcional, ambos adjuntados como imágenes extraídas de la hoja de datos que proporciona el fabricante.

En primer lugar nos encontramos con la anotación de los 24 pines del chip en su empaquetado DIP. Cuando trabajemos en nuestra breadboard los pines 1 y 24 estarán en el lado izquierdo, y los 12 y 13 en el derecho.

El conjunto de los 24 pines podemos agruparlos según su función, de la manera que se puede observar en la segunda imagen, tal que:

- Conexiones de alimentación: 4, 9 (GND) y 19 (+5V)

Simplemente la fuente de voltaje necesaria para hacer funcionar el driver y el conjunto de LEDs

- Ajuste de corriente: 18

Se conecta a +5V mediante una resistencia que debemos calcular para ajustar el consumo de corriente del conjunto de LEDs. Para un ajuste exacto son necesarios diversos cálculos, nosotros simplemente emplearemos una resistencia de 10k, que nos proporciona un valor óptimo.

- Segmentos: 14,15,16,17,20,21,22 y 23

Estos se conectarán a las conexiones para los segmentos (o ánodos si se trata de una matriz).

- Dígitos: 2,3,5,6,7,8,10 y 11

Estos se conectarán a las conexiones para los dígitos (o cátodos si se trata de una matriz).

- Interfaz serie: 1,12 y 13

Esta es la conexión que se realizará al microcontrolador, como podemos ver sólo necesitaremos 3 conexiones.

- Salida de interfaz serie: 24

Este pin es la salida serie (DOUT), que en el caso de encadenar varios MAX7219 se conectaría al pin de entrada del siguiente (DIN).

Step 5: Montaje General

El esquema de conexiones no deja demasiado lugar a las dudas, únicamente precisamos 3 conexiones entre nuestro microcontrolador y el MAX7219 (color morado).

Luego, las conexiones desde el MAX7219 al visualizador dependerán del modelo específico de visualizador (¡debe ser del tipo cátodo común!) o matriz. Cada segmento del visualizador se identifica por una letra de la A a la G, además hay una conexión extra para el punto decimal (DP).

Por otra parte, cada dígito del visualizador tiene una conexión específica (D1, D2, D3...) que debemos conectar al MAX7219 de derecha a izquierda. Es decir, que el dígito primero, que conectaremos al DIG0 del MAX7219 será el que se encuentre el primero a la derecha, y así sucesivamente hacia la izquierda.

No existe una norma estandarizada de las conexiones para los visualizadores, por ello preferimos no ofrecer un esquema específicamente numerado para conectar el visualizador con el MAX7219. Deberás realizar las conexiones teniendo en cuenta las especificaciones de tu visualizador, conectando los segmentos a las conexiones específicas de los segmentos y los dígitos a las propias.

En el caso de las matrices LED, debemos seguir el mismo procedimiento, pero en lugar de conectar segmentos y dígitos, debemos conectar columnas y filas. Existen dos posibles tipos de matrices: columnas cátodos/filas ánodos o bien columnas ánodos/filas cátodos. En cualquiera de los casos se puede hacer uso del MAX7219, pero debemos asegurarnos de conectar los ánodos como segmentos y los cátodos como filas. Además, de hacer uso de un tipo u otro nos encontraremos con que la imagen representada en la matriz estará girada 90º al haber intercambiado filas y columnas.

En nuestro ejemplo nosotros hemos empleado un visualizador de dos cifras (no había otro a mano), además hemos añadido un elemento más que comentaremos al final de esta guía.

Step 6: Limitando El Consumo, Protegiendo El Sistema.

Al lado de la conexión de voltaje del MAX7219 se encuentra el pin ISET, con él controlaremos y limitaremos para proteger el conjunto el consumo que cada LED individual puede sustraer de nuestro chip.

Para hacer un cálculo exacto debemos conocer las especificaciones de nuestro visualizador, tanto la caída de voltaje de cada LED como el consumo máximo de los mismos. Teniendo esos dos valores podemos buscar el valor recomendado para la resistencia que debemos conectar entre el pin ISET y los +5V de la alimentación.

Para ello haremos uso de la tabla de valores que se encuentran en la hoja de datos del componente.

¡Aviso! No pretendas controlar el brillo del visualizador o la matriz cambiando arbitrariamente el valor de esta resistencia. El brillo debe ser controlado mediante software (mediante el microcontrolador y sus conexiones al MAX7219) no de esta manera. Esta resistencia es una medida de seguridad para no sobrepasar el consumo máximo que el MAX7219 puede soportar, así como el propio visualizador.

Debemos tener en cuenta que nunca se debe llegar al límite máximo especificado por el fabricante, sino que debemos dejar un margen de seguridad. Si lo máximo son 25 mA / LED, tomaremos el valor para los 20 mA y no los 30 mA.

Step 7: Programando En Arduino

Existe una librería específica que ha sido desarrollada para controlar de manera sencilla diferentes tipos de visualizadores/matrices haciendo uso del MAX7219, su nombre es LedControl y podemos encontrar en la red documentación al respecto.

Debemos descargar la librería por el método habitual e instalarla. Junto a ella se incluyen ya un par de ejemplos que podemos usar como punto de partida.

Si se sigue el cableado que proponemos (esta librería permite conectar el MAX7219 a cualquier salida digital, no necesita pines específicos, simplemente 3 libres), debemos ajustar las conexiones de la siguiente manera:

LedControl lc=LedControl(2,4,3,1);

Dejamos aquí un ejemplo simplificado, que actúa como contador de 0 a 99 empleando los 2 primeros dígitos de nuestro visualizador.

Podemos explotar muchas más de las características del MAX7219, pero ponerlo a funcionar de manera básica no implica mucho mayor esfuerzo y únicamente unas pocas líneas de código con las que podremos centrarnos en otros elementos de nuestro proyecto más allá de cómo presentar un número.

Step 8: Recomendaciones Para Mayor Estabilidad

Aunque no es estrictamente necesario, puede aportar mayor estabilidad y eliminar problemas aleatorios el añadir un par de componentes más a nuestra configuración del MAX7219. Recomendamos lo siguiente:

- Añadir un condensador en la alimentación del MAX7219 puede evitar que falle su inicialización, un problema con el que nos hemos encontrado al emplear una fuente de alimentación que no es lo más estable del mundo ante grandes demandas espontáneas al alimentar todo el montaje.

- Añadir resistencias pull-up o pull-down a las líneas entre el microcontrolador y el MAX7219, en nuestro caso hemos comprobado que emplear una simple resistencia (10K) en la conexión que va al DIN del MAX7219 evita que antes de empezar el microcontrolador a dirigir el MAX7219 el propio chip tome las interferencias del ambiente como información e ilumine segmentos de forma aleatoria.