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 é:
// Teste de Display de 4 dígitos controlado com TM1637

#include <TM1637Display.h>

// Conexão ao módulo
#define CLK 2
#define DIO 3

TM1637Display display(CLK, DIO);

int cont = 0;

// Iniciação - Coloca o brilho no máximo
void setup()
{
  display.setBrightness(0xF);
}

// Loop principal - mostra contador
void loop()
{
  uint8_t segto;
  
  // Mostra o valor atual
  display.showNumberDec(cont, true);
  delay(500);
  
  // Acende o ':' do display
  segto = 0x80 | display.encodeDigit ((cont / 100) % 10);
  display.setSegments (&segto, 1, 1);
  delay(500);
  
  // Avança a contagem
  if (++cont == 10000)
    cont = 0;
}
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:

Romildo Nahirne da Silva 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);