quinta-feira, junho 19, 2014

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

Analiso aqui um módulo comercializado na Deal Extreme com um display LED 7 Segmentos com 4 dígitos.



O módulo é relativamente pequeno: a placa mede 42 x 23 mm e cada dígito cerca de 5 x 9 mm.Um conector do tipo "espeto" (de 90°) é usado para alimentação e comunicação: os pinos são marcados como CLK, DIO, Vcc e Gnd.



A alimentação recomendada é 5V, mas o módulo opera com tensões de 3,3 a 5,5V. A luminosidade varia pouco com a tensão de alimentação.

A comunicação utiliza somente dois pinos (padrão I2C) graças ao uso do driver TM1637. Já vimos aqui uma placa baseada em um irmão dele, o TM1638. Infelizmente, o datasheet do TM1637 parece estar disponível apenas em chinês. O que não impediu que algumas bibliotecas fossem desenvolvidas:
  • O Seeedstudio tem uma placa semelhante, aqui está a documentação com um link para uma biblioteca.
  • O Arduino Playground também tem uma página sobre estes displays.
  • Aqui uma explicação curta do autor do código referenciado no Arduino Playground.
 Um detalhe que os textos acima não mencionam é o controle dos dois pontos. Ele está ligado ao segmento do ponto decimal do segundo dígito.

Como um primeiro teste, conectei o display a um Arduino Uno, usando a biblioteca do Arduino Playground. A ligação do display é simples: GND ao GND, Vcc ao 5V, CLK ao pino 2 e DIO ao pino 3.  O código de teste é:
  1. // Teste de Display de 4 dígitos controlado com TM1637  
  2.   
  3. #include <TM1637Display.h>  
  4.   
  5. // Conexão ao módulo  
  6. #define CLK 2  
  7. #define DIO 3  
  8.   
  9. TM1637Display display(CLK, DIO);  
  10.   
  11. int cont = 0;  
  12.   
  13. // Iniciação - Coloca o brilho no máximo  
  14. void setup()  
  15. {  
  16.   display.setBrightness(0xF);  
  17. }  
  18.   
  19. // Loop principal - mostra contador  
  20. void loop()  
  21. {  
  22.   uint8_t segto;  
  23.     
  24.   // Mostra o valor atual  
  25.   display.showNumberDec(cont, true);  
  26.   delay(500);  
  27.     
  28.   // Acende o ':' do display  
  29.   segto = 0x80 | display.encodeDigit ((cont / 100) % 10);  
  30.   display.setSegments (&segto, 1, 1);  
  31.   delay(500);  
  32.     
  33.   // Avança a contagem  
  34.   if (++cont == 10000)  
  35.     cont = 0;  
  36. }  
O código acima incrementa um contador de segundos de 0 a 9999. Os dois pontos piscam a cada 0,5 segundo.

Como segundo teste, conectei o display a uma Launchpad MSP430. Para isto fiz uma mistura do código da biblioteca para o Arduino com um código que eu tinha feito para conectar por I2C uma EEprom.Duas curiosidades aqui: a primeira é que o compilador IAR não aceita a sintaxe (não padrão) do GCC para constantes binárias. A segunda é que o meu código tinha um pequeno erro: o bit de reset da interface I2C fica no registrador USICTL0 e não em USICKCTL. Por uma destas coincidências perigosas, este erro não impedia o funcionamento do código original. A ligação do display à Launchpad consiste em ligar GND a GND, Vcc a Vcc, CLK a P1.6 e DIO a P1.7.

Os códigos dos dois exemplos estão nos arquivos do blog em DisplayTM1637.zip.

Conclusão

Embora um display de 4 dígitos possa ser comprado por um quarto do preço desta placa, é bastante desajeitado ligá-lo a um microcontrolador, tanto do ponto de vista elétrico como mecânico. Este módulo é extremamente prático, simplificando as conexões e a montagem mecânica. Apenas gostaria da opção de um display com dígitos maiores.

2 comentários:

Romildox disse...

Boa Noite! Parabéns pelo Blog. Você têm alguma ideia de como usar dois ou mais módulos em um arduino?

Daniel Quadros disse...

Romildo, basta você ligar cada display a dois pinos do Arduino e criar várias instâncias da classe TM1637Display. Por exemplo, se você tiver um display ligado aos pinos 2 e 3 e outros aos pinos 4 e 5:

TM1637Display display1(2, 3), display2(4, 5);