segunda-feira, 6 de maio de 2013

8º Projeto: Matriz de Led 8X8 controlado por chip MAX7219

    No 8º projeto damos um salto grande em relação a complexidade e recursos para realizar esse projeto. Recentemente realizei um compra no site dealextreme.com e chegou vários "brinquedos" para mim, e um deles foi:

FIGURA 1 - MATRIZ DE LED 8X8 CHIP MAX 7219



    Essa matriz possui grande força para estudo de multiplexação e array de matrizes. Com ela podemos escrever letreiros ou fazer efeitos de desenhos aninhados com informações.
    Mas porque essa matriz e tão boa?! Você deve ta se perguntando. Simples porque ela possui um chip integrado muito bom, que o MAX7219. 
    O MAX7219 opera de modo muito semelhante ao dos registradores de deslocamento, no sentido de que você faz a entrada de dados de modo serial, bit a bit. Esse chip utiliza apenas 3 pinos do arduino, que reconhecemos na placa com os nomes MAX, DIN e CLK.
    O MAX7219 ainda permite ativar o modo shutdown, que reduz a corrente para 150µA, o modo de controle de brilho, que controla o brilho da matriz analógica ou digitalmente, e o modo de teste que acende todos os LED’s para verificar se estão funcionando corretamente.
 
FIGURA 2 - CHIP MAX7219
Ora, vamos logo ao que interessa que é a parte de programação mesmo.

Material:

   - Arduino
    - Matriz de LED 8X8 com chip MAX7219
    

Esquema:

    
FIGURA 3 - ESQUEMA 

Código:

 #include "LedControl.h"   //biblioteca de controle de matriz  
 const byte DIN   = 12;  //Pino DataIn   
 const byte CS    = 11;  //Pino LOAD (CS)  
 const byte CLK   = 10;  //Pino CLK   
 const byte QTD_DISP = 1;  //apenas um MAX72XX  
 LedControl ledMatrix = LedControl(DIN, CLK, CS, QTD_DISP);  
 void setup() {  
  ledMatrix.shutdown(0, false); //modo 'shutdown' no display '0' é FALSE  
  ledMatrix.setIntensity(0, 10); //intensidade do display '0' é 5 (0~16)  
  ledMatrix.clearDisplay(0);   //clear display '0'  
 }  
 void loop(){  
  byte i=0, col=0, row=0;  
  char texto[] = " www.arduinoprog.blogspot.com.br "; //Texto a ser apresentado  
  char texto2[] = "acesse: ";  
  ledMatrix.clearDisplay(0);   //clear display '0'  
  ledMatrix.printStringScroll(0, 0, texto, 70, '<'); //Texto passando direita para esquerda  
  delay(500);  
  ledMatrix.printStringScroll(0, 0, texto2, 50, '>'); //Texto passando direita para esquerda  
  delay(500);  
 }  



Vídeo:


Downloads:



Qualquer dúvida fica a disposição para tentar responde-las. 

