Me decidi a dedicar toda esta hoja a este fabuloso multiplexor que te permite manejar hasta 8 display de 7 segmentos o una matriz de 8x8 enviando los datos en serie. Ni siquiera requieres resistencias imitadoras para cada segmento, basta una resistencia imitadora de seguridad y hasta puedes manejar el brillo digitalmente por software.
El MAX7219 es un controlador de display LED multiplexado de 8 dígitos y 7 segmentos o una matriz 8x8 de cátodo común (CC), con entrada y salida serie, que soporta una corriente de segmento de hasta 40 mA mientras opera desde un suministro de 5V (pin 19). Tiene 24 pines. Es fabricado por la china Maxim integrated
Incluye un decodificador BCD, multiplexos de máximo 10 MHz, controladores de corriente, y una RAM estática de 8x8. Es compatible con SPI, solo requiere de una resistencia externa (pin 18) para establecer corriente máxima de cada LED. Ademas incluye un modo de apagado de baja potencia (150 μA), control de brillo analógico y digital, un registro de límite de escaneo que permite al usuario visualizar de 1 a 8 dígitos y un modo de prueba que fuerza a todos los LED. Como si fuera poco se pueden poner en cascada hasta 8 MAX7219 gracias a la salida DOUT (pin 25)
Función | Pin MAX | Descripción | Pin Arduino |
---|---|---|---|
LOAD o CS | 12 | Selección de dígito | 10 |
CLK | 13 | Reloj | 11 |
DIN | 1 | Entrada de datos | 12 |
DOUT | 25 | Salida |
Evite usar los pines 0, 1 y 13 de Arduino.
Para poner en cascada hasta ocho (8) MAX7219 se hacen comunes CLK (13) y LOAD (12). La data para el primer MAX7219 se mete en DIN (1) y para el siguiente se extrae de DOUT (25).
Notese que al estar diseñado para cátodo común (CC) las salidas de cada dígito (que van al cátodo) son reformazadas (320 mA) mientras que los segmentos (que van al ánodo) son las imitadoras de corriente (max 40 mA) determinadas por Rset. Ademas gracias a la multiplexion solo un dígito esta prendido a la vez.
Estas son las métodos disponibles en la librería LedControl.h
Método | Descripción | Ejemplo |
---|---|---|
lc.shutDown() | TRUE apaga, FALSE para operación normal. | lc.shutDown(0,false) |
lc.setIntensity() | Determina el brillo (0 a 15) | lc.setIntensity(0,8) |
lc.setScanLimit() | Numero de dígitos a usar 0~7 | lc.setScanLimit(0,5) |
lc.clearDisplay() | lc.clearDisplay(0) | |
lc.setDigit() | Muestra un dígito exadecimal. addr,digit,value,dp | lc.setDigit(0,0,num,false) |
lc.setChar() | '0','1','2','3','4','5','6','7','8','9','0','A','b','c','d','E','F','H','L','P','.','-','_',' ' | lc.setChar(0,0,'A',false) |
lc.setLed() | addr,row,col,state (true=on) | lc.setLed(0,0,0,true) |
lc.setRow() | Addr,row,value | lc.setRow(0,0,1) |
lc.setColumn() | Addr,col,value | lc.setColumn(0,0,1) |
#include <LedControl.h>; LedControl lc = LedControl(12,11,10,1); //El 1 al final indica cuantos MAX en cascada hay. Máximo 8. void setup(){ //Despierta display lc.shutdown(0,false); //Pone brillo en medio lc.setIntensity(0,8); //Limita a solo 4 digitos lc.setScanLimit(0,3); //Limpia display lc.clearDisplay(0); } void loop{ //Cuenta regresiva for(byte n=9, n>0, n--) { //Muestra display lc.setDigit(0, n, false); delay(1000); i--; } lc.setChar(0,0,'H',false); lc.setChar(0,1,'E',false); lc.setChar(0,2,'L',false); lc.setChar(0,3,'P',false); delay(1000); //Apaga display lc.shutDown(0, true); lc.clearDisplay(0); delay(3000); //Prende display lc.shutDown(0, false); }
Hay tres factores que determinan el brillo del display.
El control digital
Es importante entender que Rset es el control de brillo analógico y el método setIntensity() el el control de brillo digital, mediante modulación de ancho de pulso (Duty Cycle) entre 1/32 y 31/32. Para eso debemos ver en las especificaciones de nuestro LED la corriente máxima y la tensión directa. Por ejemplo si mi LED tiene una Imax de 25 mA y una tensión directa de trabajo de 2V elegiré Rset = 28kΩ, como no es comercial le pondré 33kΩ.
Corriente | 1V5 | 2V | 2V5 | 3V | 3V5 |
---|---|---|---|---|---|
40 mA | 12K2 | 11K8 | 11K | 10K6 | 9K69 |
30 mA | 17K8 | 17K1 | 15K8 | 15K | 14K |
20 mA | 29K8 | 28K | 25K9 | 24K5 | 22K6 |
10 mA | 66K7 | 63K7 | 59K3 | 55K4 | 51K2 |
Rset puede ser variable (lo que permite un control de brillo analógico) pero su valor minimo absoluto es 9K53
Los display grandes usan tres o más LED en serie por segmento y no pueden ser impulsados directamente por el MAX7219 desde una fuente de 5V debido a las múltiples caídas de voltaje de los LED. Pero aun así se puede usar el MAX7219, basta usar unos transistores externos y usar un display de ánodo común (CA) para contrarrestar la inversión que introducen los transistores.
Existen dos situaciones en que se requiere estos transistores externos: para display que puedan ser alimentados con 5V pero que requieren corrientes de segmento de más de 40 mA y para display grandes que requieres tensiones de alimentación de 9V o mas.
Los controladores que se muestran en las Figuras 1 a 4 conectan un MAX7219 que funciona con 5V a pantallas de ánodo común (CA) que operan a una tensión mayor de corriente y/o de accionamiento que el MAX7219 puede entregar. Se requieren ocho instancias del controlador de segmento (conectado al cátodo) de baja corriente y ocho instancias del controlador de dígito (conectado al ánodo) de alta corriente.
El control de intensidad digital PWM del MAX7219 aun funciona. Sin embargo, la corriente de segmento máxima ahora está configurada por resistencias de limitación de corriente externas (R1) en serie con los cátodos de LED en lugar de mediante la resistencia Rset. Elija R1 (Figura 4) para configurar la corriente de de LED deseado actual Iseg de acuerdo con el controlador de tensión de alimentación V del controlador y LED LED de caída de tensión V_LED:
R1 = (Vcc - Vled - Vce_Q1 - Vsd_Q2)/Ipeak
Tenga en cuenta que los display debe ser del tipo de ánodo común (CA) para interconectar los controladores descritos aquí; el MAX7219 esta diseñado manejar directamente el cátodo común (CC), pero estos controladores externos invierten la polaridad del dígito y segmento.
Las salidas de dígitos del MAX7219 son interruptores de potencia que se activan de a uno a la vez para activar un dígito y alta impedancia cuando están apagados.
Aquí se sugieren tres circuitos de accionamiento de displays alternativos.
El circuito más simple (Figura 1) se adapta a una aplicación en la que se desea una corriente de segmento superior a 40 mA pero una tensión de alimentación de 5V. Las salidas de digito del MAX7219 activan directamente el nivel lógico FET Q2 cuando esta en LOW. La resistencia R3 (1K) apaga el Q2 cuando la salida del dígito esta en HIGH. La tension Vdriver es la misma que la de MAX7219, osea 5V.
El circuito de la Figura 2 incluye una transito de cambios de nivel para permitir que se use un voltaje en los LED (Vdriver) mayor que 5V. Q3 (NPN) funciona como un interruptor de corriente de base común, y suministra una corriente de colector establecida por la resistencia R2 (220Ω) (alrededor de 5 mA con Vcc = 5V) cuando la salida de dígitos es LOW. Esta corriente a su vez desarrolla alrededor de 5V a través de R3 (1kΩ) para proporcionar un control de compuerta consistente al nivel lógico FET (Q2), independientemente de las fluctuaciones en Vdrive. Tenga en cuenta, sin embargo, que el colector de Q3 no puede ser inferior a Vce (sat) Q3 por encima de su emisor, que está en Vbe por debajo de Vcascode.
Como en R3 (1K) está cayendo 5V, esto coloca el límite inferior para el Vdriver en alrededor de 10V si Vcascode es 5V.
El circuito de la Figura 3, permite poner por ejemplo Vcascode en 2V, simplemente limitando los 5V a través de un diodo Zener. Solo se necesita un diodo zener para servir a todos los controladores de dígitos. Tenga en cuanta que Vdriver debe ser al menos 7V.
Las salidas para segmentos del MAX7219 son fuentes de corriente, que controlan una corriente constante establecida por la resistencia Rset conectada al pin 18 del MAX7219. La corriente máxima por segmento es 40mA. Para impulsar una corriente de segmento más alta, se necesitan transistores (Q1) y resistencias (R1) limitadoras de corriente externas por cada segmento (Figura 4).
Al configurar la fuente de corriente del variador de segmentos de MAX7219 correctamente, no se requiere una resistencia de limitación de corriente de base para Q1. La corriente del variador de segmentos (Iset) se debe configurar como un valor apropiado usando Rset para encender el Q1. La resistencia R4 (1K5) es necesaria para garantizar que Q1 se apague de forma razonablemente rápida al final del ciclo múltiplexor de cada dígito. Para Rset un valor de alrededor de 150 kΩ (min 47 kΩ) es un buen punto de partida.
Fuente: https://www.maximintegrated.com/en/app-notes/index.mvp/id/1196