segunda-feira, 27 de abril de 2015

Módulo Matriz de LEDs com MAX7219

    Já foi abordado alguma tempo atrás sobre o uso do módulo matriz de led usando o max7219, resolvi fazer outro post mais detalhado pois é um assunto muito discutido na comunidade do arduino.

    O uso de display de LEDs é uma otima interface de comunicação entre o usuário e a máquina. Com a combinação de display de 7 segmentos, bargraph ou uma matriz de pontos é possível criar frases, letras e números.
    Nesse artigo iremos estudar melhor o uso de matriz de LEDs entendendo o seu funcionamento e utilizando o CI MAX7219 e um exemplo aplicado ao arduino.


Hardware:

    Uma matriz de LEDs permite a criação de mensagens com maior quantidade de informações. Diferente da maioria dos displays de 7 segmentos, é possível criar números, letras e desenhos de uma forma interessante.
    A matriz conta com 8 LEDs em cada coluna e 8 em cada linha, com isso tendo um total de 64 LEDs, existem matrizes de LEDs RGB permitindo maior interação, mas no nosso caso iremos abordar apena com uma única cor.
    Os LEDs na matriz são ligados de uma forma especial, para que se possa reduzir o número de pinos de acionamento, reduzindo bastante o hardware. Assim como os displays de 7 segmentos existe matriz de anodo ou catodo comum. Veja abaixo a disposição:

   


    Para acionar os 64 LEDs devemos usar técnicas de multiplexação , para que possa desenhar imagens utilizado todos os LEDs presentes na mesma. A multiplexação deverá acionar uma linha por vez e o LED desejado para cada coluna. Depois de um tempo essa linha deverá ser apagada e a próxima linha deverá acionada. Deve-se repetir esse ciclo continuamente parada todas as linhas. A frequência de chaveamento entre linhas deverá ser feita acima de 50Hz para que se aproveite o efeito de persistência de visão, onde uma imagem permanece por um tempo na nossa retina. Dessa forma é possível exibir imagens usando todos os LEDs.

    Para essa varredura pode-se utilizar um microcntrolador, porém serão necessários 16 pinos do mesmo para essa tarefa, e isso para apenas uma matriz. Para facilitar esse processo, pode-se utilizar circuitos digitais, como registradores de deslocamento, diminuindo a quantidade de pinos utilizados do microcontrolador.

    Outra forma, mais interessante, é utilizar um CI dedicado para essa tarefa. O MAX7219 é dedicado para 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. Os detalhes de funcionamento desse CI está disponível em seu datasheet [4].A figura 3 exibe a pinagem do MAX7219:


Material:


    - Arduino
    - Max7219
    - Potenciometro
    - Fios

    O exemplo a seguir tem como objetivo apresentar um jogo do tipo pong, utilizando a matriz de LEDs. Foi baseado no exemplo apresentado no livro Arduino Básico, da Novatec. Serão apresentados todos os detalhes da programação, para que você possa construir suas próprias aplicações utilizando a biblioteca LedControl.


    A ligação do Arduino ao módulo é bem simples, necessitando apenas de 5 cabos. A ligação deve ser feita conforme tabela 1 a seguir:


     O Potenciômetro deverá ser ligado à entrada analógica 5. Feitas as ligações necessárias, vamos passar para a programação.


Programação:

    Para o programa a seguir será necessário instalar a biblioteca LedControl [9]. Após a instalação da mesma, compile o programa e faça o upload para a placa: 

      

 /*  
   Exemplo PONG  
   Livro Arduino Básico de Michael McRoberts  
 */  
 //inclui biblioteca LedControl:http://playground.arduino.cc/Main/LedControl  
 #include "LedControl.h"  
 LedControl myMatrix = LedControl(12, 11, 10, 1); // cria uma instância de uma Matriz  
                          //pino 12 - DIN  
                          //pino 11 - CLK  
                          //pino 10 - CS  
 int column = 1, row = random(8)+1; // decide em que ponto a bola deve iniciar  
 int directionX = 1, directionY = 1; // certifica-se de que ela vai primeiro da esquerda para a direita  
 int paddle1 = 5, paddle1Val;    // pino e valor do potenciômetro  
 int speed = 300;          // velocidade  
 int counter = 0, mult = 10;     // variáveis auxiliares para controle de velocidade  
 void setup() {  
  myMatrix.shutdown(0, false); // habilita o display  
  myMatrix.setIntensity(0, 1); // define o brilho dos leds  
  myMatrix.clearDisplay(0);  // limpa o display  
  randomSeed(analogRead(0));  //  
 }  
 void loop() {  
  paddle1Val = analogRead(paddle1);       //le valor do potenciometro  
  paddle1Val = map(paddle1Val, 200, 1024, 1,6); //mapeia valor para entre 1 e 6  
  column += directionX;   //atualiza valor da coluna  
  row += directionY;    //atualiza valor da linha  
  //verifica se boa atingiu a raquete  
  if (column == 6 && directionX == 1 && (paddle1Val == row || paddle1Val+1 == row  
 || paddle1Val+2 == row))  
  {  
   directionX = -1; //rebate bola  
  }  
  //verica se bola atingiu paredes: topo, base ou lateral esquerda  
  if (column == 0 && directionX == -1 ) {directionX = 1;}  
  if (row == 7 && directionY == 1 ) {directionY = -1;}  
  if (row == 0 && directionY == -1 ) {directionY = 1;}  
  //caso tenha atingido a coluna 7, significa que ultrapassou a raquete  
  if (column == 7) { oops(); } //chama a função oops, para finalizar o jogo  
  myMatrix.clearDisplay(0); // limpa a tela para o próximo quadro de animação  
  myMatrix.setLed(0, column, row, HIGH);      //desenha bola na linha e coluna atual  
  //desenha raquete na coluna 7  
  myMatrix.setLed(0, 7, paddle1Val, HIGH);  
  myMatrix.setLed(0, 7, paddle1Val+1, HIGH);  
  myMatrix.setLed(0, 7, paddle1Val+2, HIGH);  
  if (!(counter % mult)) {speed -= 5; mult * mult;}  
  delay(speed);  
  counter++;  
 }  
 void oops()  
 {  
  for (int x=0; x<3; x++)  
  {  
   myMatrix.clearDisplay(0);  
   delay(250);  
   for (int y=0; y<8; y++)  
   {  
    myMatrix.setRow(0, y, 255);  
   }  
   delay(250);  
  }  
  // reinicia todos os valores  
  counter=0;  
  speed=300;  
  column=1;  
  row = random(8)+1; // escolhe uma nova posição inicial  
 }  


Creditos:

http://www.embarcados.com.br/modulo-matriz-de-leds-com-max7219/


2 comentários:

  1. Boa noite Felipe.

    Estou desenvolvendo um projeto que usa leds RGB e pretendo controle-los utilizando um max7219.
    Como não tenho habilidade com programação e de todos os sketch que li tive dificuldade em entender, gostaria de saber se você pode me ajudar nessa empreitada. Abraço.

    ResponderExcluir
    Respostas
    1. Fala Raphael, Ajudo sim. Quais são os primeiros passos?

      Excluir