Circuito Integrado Max7219

€1,87

CONTROLADOR DE LED DE 8 DÍGITOS CC, 7219
 
Dígitos controlables: 8 (o 64 LED individuales)
Tipo de interfaz: Cátodo común
Interfaz: Serial 4 Wire
Tensión de alimentación: 4V - 5,5V
Pines:24
Temperatura de funcionamiento: -0 °C a +70 °C
Encapsulado:DIP
Modelo:MAX7219CNG
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf
 

El MAX7219 y el MAX7221 son drivers para controlar un display de LED de 8 dígitos de 7 segmentos con punto decimal. Comunican con el MCU por medio de un bus SPI en el caso del MAX7221 y un bus serie genérico, aunque muy compatible a nivel hardware y software, por lo que, para la finalidad de este texto, puede equiparase al mismo.

MAX7219 MAX7221 Controlador SPI display LED 7 segmentos 8 dígitos y matriz LED

Ofrecen varias ventajas frente a gestionar directamente desde el microcontrolador el uso de una pantalla de módulos LED de 7 segmentos

  • Al separar del µC el trabajo de redibujar el display LEDpueden utilizarse con microcontroladorespequeños sin problemas de rendimiento como parpadeo o redibujado desigual.
  • Como el bus serie que utilizan es suficientemente rápido (el MAX7219 y el MAX7221 funcionan a 10 MHz), el valor mostrado en el display LED puede refrescarse a buena frecuencia, sin esfuerzo para el MCU, e incluso mostrar fácilmente movimiento.
  • Ya que trabajan con comunicaciones serie, solamente se necesitan 3 hilos (no se usa el pin MISO, ya que no devuelve información) más la alimentación, y no 16, para manejar 8 dígitos de 7 segmentos (más el punto decimal) por lo que ahorra patillas GPIO del microcontroladores.
  • Al estar diseñados para gestionar pantallas numéricas, son capaces de interpretar la información BCD, pero también pueden utilizarse de forma genérica para manejar cada segmento por separado. Esto abre la posibilidad de usar distribuciones LED alternativas, que no representen números, por ejemplo, barras de progreso (como las de carga de batería) o matrices hasta de 8×8 LED.
  • El MAX7219 y el MAX7221 están concebidos de forma que se pueden encadenar varios dispositivos al estilo daisy chain conectando el pin DIN de los MAX7219 y MAX7221 con el pin DOUT del anterior (que en el primero de la cadena no es necesario conectar y puede quedar al aire). Cuando se forma una cadena de drivers es necesario, por tanto, utilizar un cuarto hilo en el bus de comunicaciones.

Como el MAX7219 y el MAX7221 son equiparables en funcionamiento y el MAX7219 está más presente en la mayoría de los dispositivos y sobre todo en los módulos para pruebas, en el resto del texto se hace referencia a ambos usando solamente el nombre del primero, MAX7219. La única diferencia hardware reseñable es que el pin 12 es (nominalmente) CS en el MAX7221 y LOAD en el MAX7219 con una función similar. De la misma forma, se usa para ambos el mismo nombre ya que es el que habitualmente se encuentra rotulado en las conexiones serie.

MAX7219 LED 7 segmentos 8 dígitos display pinout patillas controlador

Con lo dicho hasta ahora ya se puede suponer que la configuración hardware es muy sencilla. En primer lugar, se alimenta a 5 V (funciona entre 4 V y 5,5 V), por lo que es compatible con la mayoría de los microcontroladores de las series pequeñas, como Arduino Uno.

Para establecer el nivel de iluminación de los LED, se dispone una resistencia (RSET) que determina la corriente que llega a la conexión ISET. La corriente que llega a los segmentos LED es 100 veces mayor que la que se establezca en ISET con RSET. El valor de esta resistencia puede ser variable (lo que permite disponer un potenciómetro en el montaje). Debe de ser de 10 Ω como mínimo.

MAX7219 LED 7 segmentos 8 dígitos matriz circuito aplicación

Al diagrama de arriba se suele añadir un diodo Zener (típicamente un 1N5524B) para bajar el nivel de tensión en el LED del punto decimal. El MAX7219 es muy estable frente a interferencias, en cualquier caso, cuando las circunstancias de alimentación lo requieran, se pueden añadir los clásicos condensadores de filtro de 10 µF y 100 nF a la alimentación.