41 comentários:

  1. Excelente artigo, já tinha ouvido falar desses chips que podem ser usados para estender a quantidade de portas do microcontrolador, mas nunca cheguei a ver seu funcionamento.

    Existe algum outro chip capaz de operar tantos registros assim e que seja de fácil acesso e compatível com o arduino?

    ResponderExcluir
    Respostas
    1. Cleiton, você pode substituir o MAX7219 pelo AS1107 da Austria Microsystems, ou até msm por um CI registrador de deslocamento 74HC595, esse último nao recomendo pois vcoê irá utilizar muitos fios para conexão.
      Há, e outra cosia o MAX7219 so funciona em matriz de led 8X8 catodo comum.

      Excluir
    2. por isso que eu não estou conseguindo controlar a matriz de led rgb 8x8 .. ela fica com os led's ligado o tempo todo afff... tenho max 7219 a matriz é anodo comum

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

    ResponderExcluir
  3. caro amigo gostei,montei um e funcionou,mas quando coloco mais um modulo nao da certo porque,nao da a sequencia.

    ResponderExcluir
    Respostas
    1. Obrigado pelo comentário! Quanto a sua dúvida acredito eu que não e possível fazer o controle de duas matrizes de leds com apenas um max7219!

      Excluir
    2. vc consegue sim, tem que ligar o Dout do chip 1 no Din do chip 2 espero ter esclarecido!!!

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

      Excluir
  4. felipe ,mesmo colocando dois modulos em cascata encaixando uma na outra,ele roda so em um.

    ResponderExcluir
    Respostas
    1. Olá pessoal. Para usar dois módulos deveremos modificar no software o parâmetro QTD_DISP = 2. O pino 24 DOUT do módulo 1 deve ser ligado ao pino 1 DIN do módulo 2. Veja a ligação no Arduino neste link:
      http://www.instructables.com/id/16x8-LED-dot-matrix-with-MAX7219-module/
      Bons estudos.

      Excluir
    2. Poxa Gilberto, ótima contribuição! Eu não tinha reparado isso e nem fiz as buscas certas, mtu obrigado pela participação!

      Excluir
    3. Alterei os parâmetros e interliguei o dout do primeiro modulo ao din do segundo e não funcionou pode mãe ajudar.?

      Excluir
    4. oi tem algumas opções de cascata no site dhgate.com
      http://www.dhgate.com/wholesale/search.do?act=search&sus=&searchkey=Color+LED+Module+TM1638+Can+be+Cascaded+Replace+CH452%2FMAX7219+FZ0574&catalog=#search
      ou
      http://www.dhgate.com/wholesale/search.do?searchkey=MAX7219+LED&catalog=&supplierid=&searchSource=search#search

      Excluir
  5. Tente usar então 2 ci's 74HC595, ele funcionam em cascata!

    ResponderExcluir
  6. de uma olhada neste video http://youtu.be/W8qzJYUjhCI

    ResponderExcluir
  7. ledMatrix.printStringScroll
    essa função não muda de cor, é como se não reconhecesse essa função!!

    ResponderExcluir
    Respostas
    1. Poxa, tem certeza que você copiou certo? Pq eu retestei aqui e funcionou.

      Excluir
  8. Olá Felipe, o código acima está correto? (sou principiante)
    Fiz a verificação na IDE do Arduino e aparece as 2 seguintes mensagens de erro:

    sketch_apr06a.ino: In function 'void loop()':
    Linha 17: sketch_apr06a:17: error: 'class LedControl' has no member named 'printStringScroll'
    Linha 19: sketch_apr06a:19: error: 'class LedControl' has no member named 'printStringScroll'

    O que pode ser? obrigado

    ResponderExcluir
    Respostas
    1. Bom dia vc deve baixar a biblioteca no link acima, descompacta-la e colocar na pasta libraries do programa do arduino lembrando que vc deve criar uma pasta LedControl.

      Excluir
  9. Olá Felipe, funcionou perfeitamente aqui comigo! muito obrigado por disponibilizar.
    Mas tenho uma pergunta: olha que já pesquisei e baixei pela internet vários sketches dessas matrizes (tenho 4 desses módulos q comprei pelo ebay), mas nenhuma delas foi tão fácil pra mim; então, pq q em outros códigos é tão complicado e com tantas linhas? tipo, nesse seu tem a função "char texto[] =" para o texto; vc poderia, por favor, explicar alguma coisa desse código? por exemplo, aqui: "char texto2[] = "acesse: ";
    Mais uma vez, muito obrigado e que Deus te abençoe!

    ResponderExcluir
    Respostas
    1. Bom, obrigado dancopy pelo feed back sobre o funcionamento do código.
      Esse código está todo comentado ao lado de suas respectivas ações e realmente esta bem "enxuta" em relação aos outros códigos de matriz de led.

      Isso ocorre por causa da biblioteca criada. Ela é bem sucinta.
      Já sua dúvida especifica sobre o texto é fácil de explicar.
      No comando:

      char texto[] = " www.arduinoprog.blogspot.com.br ";

      Estou criando uma array do tipo char, eu poderia ter criado um classe string apenas. Mas quando as strings usadas como um array de char nos baseamos na tabela ASCII. Uma array char pode ser declarado de várias formas.

      char myVariable[10]; char myVariable[6] = {'H', 'e','l','1','o'}; etc...

      Nessa biblioteca nos usamos a ideia do display de LCD e colocamos a string entre " ".

      Espero ter respondido sua dúvida e estou aberto a mais dúvida.

      *Para tentar reformular essa resposta eu consultei o livro Arduino em ação - EVANS, Martin; JOSHUA, Noble. Editora Novatec - 1ª Edição

      Excluir
  10. Obrigado Edson, por responder (desculpe-me, ñ tinha visto!)

    ResponderExcluir
  11. Obrigado amigo Felipe,
    Daniel Fernandes

    ResponderExcluir
  12. Ola, como eu faria para substituir um display de 7 segmentos e usar a matriz, exemplo,,eu montei um medidor de RPM usando um display de 7 segmentos duplo, teria como exibir estes dois dígitos numa só matriz, no caso cada digito ficaria 8x4..

    Desde já muito obrigado pela resposta, e parabéns pelo post

    ResponderExcluir
  13. ola amigo,otimo post,como faria p/ acrescentar figuras e aumentar a velocidade do texto? obrigado sucesso.

    ResponderExcluir
    Respostas
    1. Fala Lucas, Obrigado pelo comentário. Bom no caso de aumenta a velocidade vc deve modificar o parâmetro 70 da linha de comando:
      - ledMatrix.printStringScroll(0, 0, texto, 70, '<'); //Texto passando direita para esquerda

      Ja para passar figuras especiais e so vc declarar um texto e jogar a fugura nela.

      Excluir
  14. boa tarde meu amigo, obrigado pelo retorno,sou novato no maravilhoso mundo do arduino,a parte da velocidade do texto eu entendi,mas sobre as figuras n entendi!! sei que para criar figura tem o codigo binario,mas n sei como declarar esse texto q o amigo falou, e se é no começo do codigo ou no fim, teria como vc me mostrar um ex: emcima desse seu codigo como declarar esse texto? desde ja te agradeço ,abraço.

    ResponderExcluir
    Respostas
    1. Bom Lucas, se você quiser fazer figuras simples como: :-) ou \o/, você apenas deve declara na linha:

      - char texto[] = " :-) \o/ "; //Texto a ser apresentado

      pois essa linha de comando faz qualquer texto como char, com isso nao precisa fazer de modo de declarar binário. Tente ai e me de um feed back por favor.

      Excluir
  15. Sabe onde eu posso ver a documentação da API dessa biblioteca (LedControl)? Vlw!!

    ResponderExcluir
    Respostas
    1. Ari Ribeiro, desculpa a demora (quse um mês). Mas eu coloquei a biblioteca nesse link aq:
      https://dl.dropboxusercontent.com/u/25438507/LedControl.zip

      Entra na pasta depois em doc e vai no icone que ira aparecer do seu navegador. lá tem td q eu achei dessa biblioteca.

      Excluir
  16. Parabéns Felipe, código simples e objetivo. Uma dúvida: eu sei que, pra aumentar o número de colunas, é só colocar um CI na sequência do outro. Mas e para aumentar o número de linhas? Seria o mesmo princípio? obrigado. Marcelo Cuin [www.cuin.com.br]

    ResponderExcluir
    Respostas
    1. Então Marcelo, acredito que sim, eu nunca fiz mais que um módulo, porque afinal so possuo um! Mas, acho q funciona sim!.

      Excluir
  17. Boa noite amigo não estou conseguindo copliar aparece esse erro:
    sketch_sep27a.ino:17:13: error: 'class LedControl' has no member named 'printStringScroll'
    sketch_sep27a.ino:19:13: error: 'class LedControl' has no member named 'printStringScroll'

    ja baixei a biblioteca.

    ResponderExcluir
    Respostas
    1. Fala Dorciley, você colocou a biblioteca na pasta certa? Tenta compilar algum exemplo que vem com a biblioteca

      Excluir
  18. Estou com o mesmo problema do Dorciley Ribeiro!

    ResponderExcluir
  19. Este comentário foi removido pelo autor.

    ResponderExcluir
  20. boa tarde, tive o mesmo erro de alguns sobre o ledMatrix.printStringScroll e não consegui resolver no meu, aparece para mim a biblioteca instalada mas não reconhece

    ResponderExcluir