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.
  1. // Conexões ao MAX7219  
  2. #define PIN_LOAD 6  
  3. #define PIN_DIN  5  
  4. #define PIN_CLK  4  
  5. #define LED      13  
  6.   
  7. // Registradores do MAX7219  
  8. #define MAX7219_NOP   0x00  
  9. #define MAX7219_DIG0  0x01  
  10. #define MAX7219_DIG1  0x02  
  11. #define MAX7219_DIG2  0x03  
  12. #define MAX7219_DIG3  0x04  
  13. #define MAX7219_DIG4  0x05  
  14. #define MAX7219_DIG5  0x06  
  15. #define MAX7219_DIG6  0x07  
  16. #define MAX7219_DIG7  0x08  
  17. #define MAX7219_MODE  0x09  
  18. #define MAX7219_INT   0x0A  
  19. #define MAX7219_LIM   0x0B  
  20. #define MAX7219_SHUT  0x0C  
  21. #define MAX7219_TEST  0x0F  
  22.   
  23. // CONEXOES DOS LEDS  
  24. #define LED_R  MAX7219_DIG0  
  25. #define LED_G  MAX7219_DIG1  
  26. #define LED_B  MAX7219_DIG2  
  27.   
  28. #define LED_1  0x40  
  29. #define LED_2  0x20  
  30. #define LED_3  0x10  
  31.   
  32. // Iniciação  
  33. void setup ()  
  34. {  
  35.   pinMode (LED, OUTPUT);  
  36.   pinMode (PIN_LOAD, OUTPUT);  
  37.   pinMode (PIN_DIN, OUTPUT);  
  38.   pinMode (PIN_CLK, OUTPUT);  
  39.   digitalWrite (PIN_LOAD, HIGH);  
  40.   digitalWrite (PIN_CLK, LOW);  
  41.   digitalWrite (PIN_DIN, LOW);  
  42.     
  43.   write7219 (MAX7219_SHUT, 0x00);  
  44.   write7219 (MAX7219_TEST, 0x00);  
  45.   write7219 (MAX7219_MODE, 0x00);  
  46.   write7219 (MAX7219_INT, 0x0F);  
  47.   write7219 (MAX7219_LIM, 0x02);  
  48.   write7219 (LED_R, 0);  
  49.   write7219 (LED_G, 0);  
  50.   write7219 (LED_B, 0);  
  51.   write7219 (MAX7219_SHUT, 0x01);  
  52. }  
  53.   
  54. // Loop principal  
  55. void loop ()  
  56. {  
  57.   // Acende o LED do Arduino (para indicar primeira etapa)  
  58.   digitalWrite (LED, HIGH);  
  59.   
  60.   // LEDs apagados  
  61.   write7219 (LED_R, 0);  
  62.   write7219 (LED_G, 0);  
  63.   write7219 (LED_B, 0);  
  64.   delay (2000);  
  65.   digitalWrite (LED, LOW);  
  66.   
  67.   // Acende o primeiro LED na cor vermelha  
  68.   write7219 (LED_R, LED_1);  
  69.   delay (2000);  
  70.   
  71.   // Apaga o primeiro LED  
  72.   // Acende o segundo LED na cor vermelha  
  73.   write7219 (LED_R, LED_2);  
  74.   delay (2000);  
  75.   
  76.   // Apaga o segundo LED  
  77.   // Acende o terceiro LED na cor vermelha  
  78.   write7219 (LED_R, LED_3);  
  79.   delay (2000);  
  80.   
  81.   // Acendo o primeiro LED na cor vermelha  
  82.   // Acendo o segundo LED na cor verde  
  83.   // Acendo o terceiro LED na cor azul  
  84.   write7219 (LED_R, LED_1);  
  85.   write7219 (LED_G, LED_2);  
  86.   write7219 (LED_B, LED_3);  
  87.   delay (2000);  
  88.   
  89.   // Acende os três LEDs na cor "branca" (vermelho+verde+azul)  
  90.   write7219 (LED_R, LED_1 | LED_2 | LED_3);  
  91.   write7219 (LED_G, LED_1 | LED_2 | LED_3);  
  92.   write7219 (LED_B, LED_1 | LED_2 | LED_3);  
  93.   delay (2000);  
  94. }  
  95.   
  96. // Escreve em um registrador do MAX7219  
  97. void write7219 (uint8_t addr, uint8_t data)  
  98. {  
  99.   digitalWrite (PIN_LOAD, LOW);  
  100.   shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, addr);  
  101.   shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, data);  
  102.   digitalWrite (PIN_LOAD, HIGH);  
  103. }  
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.