En el anterior esquema se incluye el encadenamiento entre dos MAX7219 usando DOUT (anterior en la cadena) y DIN (siguiente en la cadena) y la activación desde el microcontrolador, pero además, como es lógico, hay que conectar todos los MAX7219 de la cadena al bus SPI, también con CS (LOAD) y la señal de reloj, que en la hoja de datos del MAX7219 aparece como CLK )pero que muchas veces se llama SCK o SCLK en la nomenclatura del bus SPI).

Como existe una gran variedad de display de LED de 7 segmentos o de matrices LEDtambién es posible que sea necesario añadir una batería de transistores a modo de driver para controlar determinado hardware que funcione a un voltaje o a un amperaje mayor que el entregado por el MAX7219. En tales casos, la función del MAX7219 sería activar (saturar) esos transistores que alimentarían los LED.

Display LED de 7 segmentos y matriz para MAX7219

Para poder realizar pruebas existen multitud de módulos que usan el MAX7219 y que incluyen algún tipo de display de LED de 7 segmentos o de matriz LED, normalmente preparados para enlazarse entre ellos. Aunque a nivel lógico no exista límite al encadenar drivers, sí que se presenta a nivel de hardware, especialmente cuando se usan cables y en función, principalmente, de su longitud.

Módulo para Arduino con driver MAX7219 y display LED 7 segmentos 8 dígitos

Módulo MAX7219 para Arduino con display LED 7 segmentos 8 dígitos

Utilizar el MAX7219 y el MAX7221 desde Arduino

Para explotar el MAX7219 o el MAX7221 desde un programa para Arduino se utiliza la librería SPI. En primer lugar es necesario inicializarla con SPI.begin(); y establecer con digitalWrite() un nivel bajo en la patilla CS (LOAD) a cada acceso al driver.

La forma de enviar un valor a un registro del MAX7219 o del MAX7221 es usando SPI.transfer(). En primer lugar se envía el código del registro al que se accede y en segundo lugar el valor que se transfiere. Como ejemplo, la siguiente podría ser una función que transfiriera un valor a un registro de un MAX7219.

 

 

Lógicamente, necesita que se defina PIN_CS, con algo como #define PIN_CS 10 y se establezca previamente como pin de salida con pinMode(PIN_CS,OUTPUT);.

Antes de enviar los valores de los dígitos que se mostrarán en el MAX7219 suele configurarse. Alguno de los registros (direcciones) de las opciones de configuración más relevantes son:

  • 0x0F Cuando el valor del registro es 1 se habilita un modo de prueba con el que verificar el funcionamiento del MAX7219.
  • 0x0C Activar o desactivar. La razón de desactivar el MAX7219 es utilizar el modo de bajo consumo así como apagar el display de LED de 7 segmentos. El valor 1 activa el driver y el 0 lo desactiva.
  • 0x0B Número máximo de dígitos representados por el MAX7219 en el display. Se expresa como un límite, es decir, el valor que se almacena en el registro es el número de dígitos mostrados menos uno.
  • 0x0A Brillo de la pantalla (el máximo es el establecido con RSET en el pin ISET). Puede ser un valor entre 0, el brillo menor, y 15, el brillo mayor.
  • 0x09 Interpretar los valores mostrados en el display LED de 7 segmentos como decimal codificado en binario (BCD) (almacenando 0xFF en el registro) o con códigos para cada segmento. Usando el segundo método se puede explotar el MAX7219 con todo tipo de matrices LED, no solo en pantallas con módulos LED de 7 segmentos. Además de no codificar en absoluto en BCD almacenando cero en el registro, existen dos modos intermedios que consisten en poner a cero los bits que corresponden con el dígito que se gestiona de forma genérica.
    En el siguiente esquema de un módulo LED se muestra el código binario de cada segmento. Con una operación OR entre ellos se obtiene el valor que se envía al MAX7219 para el dígito correspondiente.

Segmentos del display LED controlados por el MAX7219

Los registros 0x01 a 0x08 sirven para hacer referencia a los dígitos de relevancia correspondiente. No empieza a contar en el cero porque el registro 0x00 es el que se utiliza para encadenar drivers MAX7219.

Con lo que ya se ha explicado sería posible elaborar una nueva función que, usando la anterior, represente un valor display LED de 7 segmentos. El código supone que no hay un segmento especial para el signo menos y se usa el segmento central del primer dígito de la cifra. Cuando se usa un segmento especial suele ser el que, de otra forma, correspondería al punto decimal del último dígito del display LED

 

 

