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:

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);