El MAX7219 es un integrado pensado para manejar matrices LED y displays de 7 segmentos, y Open Electronics publicó una guía para usarlo con Arduino. Explica el cableado, las librerías y cuatro sketches para armar displays gráficos y numéricos propios.
Una matriz de LED es uno de los componentes que más llaman la atención a quien empieza con Arduino. Con un módulo cuadrado pequeño se muestran números, letras, símbolos y animaciones. El problema es que una matriz de 8x8 son 64 LED que hay que controlar de forma individual, algo casi imposible sin un circuito de apoyo. Ahí entra el MAX7219, que reduce la conexión con la placa Arduino a unos pocos pines. La guía muestra cómo conectarlo a una matriz de 8x8, cómo usar los módulos armados que se venden en el mercado y cómo programar todo con la librería LedControl.
El MAX7219
El chip tiene 24 pines. La matriz de 8x8 (Fig. 1) se conecta de manera que las filas van a los pines DIG y las columnas a los pines SEG del MAX7219.
El brillo se ajusta por software, después de fijar la corriente máxima con una resistencia externa conectada al pin Iset. Tres pines se dedican a la comunicación con la placa de control. DIN transfiere los datos desde la placa al chip, CS selecciona el dispositivo y CLK entrega el reloj de datos. Un pin más, DOUT, se conecta al DIN del chip siguiente cuando se quieren encadenar varias matrices, por ejemplo para armar un texto que se desplaza.
El esquema completo de la conexión entre el chip y el display está en la Fig. 2, con énfasis en los enlaces hacia la placa Arduino y hacia un segundo chip. Usar el MAX7219 se simplifica todavía más con los módulos que vende el mercado (como los de la Fig. 3), que integran el chip, la matriz de LED y el cableado entre ambos.
Con un módulo, el cableado se reduce a las conexiones entre el módulo y la placa Arduino, y entre los módulos si van en cadena. Cada módulo tiene 5 pines de entrada (VCC, GND, DIN, CS/LOAD y CLK), que se conectan a una placa como el Arduino UNO R3, y 5 pines de salida (VCC, GND, DOUT, CS y CLK) para los módulos siguientes de la cadena.
El Arduino UNO R3 se puede reemplazar por las versiones más recientes del UNO R4, en sus modelos Minima y WiFi. Las dos son compatibles con el R3 en lo eléctrico y en el software, mantienen la misma distribución de pines y funcionan con la mayoría de los shields y librerías escritos para el R3.
¿Cómo se programa con Arduino?
Hay varias librerías que facilitan la programación del MAX7219. La más difundida y simple de usar es LedControl. Estos son sus comandos básicos.
#include "LedControl.h"
LedControl lc = LedControl(DIN, CLK, CS, numero_de_modulos);Se crea un objeto de la clase LedControl con un nombre que lo identifica, en este caso lc. Los parámetros DIN, CLK y CS se reemplazan por los números de los pines del Arduino donde van conectadas esas señales, por ejemplo 2, 4 y 3.
lc.shutdown(numero_de_modulo, 0/1);Activa o desactiva el chip. El valor 0 lo deja operativo y el 1 lo pone en reposo. Al encenderse, el chip queda en reposo por defecto. El parámetro numero_de_modulo identifica al módulo dentro de una cadena, numerados desde 0.
lc.setIntensity(numero_de_modulo, intensidad);Ajusta el brillo de los LED con un valor entre 0 (mínimo) y 15 (máximo). El valor 0 no apaga los LED por completo. Para eso hay que usar lc.shutdown(numero_de_modulo, 1).
lc.clearDisplay(numero_de_modulo);Apaga todos los LED del módulo indicado y borra lo que esté mostrando.
lc.setLed(numero_de_modulo, fila, columna, estado);Enciende o apaga un solo LED. fila y columna indican la posición del LED, numeradas de 0 a 7, y estado en true (o 1) lo enciende y en false (o 0) lo apaga. Las filas se numeran desde 0 (arriba) hasta 7 (abajo) y las columnas desde 0 (izquierda) hasta 7 (derecha). El LED de la esquina superior izquierda ocupa la posición (0, 0) y el de la esquina inferior derecha, la (7, 7).
lc.setRow(numero_de_modulo, fila, byte);Enciende o apaga todos los LED de una fila, con su estado definido en un byte binario. Para encender los primeros cuatro LED de una fila se usa B11110000.
lc.setColumn(numero_de_modulo, columna, byte);Funciona igual que setRow, pero sobre una columna. El byte define qué LED de esa columna se encienden o se apagan.
Ejemplo 1
El primer sketch (Listado 1) muestra en secuencia las 8 filas, una a la vez, empezando desde arriba. Después recorre las 8 columnas desde la izquierda, las 8 filas desde abajo y las 8 columnas desde la derecha. Al final enciende todos los LED de a pares de filas, desde las dos del centro hacia afuera, en el orden 4-5, 3-6, 2-7 y 1-8. Esta última fase va a baja intensidad, con un brillo que baja de forma progresiva desde 10 hasta 2.
Ejemplo 2
Este sketch (Listado 2) enciende de forma gradual los LED de las filas de la matriz, desde abajo hacia arriba, según un voltaje de 0 a 5 V que se fija con un potenciómetro conectado al pin A5. Los comentarios dentro del código explican cómo funciona el encendido gradual.
Usar arreglos
Lo mismo que hacen los dos ejemplos anteriores se puede lograr con arreglos. Una opción es definir la estructura de las filas en un arreglo de bytes, escritos por ejemplo en binario. Con 8 elementos de 8 bits se describe el estado de todos los LED del display. La primera celda del arreglo corresponde al estado de los ocho LED de la fila 0 (de izquierda a derecha), la segunda a los de la fila 1, y así hasta la fila 7.
Si se quiere apagar todos los LED de las primeras cuatro filas y encender los de las últimas cuatro, se puede usar este arreglo.
byte array[8] = {B00000000, B00000000, B00000000, B00000000,
B11111111, B11111111, B11111111, B11111111};Para mostrarlo en la matriz se usa este código.
for (row = 0; row < 8; row++) {
lc.setRow(0, row, array[row]);
}
delay(3000);Hay un editor que entrega más rápido los códigos binarios de los símbolos más usados, disponible en xantorohara.github.io/led-matrix-editor](https://xantorohara.github.io/led-matrix-editor).
Ejemplo 3
Este sketch (Listado 3) muestra en secuencia todos los números del 0 al 9, con 10 arreglos que definen cada número y 10 ciclos for que los llaman.
Ejemplo 4
Este sketch (Listado 4) avisa cuando se superan ciertos umbrales de temperatura y humedad fijados en el programa, como muestra la Fig. 4. La mitad izquierda del display (columnas 0, 1 y 2) muestra la temperatura y la mitad derecha (columnas 5, 6 y 7), la humedad. En la parte superior (filas 0, 1 y 2) aparecen las letras T y U. En la parte inferior (filas 4 a 7), los LED encendidos indican que se alcanzó un umbral de temperatura o de humedad.
El código define cuatro umbrales. A medida que sube el valor se encienden las filas correspondientes, empezando por la fila 7. La temperatura y la humedad se miden con el sensor HTS221, integrado en la placa de expansión IKS01A3 de STMicroelectronics (Fig. 5), montada sobre el Arduino UNO. Quien no tenga esa placa puede usar otros sensores, como el DHT11 o el DHT22, y adaptar la parte del software que lee los datos.
Lo que se puede armar después
Con los comandos básicos dominados, el MAX7219 sirve para textos que se desplazan, animaciones pequeñas, indicadores gráficos, juegos de luces simples y visualización de datos en tiempo real. Los sketches de la guía se pueden adaptar a cualquiera de esos usos.












