24 abril 2014

Painel de led com módulo Max7219 e matriz 8x8

Ok, não vai ser "aquele" painel de leds, afinal estou trabalhando apenas com dois módulos Max7219, mas vamos aproveitar a facilidade de ligação (apenas 3 pinos de dados) dessa matriz de leds 8x8 com o Arduino, e montar um painel com scroll (rolagem) de texto, muito fácil de ser expandido.

Ligação Arduino e módulo matriz de leds 8x8
 Para quem ainda não conhece o Módulo Matriz de leds 8x8 com Max7219, recomendo a leitura deste artigo. Lá eu falo um pouco mais sobre o componente e como utilizá-lo para realizar um scroll em um único módulo, com todo o array de caracteres definido no programa. Na montagem do painel deste post aqui, vou utilizar uma biblioteca para controlar os dois módulos.

Na foto abaixo eu retirei a matriz de leds para mostrar as conexões : do lado esquerdo (JP1), os pinos Vcc, GND, DIN, CS e CLK, que serão ligados ao Arduino. Do lado direito (JP2), as conexões Vcc, GND, DOUT, CS e CLK, que serão utilizadas na ligação ao segundo módulo.


Detalhe conectores do Módulo Max7219

O circuito abaixo mostra que a ligação dos dois módulos não tem nenhum grande segredo : os 5 pinos de saída (lado direito - JP2) do primeiro módulo são conectados diretamente aos 5 pinos de entrada do segundo módulo, e apenas o primeiro módulo é ligado diretamente ao Arduino :

  • Pino 5v do Arduino ligado ao Vcc
  • Pino GND do Arduino ligado ao GND
  • Porta 4 do Arduino ligada ao DIN
  • Porta 5 do Arduino ligada ao CS
  • Porta 6 do Arduino ligada ao CLK

Painel de Leds Arduino e Módulo matriz de leds Max7219





Para o programa, vamos utilizar a biblioteca MD_MAX72xx, que pode ser encontrada neste link. Descompacte o arquivo e coloque a pasta MD_MAX72xx dentro da pasta LIBRARIES da IDE do seu Arduino, não esquecendo de reiniciar a IDE para que a nova biblioteca seja reconhecida.

O programa está configurado para usar 2 módulos Max7219. Alterando o valor de MAX_DEVICES, adequamos o programa ao número de módulos conectados.

As variáveis DATA_PIN, CS_PIN e CLK_PIN definem os pinos do Arduino que serão utilizados para conexão. SCROLL_DELAY define a velocidade com que os caracteres serão mostrados, e CHAR_SPACING define o número de colunas que serão usadas como intervalo entre um caracter e outro. Por fim, o comando

mx.control(MD_MAX72XX::INTENSITY, 4);

determina o nível de luminosidade do display.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Programa : Painel de leds com modulo Max7219  
// Adaptacoes e comentarios : Arduino e Cia  

// Carrega a biblioteca MD_MAX72xx  
#include <MD_MAX72xx.h>  
  
// Numero de modulos utilizados  
#define     MAX_DEVICES     2  
  
// Ligacoes ao Arduino  
#define     DATA_PIN     4  
#define     CS_PIN       5  
#define     CLK_PIN      6  
   
MD_MAX72XX mx = MD_MAX72XX(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);  
  
// Velocidade do scroll  
#define SCROLL_DELAY     2000  
// Colunas entre cada caracter  
#define     CHAR_SPACING     1  
  
#define     BUF_SIZE     75  
char curMessage[BUF_SIZE];  
char newMessage[BUF_SIZE];  
  
// int scrollDelay;  
  
uint8_t scrollDataSource(uint8_t dev, MD_MAX72XX::transformType_t t)  
{  
  static char          *p = curMessage;  
  static uint8_t     state = 0;  
  static uint8_t     curLen, showLen;  
  static uint8_t     cBuf[8];  
  uint8_t colData;  
  
  switch(state)  
  {  
  case 0:  
    showLen = mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);  
    curLen = 0;  
    state++;  
    if (*p == '\0')  
    {  
     p = curMessage;  
    }  
  case 1:       
    colData = cBuf[curLen++];  
    if (curLen == showLen)  
    {  
     showLen = CHAR_SPACING;  
     curLen = 0;  
     state = 2;  
    }  
    break;  
  case 2:  
    colData = 0;  
    curLen++;  
    if (curLen == showLen)  
     state = 0;  
    break;  
    default:  
    state = 0;  
  }  
  return(colData);  
}  
  