Como puede verse en la línea resaltada del ejemplo (y en las líneas 8, 24, 29 y 33), para mostrar un valor en un dígito se envía (se almacena) en el registro que corresponde al dígito, de 1 a 8, el valor, en este caso expresado en BCD.

En el código de la función anterior se utilizan las constantes SIGNO_MENOS y BORRAR_SEGMENTOS que corresponden con los códigos que se usan para representar el guión (el signo menos) y el módulo LED con todos los segmentos apagados al enviarlos a un dígito.

 

 

Utilizando el modo BCD del MAX7219 aún se pueden representar 4 valores más, que se pueden incluir a las definiciones del código anterior:

 

 

Usando la misma codificación que para los dígitos en BCD, estos 4 últimos signos permiten escribir algunos mensajes. En el siguiente código de ejemplo se muestra cómo escribir HELP en mitad del display.

 

 

Si en lugar de una posición fija, como en el ejemplo anterior, se utiliza un dígito de inicio, y en lugar de representar cada carácter se muestra el que corresponda de un vector que contiene la palabra, es muy sencillo hacer una versión animada del código de arriba.

 

 

letrero HELP movimiento MAX7219 MAX7221 SPI serie

Con 7 segmentos no es posible representar muchos signos, la razón por la cual el MAX7219 es capaz de usar de forma arbitraria cada segmento es para usar matrices LED con la disposición correspondiente. En cualquier caso, y a falta de explicar un uso más genérico en otro artículo, para activar cada segmento es necesario:

  • Desactivar el modo BCD en los dígitos en los que se va a mostrar una disposición arbitraria
  • Componer el signo que se quiere representar estableciendo a nivel alto (uno) el bit del segmento que se enciende y a nivel bajo (cero) el bit del segmento que se apaga.
  • Enviar el código que se ha compuesto al registro que corresponde a la posición del dígito en el que se representa

Por ejemplo, para escribir la palabra «Error» habría que definir los valores de los signos E, r y o, para luego enviarlos a las posiciones correspondientes entre la 1 y la 5.

Para definir la letra E se encenderían los segmentos A, D, E, F y G lo que corresponde, según la tabla que se incluía más arriba al valor 0b01001111. La letra o se dibujaría encendiendo los segmentos C, D, E y G con el valor 0b00011101. Por último, la letra r se compone con los segmentos E y G que corresponden al valor 0b00000101. Como es lógico, para apagar todos los segmentos de un dígito se establece a nivel bajo todos los bits, es decir, se envía un cero al registro que almacena su posición.

En el siguiente ejemplo se usa la información anterior para escribir la palabra «Error» en la parte derecha (dígitos uno a cinco) del display LED

 

 

Dígitos LED arbitrarios texto Error MAX7219 MAX7221 SPI serie

Para usar el driver MAX7219 con un display de LED de 7 segmentos en el que activar segmentos de manera arbitraría no merece la pena implementar más funcionalidades pero para presentar valores numéricos sí puede ser interesante implementar la presentación de valores con decimales.

Inicialmente puede parecer interesante crear una nueva función para números decimales o modificar la que se ha descrito antes para que los acepte. En realidad lo único relevante es implementar la activación del punto decimal ya que, al ser un número de dígitos fijo (y no muy alto), la gestión que hace el programa debe controlar los valores que se representarán.

La solución por la que he optado consiste en pasar como argumento a la función la posición del punto decimal (coma). Desde el programa que hace la llamada se multiplica el número decimal (float) por el número de posiciones de la coma y se pasa como un entero a la función.

Con los cambios anteriores, una función que mostrara el punto decimal en el dígito de una posición determinada sería como el código de abajo. Es interesante resaltar que, en la mayoría de los módulos de 7 segmentos, el decimal está a la derecha, por lo que debe activarse en el dígito siguiente a la posición que se desea, a la izquierda de los valores menores que uno.

 

 

 

Librería para controlar el MAX7219 y el MAX7221 desde Arduino

El siguiente es el código de una pequeña librería para controlar con el MAX7219 o el MAX7221 un display LED de 8 dígitos de 7 segmentos desarrollada utilizando la información que se ha explicado hasta ahora. Se ha añadido la presentación del texto «Error» como ejemplo de activación de LED arbitrarios además de la presentación de una cifra con signo y punto decimal arbitrarios.