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:
// Conexões ao MAX7219
#define PIN_CLK  4
#define PIN_LOAD 5
#define PIN_DIN  6
#define LED      13

// Registradores do MAX7219
#define MAX7219_NOP   0x00
#define MAX7219_DIG0  0x01
#define MAX7219_DIG1  0x02
#define MAX7219_DIG2  0x03
#define MAX7219_DIG3  0x04
#define MAX7219_DIG4  0x05
#define MAX7219_DIG5  0x06
#define MAX7219_DIG6  0x07
#define MAX7219_DIG7  0x08
#define MAX7219_MODE  0x09
#define MAX7219_INT   0x0A
#define MAX7219_LIM   0x0B
#define MAX7219_SHUT  0x0C
#define MAX7219_TEST  0x0F

// CONEXOES DOS LEDS
#define DIG1   MAX7219_DIG7
#define DIG2   MAX7219_DIG6
#define DIG3   MAX7219_DIG5
#define DIG4   MAX7219_DIG4
#define DIG5   MAX7219_DIG3
#define DIG6   MAX7219_DIG2
#define DIG7   MAX7219_DIG1
#define DIG8   MAX7219_DIG0

uint8_t cont [9];

void setup ()
{
  pinMode (LED, OUTPUT);
  pinMode (PIN_LOAD, OUTPUT);
  pinMode (PIN_DIN, OUTPUT);
  pinMode (PIN_CLK, OUTPUT);
  digitalWrite (PIN_LOAD, HIGH);
  digitalWrite (PIN_CLK, LOW);
  digitalWrite (PIN_DIN, LOW);
  
  write7219 (MAX7219_SHUT, 0x00);
  write7219 (MAX7219_TEST, 0x00);
  write7219 (MAX7219_MODE, 0xFF);
  write7219 (MAX7219_INT, 0x0F);
  write7219 (MAX7219_LIM, 0x07);
  write7219 (DIG1, 12);
  write7219 (DIG2, 11);
  write7219 (DIG3, 13);
  write7219 (DIG4, 14);
  write7219 (DIG5, 12);
  write7219 (DIG6, 11);
  write7219 (DIG7, 13);
  write7219 (DIG8, 14);
  write7219 (MAX7219_SHUT, 0x01);
  delay (2000);
  for (int i = 0; i < 8; i++)
    cont[i] = 0;
}

void loop ()
{
  write7219 (DIG1, cont[0]);
  write7219 (DIG2, cont[1]);
  write7219 (DIG3, cont[2]);
  write7219 (DIG4, cont[3] | 0x80);
  write7219 (DIG5, cont[4]);
  write7219 (DIG6, cont[5]);
  write7219 (DIG7, cont[6]);
  write7219 (DIG8, cont[7]);
  for (int i = 7; i >= 0; i--)
  {
    if (cont[i] < 9)
    {
      cont[i]++;
      break;
    }
    cont[i] = 0;
  }
  delay (10);
}

void write7219 (uint8_t addr, uint8_t data)
{
  digitalWrite (PIN_LOAD, LOW);
  shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, addr);
  shiftOut (PIN_DIN, PIN_CLK, MSBFIRST, data);
  digitalWrite (PIN_LOAD, HIGH);
}
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.