Matriz de LEDs 8X8 com MAX7219

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:

Matriz de LEDs 8x8 com MAX7219

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.

MATRIZ DE LEDS 8x8

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:

Matriz de LEDs 8x8 com MAX7219

Muito simples a conexão, agora é só carregar o código, inserir a mensagem e observar o funcionamento.

MATRIZ de LEDs 8x8

Onde comprar?

LOJAS

 

 

Conheça também!