terça-feira, abril 15, 2014

MAX7219 Display Driver - Controlando LEDs RGB com o Arduino

Neste segundo exercício com o MAX7219 vamos usá-lo para controlar alguns LEDs RGB.


Hardware

Os LEDs utilizados são do tipo anodo (terminal positivo do LED) comum. Isto leva a uma conexão e mapeamento dos LEDs um pouco diferentes. As linhas DIG do MAX7219 precisam ser conectadas aos catodos dos LEDs, portanto ao invés de selecionar o LED vão selecionar a cor (vermelho, verde ou azul). A seleção do LED é feita conectando o anodo comum à linhas SEG.


Como no exemplo anteior, o Arduino utilizado é um Nano e usei três saídas digitais quaisquer para gerar os sinais de comunicação. Novamente temos o resistor que define a corrente nos segmentos e dois capacitores de desacoplamento.

Software

O software utiliza a mesma funções básicas que o exemplo anterior. O código de teste é bastante simples.
// Conexões ao MAX7219
#define PIN_LOAD 6
#define PIN_DIN  5
#define PIN_CLK  4
#define LED      13

// Registradores do MAX7219
#define MAX7219_NOP   0x00
#define MAX7219_DIG0  0x01
#define MAX7219_DIG1  0x02
#define MAX7219_DIG2  0x03
#define MAX7219_DIG3  0x04
#define MAX7219_DIG4  0x05
#define MAX7219_DIG5  0x06
#define MAX7219_DIG6  0x07
#define MAX7219_DIG7  0x08
#define MAX7219_MODE  0x09
#define MAX7219_INT   0x0A
#define MAX7219_LIM   0x0B
#define MAX7219_SHUT  0x0C
#define MAX7219_TEST  0x0F

// CONEXOES DOS LEDS
#define LED_R  MAX7219_DIG0
#define LED_G  MAX7219_DIG1
#define LED_B  MAX7219_DIG2

#define LED_1  0x40
#define LED_2  0x20
#define LED_3  0x10

// Iniciação
void setup ()
{
  pinMode (LED, OUTPUT);
  pinMode (PIN_LOAD, OUTPUT);
  pinMode (PIN_DIN, OUTPUT);
  pinMode (PIN_CLK, OUTPUT);
  digitalWrite (PIN_LOAD, HIGH);
  digitalWrite (PIN_CLK, LOW);
  digitalWrite (PIN_DIN, LOW);
  
  write7219 (MAX7219_SHUT, 0x00);
  write7219 (MAX7219_TEST, 0x00);
  write7219 (MAX7219_MODE, 0x00);
  write7219 (MAX7219_INT, 0x0F);
  write7219 (MAX7219_LIM, 0x02);
  write7219 (LED_R, 0);
  write7219 (LED_G, 0);
  write7219 (LED_B, 0);
  write7219 (MAX7219_SHUT, 0x01);
}

// Loop principal
void loop ()
{
  // Acende o LED do Arduino (para indicar primeira etapa)
  digitalWrite (LED, HIGH);

  // LEDs apagados
  write7219 (LED_R, 0);
  write7219 (LED_G, 0);
  write7219 (LED_B, 0);
  delay (2000);
  digitalWrite (LED, LOW);

  // Acende o primeiro LED na cor vermelha
  write7219 (LED_R, LED_1);
  delay (2000);

  // Apaga o primeiro LED
  // Acende o segundo LED na cor vermelha
  write7219 (LED_R, LED_2);
  delay (2000);

  // Apaga o segundo LED
  // Acende o terceiro LED na cor vermelha
  write7219 (LED_R, LED_3);
  delay (2000);

  // Acendo o primeiro LED na cor vermelha
  // Acendo o segundo LED na cor verde
  // Acendo o terceiro LED na cor azul
  write7219 (LED_R, LED_1);
  write7219 (LED_G, LED_2);
  write7219 (LED_B, LED_3);
  delay (2000);

  // Acende os três LEDs na cor "branca" (vermelho+verde+azul)
  write7219 (LED_R, LED_1 | LED_2 | LED_3);
  write7219 (LED_G, LED_1 | LED_2 | LED_3);
  write7219 (LED_B, LED_1 | LED_2 | LED_3);
  delay (2000);
}

// Escreve em um registrador do MAX7219
void write7219 (uint8_t addr, uint8_t data)
{
  digitalWrite (PIN_LOAD, LOW);
  shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, addr);
  shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, data);
  digitalWrite (PIN_LOAD, HIGH);
}
Resultado

O vídeo abaixo mostra a montagem funcionando.


2 comentários:

Fagundes disse...

como poderia usar o max7219 para trabalhar com display (caseiro) com segmentos de fitas com3 LEDs alimentados por 12V, RoHS 5730 - 3LED

Daniel Quadros disse...

Fagundes, o MAX7219 não é apropriado para controlar (pelo menos diretamente) LEDs de alta potência. Talvez desse para fazer algum esquema colocando transistores nas saídas do MAX, mas seria bem complicado.