Tipicamente, unidades de matriz de pontos vêm no formato de uma Matriz de LEDs 8X8 ou 5X7. Os LEDs são conectados à matriz de forma que o ânodo ou o cátodo de cada LED seja comum em cada linha. Em outras palavras, em uma unidade de matriz de pontos LED habitual, cada linha de LEDs terá todos os seus ânodos conectados. Os cátodos de cada coluna também estarão todos conectados.
Conexão da Matriz de LEDs
Para minimizar o número de pinos, foi necessário conectar todas as linhas e colunas. Caso não fosse assim, uma única unidade de Matriz de LEDs 8X8 necessitaria de 65 pinos, um para cada LED e um conector de ânodo ou cátodo comum.
Assim sendo, ligando a fiação das linhas e colunas, apenas 16 pinos são necessários. Entretanto, isso representa um problema se você deseja que um LED específico acenda em certa posição. Se, por exemplo, você tivesse uma unidade de ânodo comum e quisesse acender o LED na posição X, Y, de valores 6, 4 (sexta coluna, quarta linha), você aplicaria uma corrente à quarta linha e o terra ao pino da sexta coluna. O LED na sexta coluna e na quarta linha acenderiam.
Problemas
Agora, imagine que você deseja acender também o LED na coluna 4, linha 6. Então, você aplicaria uma corrente à sexta linha e o terra ao pino da quarta coluna. O LED correspondente agora seria iluminado, porém, também, os LEDs da coluna 4, linha 4 e coluna 6, linha 6 também acenderiam.
A solução para esse problema é a utilização da técnica da multiplexação (multiplexing, ou muxing).
Multiplexação
A multiplexação é a técnica de acender uma linha do display de cada vez. Selecionando a coluna que contém a linha, que, por sua vez, contém o LED que você deseja acender, e ligando a alimentação para essa linha (ou da forma oposta, para displays comuns de cátodo), os LEDs escolhidos nessa linha serão iluminados. Essa linha será, então, apagada, e a próxima acesa, novamente com as colunas apropriadas escolhidas, e fazendo com que os LEDs da segunda linha agora sejam iluminados. Repita esse processo para cada linha até que você atinja a base e, então, reinicie do topo.
Efeito visual
Se isso for feito a uma velocidade suficiente (mais de 100 Hz, ou cem vezes por segundo), o fenômeno de persistência da visão (em que uma pós-imagem permanece na retina por, aproximadamente, 1/25 de um segundo) fará com que o display pareça acender por inteiro, mesmo que cada linha acenda e apague em sequência.
Utilizando essa técnica, você soluciona o problema da exibição de LEDs individuais, sem que outros LEDs na mesma coluna também acendam.
MAX7219
O MAX7219 que permite o acionamento de displays de LEDs. Com ele é possível acionar até 8 displays de 7 segmentos ou uma matriz de LEDs de 8X8. A entrada de dados é feita de forma serial, reduzindo a quantidade de pinos do microcontrolador. São utilizados apenas 3 pinos para interface com o microcontrolador, DIN, CLK e CS. O pino DIN é utilizado para inserir os bits (16 bits), que é sincronizado pelo pino CLK, o clock de sincronismo definido pelo microcontrolador. O pino CS é utilizado para transferir os 16 bits inseridos para o display.
Montagem
A ligação do Módulo MAX 7219 é bem simples. Então, faça conforme mostrado na figura abaixo:
Feito isso, insira as bibliotecas e, então, carregue o código:
1 /* Este programa permite exibicao de uma mensagem na Matriz de LEDs com entrada da velocidade, intensidade de brilho e
2 do texto pelo Monitor Serial. Possibilita, tambem, a selecao da quantidade de Matrizes em serie de acordo com o projeto do usuario.*/
3
4 #include <MaxMatrix.h>
5 #include <avr/pgmspace.h>
6
7 //Cria um array ao qual representa os caracteres na matriz
8 const unsigned char CH [] PROGMEM = {
9 3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // espaco
10 1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
11 3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
12 5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
13 4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
14 5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
15 5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
16 1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
17 3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
18 3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
19 5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
20 5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
21 2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
22 4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
23 2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
24 4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
25 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
26 3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
27 4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
28 4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
29 4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
30 4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
31 4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
32 4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
33 4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
34 4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
35 2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
36 2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
37 3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
38 3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
39 3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
40 4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
41 5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
42 4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
43 4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
44 4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
45 4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
46 4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
47 4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
48 4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
49 4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
50 3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
51 4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
52 4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
53 4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
54 5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
55 5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
56 4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
57 4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
58 4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
59 4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
60 4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
61 5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
62 4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
63 5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
64 5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
65 5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
66 5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
67 4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
68 2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
69 4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ bara invertida
70 2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
71 3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // ^
72 4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
73 2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
74 4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
75 4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
76 4, 8, B00111000, B01000100, B01000100, B00000000, B00000000, // c
77 4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
78 4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
79 3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
80 4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
81 4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
82 3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
83 4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
84 4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
85 3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
86 5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
87 4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
88 4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
89 4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
90 4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
91 4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
92 4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
93 3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
94 4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
95 5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
96 5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
97 5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
98 4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
99 3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
100 3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
101 1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
102 3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
103 4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
104 };
105
106 # define data 2 // Pino do DIN do Modulo MAX7219
107 # define load 3 // Pino do CS do Modulo MAX7219
108 # define clock 4 // Pino do CLK do Modulo MAX7219
109
110 int maxInUse = 1; /* Numero de Matrizes de LEDs. Aqui o usuario pode definir o
111 numero de Matrizes de LEDs desejado em seu painel. */
112
113 MaxMatrix m(data, load, clock, maxInUse); // Inicia a Instancia do Modulo
114
115 byte buffer[500];
116
117 // Frase a ser Impresa
118 char string1[64] = " Inicio ";
119 char inChar; // Onde o caractere vai ser armazenado
120 byte index = 0; // Indice interno da matrixIndex onde vai ser armazenado na matriz
121 int veloc = 50; // Setado nesse valor para mensagem de inicio
122 int br = 0; // Brilho de inicio
123
124 void setup()
125 {
126 m.init(); // Inicia o modulo
127 m.setIntensity(br); // Ajuste de brilho da matrix que varia de 0-15
128 while (!Serial); //Aguardando a porta serial se conectar
129 Serial.begin(9600); //Inicia a Serial
130 Serial.println("Entre com a mensagem e Velocidade (Entre 50 - 200), Intensidade(0-15) e a Mensagem , respectivamente e separando com um espaco: ");
131 }
132
133 void loop()
134 {
135 index = 0;
136 if (Serial.available() > 0) // Não leia a nao ser que existam dados
137 {
138 // Leitura da velocidade e brilho
139 Serial.println(" ");
140 veloc = Serial.parseInt(); // Retorna o primeiro numero de ponto inteiro valido do buffer de serie
141 br = Serial.parseInt();
142 Serial.print(veloc);
143 Serial.print(" --> de velocidade | ");
144 Serial.print(br);
145 Serial.print(" --> de brilho | ");
146 Serial.print(" Mensagem = ");
147 }
148
149 if (veloc > 0)
150 {
151 while (Serial.available() > 0) // Nao leia a nao ser que existam dados
152 {
153 if (index < 63) // Um menos do que o tamanho da matriz
154 {
155 inChar = Serial.read(); // Ler um caractere
156 Serial.write(inChar);
157 string1[index] = inChar; // Armazenar
158 index++; // soma mais um
159 string1[index] = '\0'; // Terminar nulo a sequencia de caracteres
160 }
161 }
162 }
163
164 Serial.print(inChar);
165
166 m.setIntensity(br); // Ajuste de brilho da matrix que varia de 0 a 15
167 printStringWithShift(string1, veloc);
168 }
169
170 void printCharWithShift(char c, int shift_speed) // Metodo que identifica o caracter passado e imprime o correspondente do array acima chamado "CH"
171 {
172 if (c < 32)
173 return;
174 c -= 32;
175 memcpy_P(buffer, CH + 7 * c, 7);
176 m.writeSprite(32, 0, buffer);
177 m.setColumn(32 + buffer[0], 0);
178
179 for (int i = 0; i < buffer[0] + 1; i++)
180 {
181 delay(shift_speed);
182 m.shiftLeft(false, false);
183 }
184 }
185
186 void printStringWithShift(char* s, int shift_speed) // Metodo chamado no Loop responsavel pelo deslocamento da informacaoo no display
187 {
188 while (*s != 0)
189 {
190 //Repassa os dados para o metodo que identifica os dados a ser impresso
191 printCharWithShift(*s, shift_speed);
192 //Acrescenta s para movimentar a matriz
193 s++;
194 }
195 }
Então, para modificar a mensagem de início, no Monitor Serial, escreva a velocidade, o brilho, a mensagem desejada com um espaço e observe a mensagem rolando na Matriz de LEDs.
Vários Módulos Adjacentes
Caso queira aumentar o letreiro, é só fazer uma ligação nos pinos superiores do Módulo e, aproveitando o mesmo código, altere somente na linha 110 (“int maxInUse = 2;
“) com a quantidade de módulos de acordo com seu projeto desejado.
No esquema abaixo, temos um exemplo com duas Matrizes de LEDs:
Muito simples a conexão, agora é só carregar o código, inserir a mensagem e observar o funcionamento.
Onde comprar?