void scrollText(void)  
{  
  static uint32_t     prevTime = 0;  
  if (millis()-prevTime >= SCROLL_DELAY)  
  {  
    mx.transform(MD_MAX72XX::TSR);       
    prevTime = millis();  
  }  
}  
  
void setup()  
{  
  mx.begin();  
  mx.setShiftDataInCallback(scrollDataSource);  
  // Define o nivel de luminosidade  
  mx.control(MD_MAX72XX::INTENSITY, 4);  
  // Mensagem a ser exibida   
  strcpy(curMessage, " Arduino e Cia ");  
  newMessage[0] = '\0';  
}  
   
void loop()   
{  
  scrollText();  
}  

Abaixo, vídeo do projeto em funcionamento :





45 comentários:

  1. Olá amigo, muito obrigado pelo post; liguei com 2 módulos e funcionou perfeito! Tenho 3 perguntas:
    1) Até com quantos módulos pode funcionar?
    2) Como mostrar e rolar as mensagens lateralmente, visto que os 5 terminais (pernas) dos módulos impedem de encostá-los um ao outro, como vc mesmo mostrou no vídeo, me entendeu?
    3) Tem como mostrar outros símbolos, por exemplo, setas, etc.?
    Obrigado

    ResponderExcluir
    Respostas
    1. Boa tarde,

      1 - Não consegui testar ainda o número máximo de módulos, mas creio que o número máximo seja 8.
      2 - Uma alternativa para melhorar essa rolagem lateral é você soldar diretamente os módulos, um ao lado do outro, retirando os pinos originais.
      3 - É possível sim, mas aí seria necessário mexer no programa e criar o array de caracteres, como eu fiz nesse post :

      http://www.arduinoecia.com.br/2013/08/modulo-matriz-de-leds-8x8.html

      Infelizmente eu ainda não tenho isso pronto para funcionar com dois ou mais módulos, mas futuramente posso gerar um post com caracteres customizados.

      Abraço !

      Excluir
  2. Gostaria de agradecer pelo excelente post. Comprei 3 modulos e gerei o programa e tudo OK. Gostaria de enfatizar a 2 pergunta no dancopy, pois se juntarmos as matrizes, nao teria um "buraco" entre elas. Tem algum comando que faca o scrool na vertical ?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Eu que agradeço a visita, e espero que retorne. :-)

      Realmente esse tipo de módulo fica um pouco estranho se juntar, mas para fins didáticos, ele quebra o galho. Existe um outro tipo de módulo, que se não me engano o max7219 fica embaixo da matriz, o que facilitaria a criação de um painel mais "profissional".

      Quanto ao scroll vertical, ainda não tenho nada, mas é uma ótima idéia para um novo post.

      Abraço !

      Excluir
  3. fica aqui um link em que é possivel colocar os modulos lado a lado com scoll no sentido " vertical"
    do modulo

    http://arduinobymyself.blogspot.com.br/2013/07/matriz-de-pontos-max7219.html

    ResponderExcluir
  4. Parabéns pelo ótimo post. Alguém sabe como fazer a rolagem de texto pra cima, pra baixo e pra direita ? Tentei de várias formas e não obtive êxito . sou novato no mundo arduino. Desde já agradeço pela atenção de todos.

    ResponderExcluir
  5. O MEU NÃO DEU CERTO.

    ResponderExcluir
  6. parabéns pelo post, pode me dar uma força sou bem leigo e estou tentando fazer o seguinte, fazer com que seja escrito na Matrix um texto recebido de um cartao de memoria, não esta funcionando segue parte do codigo onde faz esta função;

    myFile = SD.open("texto1.txt");
    if (myFile) {
    scrollText();
    while (myFile.available()) {
    texto = (myFile.read());
    strcpy(curMessage,texto);
    newMessage[0] = '\0'; }

    este é o erro que tenho:
    projeto_painel_led:114: error: invalid conversion from 'char' to 'const char*' [-fpermissive]


    sera que poderia me ajudar?

    ResponderExcluir
  7. Muito legal!! Eu quero fazer também, mas gostaria de saber se da pra fazer com matrix 7x5?. Sabe se tem que alterar o código ou não?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Vai precisar de alteração sim.

      Abraço!

      Excluir
  8. Bom dia a minha matriz só fica acesa tem como me ajudar(montei igual o seu projeto detalhe por detalhe)arduino uno 1.6.5,obrigado...

    ResponderExcluir
    Respostas
    1. Boa noite,

      Já reviu todas as ligações, certo ? Tentou inverter a matriz de leds ? Muitas vem sem nenhuma indicação do lado certo de conexão.

      Abraço!

      Excluir
    2. Apenas pra registrar: tive o mesmo problema ao usar módulos avulsos. Ao testar com um módulo "4x 8x8" funcionou... Pesquisando descobri que o display do módulo avulso é diferente do módulo"4x 8x8" (um é cátodo comum e o outro é anodo comum).

      Excluir
  9. O link da biblioteca nao existe mais, baixei outra mas o programa nao reconhece a biblioteca. Exibe a mensagem de texto: 'MD_MAX72XX' does not name a type. Utilizo a versao 1.0.1, a versao 1.6.6 nao roda nada aqui no meu PC. Obrigado.

    ResponderExcluir
    Respostas
    1. Boa noite Minoru,

      Obrigado por avisar, realmente não acho mais essa biblioteca. Vou fazer mais alguns testes e depois atualizo o post.

      Abraço!

      Excluir
  10. Olá. Muito bem explicado esse artigo. Minha duvida é: eu consigo conectar 12 displays em serie, como foi feito no exemplo?

    ResponderExcluir
    Respostas
    1. Oi Leonardo,

      Nunca tentei com tantos displays, mas teoricamente não há problema. :)

      Abraço!

      Excluir
  11. Também não consegui baixar a biblioteca e baixei de outro lugar, mas na hora de compilar deu erro.

    ResponderExcluir
    Respostas
    1. Oi Luciano!

      Corrigi o link da biblioteca no post. Testei e está ok agora.

      Qualquer problema, por favor me avise. Abraço!

      Excluir
  12. boa noite qual link encontraram essa biblioteca ? Grato

    ResponderExcluir
    Respostas
    1. Oi Lucas,

      Corrigi o link da biblioteca no post.

      Abraço!

      Excluir
  13. gabriel rodrigues1 de junho de 2016 23:37

    Não consigo baixar a biblioteca

    ResponderExcluir
  14. Quando compilo da erro :

    C:\Program Files (x86)\Arduino\libraries\MD_MAX72xx\src\MD_MAX72xx.cpp:28:17: fatal error: SPI.h: No such file or directory
    #include

    ResponderExcluir
    Respostas
    1. Bom dia,

      Inclua a biblioteca SPI no código:

      #include < SPI.h >

      (sem os espaços)

      Abraço!

      Excluir
  15. Consegui !! tem como mudar a direção que o texto rola ... De cima pra baixo ou de baixo pra cima ?

    ResponderExcluir
    Respostas
    1. Bom dia Diego,

      Com esse código não, mas é possível fazer alterando o tratamento das linhas e colunas. é uma boa sugestão de post. :)

      Abraço!

      Excluir
  16. Este comentário foi removido pelo autor.

    ResponderExcluir
  17. Tenho um módulo com 4 matrizes. Funciona, mas a mensagem inicia em cada uma das matrizes ao mesmo tempo, não fazendo a rolagem passando o texto por todas as matrizes. Alguma dica? Obrigado. DIN e DOUT estão ligados normais.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Você alterou o número de matrizes na linha 8 do programa ?

      Abraço!

      Excluir
  18. Este comentário foi removido pelo autor.

    ResponderExcluir
  19. ola, inverti as matrizes e funcionou porem, ele inicia no modulo da esquerda, como se os módulos estivessem trocados.

    ResponderExcluir
  20. Olá, veja se você pode me ajudar: com 4 módulos a mensagem passa independente em cada um, oque poderia ser ? Alterei o parâmetro para 4 módulos...

    ResponderExcluir
  21. Olá, estou com o mesmo problema, a impressão é que estão fora de sequencia da esquerda para a direita, mas como são montados juntos não seria legal desmontar e montar em outra sequencia. oque poderia ser?

    ResponderExcluir
  22. Boa tarde amigos, montei este painel com 4 módulos MAX7219 e matriz 8x8, porem quando ligo os módulos funcionam de trás para frente, ou seja imagine a sequencia de módulos montada da direita para a esquerda assim: 4 3 2 1 ao invés de ele escrever do 1 para 4 ele escreve do 4 para o 1.
    Assim a mensagem fica correndo ao contrario.
    Mudei o numero de módulos como pede o programa, mas não resolveu, alguém poderia me ajudar ?
    Desde já agradeço a atenção.

    ResponderExcluir
    Respostas
    1. Nos meus testes também observei isso !! TUDO que é escrito com essa biblioteca MD_MAX7219 aparece escrito de trás pra frente !!

      Excluir
    2. In void plot, where it says: address = 0; 1; 2; 3; Try: address = 3; 2; 1; 0; like here:

      void plot (byte x, byte y, byte val) {

      //select which matrix depending on the x coord
      byte address;
      if (x >= 0 && x <= 7) {
      address = 0;
      }
      if (x >= 8 && x <= 15) {
      address = 1;
      x = x - 8;
      }
      if (x >= 16 && x <= 23) {
      address = 2;
      x = x - 16;
      }
      if (x >= 24 && x <= 31) {
      address = 3;
      x = x - 24;

      Excluir
    3. Desculpe, escrevi em inglês e estou re-escrevendo em português.
      Em void plot, onde diz: address = 3; 2; 1; 0; tente assim: address = 0; 1; 2; 3; como aqui:

      void plot (byte x, byte y, byte val) {

      //select which matrix depending on the x coord
      byte address;
      if (x >= 0 && x <= 7) {
      address = 0;
      }
      if (x >= 8 && x <= 15) {
      address = 1;
      x = x - 8;
      }
      if (x >= 16 && x <= 23) {
      address = 2;
      x = x - 16;
      }
      if (x >= 24 && x <= 31) {
      address = 3;
      x = x - 24;

      Excluir
    4. dancopy, boa noite.

      Estas alterações onde devem ser feitas. Não há nenhuma linha no sketch com a seção "plot".

      Excluir
    5. CORREÇÃO DO ESPELHAMENTO DE CARACTERES

      Na linha 72, onde está...

      mx.transform(MD_MAX72XX::TSR);

      ...simplesmente troque TSR por TSL, e deve ficar assim...

      mx.transform(MD_MAX72XX::TSL);

      TSR significa "transform shift right" e na biblioteca utilizada, inverte os pixels e o sentido do fluxo do scroll, da esquerda para a direita (right). Analogamente, TSL, "transform shift left", da direita para a esquerda (left).

      Excluir
  23. Não consigo mais fazer funcionar com a IDE nova do Arduino (1.6.5). Dá erro na programação. Alguém sabe resolver ?

    MAX7219_5:28: error: 'prog_uchar' does not name a type
    MAX7219_5.ino: In function 'void printCharWithShift(char, int)':
    MAX7219_5:195: error: 'CH' was not declared in this scope
    MAX7219_5.ino: In function 'void printString(char*)':
    MAX7219_5:220: error: 'CH' was not declared in this scope
    'prog_uchar' does not name a type

    ResponderExcluir
    Respostas
    1. Alexandre, boa tarde. Já tive problemas parecidos por simplesmente retirar uma das chaves de qualquer parte do sketch. Dá uma verificada minuciosa, pois toda chave que abre, deve fechar.

      SÓ ESTRANHO O BLOG POSTAR ATUALIZAÇÃO COM MAIS DE 1 MÊS DEPOIS DE POSTADA A PERGUNTA/SOLUÇÃO...

      Excluir
    2. Oi Felipe,

      Tudo bem? Realmente eu estou demorando um pouco, mas prometo me dedicar mais. hehe. Não posso liberar os comentários automaticamente pois preciso tomar cuidado com quem coloca palavrões, links concorrentes, gente que escreve em LETRA MAIÚSCULA, entre outros. :)

      De qualquer forma, agradeço muito a sua contribuição e convido para visitar o Arduino e Cia sempre que possível....

      Abraço!

      Adilson

      Excluir