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 :





32 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