26 maio 2018

Como usar o módulo Max7219 com 4 matrizes 8x8

Hoje vamos conhecer um módulo Max7219 diferente, composto por 4 matrizes de led 8x8, ideal para formação de painéis e letreiros, que podem ser usados para propaganda, painel de avisos, relógios, contadores e outras aplicações.

Arduino Uno e Módulo Max7219 4 dígitos

O módulo 4 matrizes de led 8x8 com Max7219 que vamos usar aqui segue a mesma ideia de um outro painel que mostrei anteriormente, no post Painel de Leds com Max7219, mas na ocasião usei apenas 2 módulos, que foram interligados manualmente.

O módulo Max7219 com 4 matrizes


Neste módulo com 4 matrizes de led 8x8 temos também 4 CI´s Max7219, cada um controlando uma matriz. Se retirarmos a matriz do soquete, podemos ver logo embaixo dela o CI controlador:

Detalhe Max7219

Repare também na inscrição FC-16 gravada na placa. Ela será útil em breve.

As quatro partes do módulo estão interligadas, ou seja, compartilham os pinos Vcc, GND, DIN/DOUT, CS e CLK. Esses três últimos são os pinos de controle, e permitem o controle total das matrizes, que podem funcionar em conjunto ou individualmente.

As setas na parte de baixo, onde podemos ver a inscrição IN/OUT mostram o sentido dos dados do display (entram pelo DIN, saem pelo DOUT). No lado direito da imagem acima temos os pinos sem conexão, que podem ser usados para soldagem de uma barra de pinos e conectados à outro módulo Max7219 com 4 matrizes, formando painéis maiores.

Conexão do módulo Max7219 no Arduino Uno


A conexão do módulo é feita por 3 pinos de controle: DIN, CS e CLK, conectados aos pinos digitais 4, 5 e 6 respectivamente. O pino Vcc deve ser ligado à uma fonte de alimentação 5V (vamos utilizar o pino 5V do Arduino Uno), assim como o pino GND.

Circuito Arduino Uno e Módulo Max7219


Essa parte de conexão não tem segredos, então vamos partir para a instalação da biblioteca e programação.

Instalação e configuração da biblioteca MD_MAX72XX


Nos programas a seguir, vamos usar a biblioteca MD_MAX72XX, baixando-a pela própria IDE do Arduino. Vá até o menu Sketch -> Instalar Biblioteca -> Gerenciar Bibliotecas e procure por MD_MAX72XX, clicando em seguida em Instalar:

Instalação biblioteca MD_MAX72XX IDE Arduino

Depois da instalação, temos que fazer uma pequena alteração nesta biblioteca para que ela funcione com o módulo que estamos utilizando, o tal FC-16 que vimos no início deste post.

Procure pelo arquivo MD_MAX72XX.h, que foi instalado (provavelmente) no caminho \\Documentos\Arduino\Libraries\MD_MAX72XX\src:

Biblioteca MD_MAX72XX Arduino

Com o editor de textos da sua preferência, abra esse arquivo e encontre a linha com o seguinte código:

#define USE_FC16_HW 0

Substitua o valor 0 por 1, salve o arquivo e a biblioteca estará pronta para ser utilizada. 







Vamos agora testar o funcionamento do módulo Max7219 com Arduino realizando um teste com o bom e velho scroll.

Programa Scroll com módulo Max7219


O programa abaixo realiza um scroll horizontal no display, ou seja, temos uma mensagem (configurável na linha 83 do programa) que se moverá do lado direito para o lado esquerdo do display.

Na linha 8 configuramos o número de matrizes de led que estamos usando (no caso, 4), e nas linhas de número 11, 12 e 13 indicamos os pinos de conexão que serão usados pelo Arduino para controlar o módulo: pinos digitais 4 (conectado ao DIN), 5 (conectado ao CS) e 6 (conectado ao CLK).

 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
// Programa: Scroll com modulo Max7219 4 digitos
// Autor: Arduino e Cia

// Carrega a biblioteca MD_MAX72xx
#include <MD_MAX72xx.h>

// Numero de modulos utilizados
#define     MAX_DEVICES     4

// 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     120
// Colunas entre cada caracter
#define     CHAR_SPACING     1

#define     BUF_SIZE     75
char curMessage[BUF_SIZE];
char newMessage[BUF_SIZE];

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::TSL);

    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();
}

Experimente usar também este módulo Max7219 com placas como Raspberry Pi e módulos ESP8266.

10 comentários:

  1. Olá. Excelente postagem . Muito importante a dica do FC-16. Seria bom também explicar o que diferencia de outros módulos.

    ResponderExcluir
  2. Olá Adilson como vai?
    Estou a vários dias tentando fazer esse.modilo funcionar pra escrever sobre ele no.meu site sem sucesso. Mas graças às suas informações consegui! Será que vc me autoriza a utilizar algumas informações daqui para que eu posso fazer o meu artigo? Desde já muito obrigado!

    ResponderExcluir
    Respostas
    1. Oi Márcio!

      Claro, fique à vontade. Se puder colocar um link para o artigo original, agradeço. :)

      Abraço!

      Adilson

      Excluir
  3. Olá Adilson tudo bem?
    faz vários dias, que estou pelejando com essa matriz, pra escrever um artigo, finalmente consegui graças ao seu post.
    você me daria permissão de publicar no meu site uma adaptação desse seu artigo? queria usar algumas imagens também, bem como mencionar um link pro seu artigo dando os créditos.
    desde já agradeço!

    ResponderExcluir
    Respostas
    1. Oi Márcio,

      Antes de mais nada peço desculpas pela demora além do normal, pq o sistema não estava liberando os comentários.

      Permissão concedida! :)

      Abraço e obrigado!

      Adilson

      Excluir
  4. Estou utilizando 2 módulos não identificados com o 16 e sim display. ao ligar os caracteres estão invertidos com se espelhados. o que devo alterar tenho um versa anterior do Arduino e Cia que funciona porém, nao mostra todo o texto no display antes de concluir inicia outra impressão sem reséitar a qu está iniciada.

    ResponderExcluir
    Respostas
    1. Oi Carlos,

      Tente usar a dica do Sergio (comentário abaixo), e mudar o valor da variável #define USE_OTHER_HW 0.

      Abraço!

      Adilson

      Excluir
  5. com 2 módulos de 4 ( 8 x 32 ) como ficariam as modificações. Retirei a matriz de leds e não tem impresso FC-16.
    Grato pela atenção.

    ResponderExcluir
  6. Tive que mudar "#define USE_OTHER_HW 0" senão o texto fica invertido.
    Obrigado

    ResponderExcluir
    Respostas
    1. Oi Sérgio,

      Legal. Valeu a dica! :)

      Abraço!

      Adilson

      Excluir