quarta-feira, junho 25, 2014

Módulo de Display LED 7 Segmentos Com 8 Dígitos

Este módulo é uma opção ao módulo de quatro dígitos que vimos anteriormente. Também foi comprado na Deal Extreme, por um preço inferior ao outro modelo (no momento em que escrevo está em falta)


A primeira diferença, óbvia, é que temos oito dígitos. Isto é feito usando dois displays de quatro dígitos do mesmo tamanho que o usado no outro módulo. Entretanto, estes displays possuem pontos entre os dígitos ao invés dos dois pontos no centro.

Do ponto de vista mecânico, a montagem é mais compacta. Os displays são soquetados (o que é bom). Infelizmente o posicionamento dos conectores de interligação do módulo não é dos melhores. Os pinos retos para cima dificultam a montagem em um painel. Além disso, o conector da direita está muito próximo do display.

A boa notícia é que o módulo usa o MAX7219 que já examinamos aqui e aqui. Este chip é bastante versátil e de fácil uso.

O conector da direita do módulo possui os sinais VCC, GND, DIN, CS e CLK (entrada). O conector da direita (saída) possui os sinais VCC, GND, DOUT, LOAD e CLK. Desta forma é possível ligar o conector da esquerda a um microcontrolador e o conector da direita a um segundo módulo. Esta interconexão de módulos é limitada pela presença de um diodo entre os sinais de VCC da entrada e saída, o que faz com que a alimentação do segundo módulo seja 0,7V abaixo da do primeiro. Na prática isto limite o encadeamento a três módulos.

Para exercitar o módulo com um Arduino usei uma adaptação do software feito anteriormente:
  1. // Conexões ao MAX7219  
  2. #define PIN_CLK  4  
  3. #define PIN_LOAD 5  
  4. #define PIN_DIN  6  
  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 DIG1   MAX7219_DIG7  
  25. #define DIG2   MAX7219_DIG6  
  26. #define DIG3   MAX7219_DIG5  
  27. #define DIG4   MAX7219_DIG4  
  28. #define DIG5   MAX7219_DIG3  
  29. #define DIG6   MAX7219_DIG2  
  30. #define DIG7   MAX7219_DIG1  
  31. #define DIG8   MAX7219_DIG0  
  32.   
  33. uint8_t cont [9];  
  34.   
  35. void setup ()  
  36. {  
  37.   pinMode (LED, OUTPUT);  
  38.   pinMode (PIN_LOAD, OUTPUT);  
  39.   pinMode (PIN_DIN, OUTPUT);  
  40.   pinMode (PIN_CLK, OUTPUT);  
  41.   digitalWrite (PIN_LOAD, HIGH);  
  42.   digitalWrite (PIN_CLK, LOW);  
  43.   digitalWrite (PIN_DIN, LOW);  
  44.     
  45.   write7219 (MAX7219_SHUT, 0x00);  
  46.   write7219 (MAX7219_TEST, 0x00);  
  47.   write7219 (MAX7219_MODE, 0xFF);  
  48.   write7219 (MAX7219_INT, 0x0F);  
  49.   write7219 (MAX7219_LIM, 0x07);  
  50.   write7219 (DIG1, 12);  
  51.   write7219 (DIG2, 11);  
  52.   write7219 (DIG3, 13);  
  53.   write7219 (DIG4, 14);  
  54.   write7219 (DIG5, 12);  
  55.   write7219 (DIG6, 11);  
  56.   write7219 (DIG7, 13);  
  57.   write7219 (DIG8, 14);  
  58.   write7219 (MAX7219_SHUT, 0x01);  
  59.   delay (2000);  
  60.   for (int i = 0; i < 8; i++)  
  61.     cont[i] = 0;  
  62. }  
  63.   
  64. void loop ()  
  65. {  
  66.   write7219 (DIG1, cont[0]);  
  67.   write7219 (DIG2, cont[1]);  
  68.   write7219 (DIG3, cont[2]);  
  69.   write7219 (DIG4, cont[3] | 0x80);  
  70.   write7219 (DIG5, cont[4]);  
  71.   write7219 (DIG6, cont[5]);  
  72.   write7219 (DIG7, cont[6]);  
  73.   write7219 (DIG8, cont[7]);  
  74.   for (int i = 7; i >= 0; i--)  
  75.   {  
  76.     if (cont[i] < 9)  
  77.     {  
  78.       cont[i]++;  
  79.       break;  
  80.     }  
  81.     cont[i] = 0;  
  82.   }  
  83.   delay (10);  
  84. }  
  85.   
  86. void write7219 (uint8_t addr, uint8_t data)  
  87. {  
  88.   digitalWrite (PIN_LOAD, LOW);  
  89.   shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, addr);  
  90.   shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, data);  
  91.   digitalWrite (PIN_LOAD, HIGH);  
  92. }  
Reparar que o dígito 7 do MAX7219 corresponde ao dígito mais à esquerda e o digito 0 ao mais à direita (ao contrário da minha montagem anterior). O ponto, como esperado, é controlado pelo bit mais significativo do registrador dos dígitos (independente do modo).

Conclusão

Este módulo é uma boa solução para quando precisamos apresentar números com mais de quatro dígitos. O posicionamento dos conectores não é dos melhores mas dá para conviver com ele. Uma opção com displays maiores seria muito interessante.

6 comentários:

Unknown disse...

Esse código funciona direito ou tenho que baixa outras biblioteca.

Daniel Quadros disse...

Não precisa de nenhuma biblioteca adicional.

Unknown disse...

Obrigado daniel. Pela resposta vou estalar... dúvida.
Meu projeto é um pimbal caseiro pois digo sou iniciante no mundo Arduino,
Minha intenção é colocar 2 placares,
Será possipos com esse esquema.desde já muito obrigado...

Daniel Quadros disse...

Sim, é possível. Você pode inclusive encadear dois módulos destes, ligando os sinais de saída de um na entrada do outro (isto requer alterar um pouco o software).

Unknown disse...

Professor mas um pergunta
Até quantos leds de auto brilho um arduino pode acender..ao mesmo tempo
Obrigado

Daniel Quadros disse...

Estou fazendo um post falando sobre LEDs que vai abordar esta questão.