Hardware
O display de quatro dígitos simplifica as ligações entre os módulos, já que os segmentos estão interligados internamente. O Arduino utilizado é um Nano, que pode ser colocado diretamente na protoboard. Embora seja possível (e até preferível do ponto de vista de desempenho) usar a interface SPI do ATmega, nesta montagem liguei o MAX7219 a três saídas digitais quaisquer e gerei "na mão" os sinais de comunicação (com uma pequena ajuda da biblioteca do Arduino).
O circuito possui somente três componentes discretos: o resistor que define a corrente nos segmentos e dois capacitores. A finalidade destes capacitores é filtrar as interferências geradas na alimentação pelo liga/desliga dos LEDs.
Software
O software é bastante simples mas ilustra o básico do uso do MAX7219 no comando de displays de 7 segmentos.
- // Conecões ao MAX7219
- #define PIN_LOAD 6
- #define PIN_DIN 5
- #define PIN_CLK 4
- #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_DIG0
- #define DIG2 MAX7219_DIG1
- #define DIG3 MAX7219_DIG2
- #define DIG4 MAX7219_DIG3
- uint8_t cont [4];
- // Iniciação
- 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, 0x0F);
- write7219 (MAX7219_INT, 0x0F);
- write7219 (MAX7219_LIM, 0x03);
- write7219 (DIG1, 12); // H
- write7219 (DIG2, 11); // E
- write7219 (DIG3, 13); // L
- write7219 (DIG4, 14); // P
- write7219 (MAX7219_SHUT, 0x01);
- delay (2000);
- for (int i = 0; i < 4; i++)
- cont[i] = 0;
- }
- // Loop Principal
- void loop ()
- {
- // Mostra o contador atual
- write7219 (DIG1, cont[0]);
- write7219 (DIG2, cont[1]);
- write7219 (DIG3, cont[2]);
- write7219 (DIG4, cont[3]);
- // Soma 1 no contador
- for (int i = 3; i >= 0; i--)
- {
- if (cont[i] < 9)
- {
- cont[i]++;
- break;
- }
- cont[i] = 0;
- }
- delay (100);
- }
- // Escreve um dado no registrador addr do MAX7219
- 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);
- }
O vídeo abaixo mostra a montagem funcionando.
12 comentários:
DEMAIS! E se eu quisesse que aparecesse o valor de uma leitura de um pino analógica (A0) como eu colocaria no código?
Outra coisa que não aparece no código é a biblioteca, sabe me informar qual é?
A biblioteca é a que está automaticamente disponível para os programas do Arduino (no caso pinMode, digitalWrite, delay e shiftOut). Para mostrar a leitura do A0 você precisaria substituir o código em loop(). Primeiro você faz a leitura e depois coloca cada dígito no seu lugar:
void loop()
{
int x = analogRead(A0);
write7219 (DIG1, x/1000);
write7219 (DIG2, (x / 100) % 10);
write7219 (DIG3, (x / 10) % 10);
write7219 (DIG4, x % 10);
delay(100);
}
Obs: não testei o código acima!
Obrigado =D
Fica bem mais simplificado que ligar diretamente no arduino o display sem o driver!
Ola.
Sera que vc pode me ajudar, meu display provavelmente tem a disposição dos pinos diferente do seu. Quando executo o codigo, os numeros aparecem todos 'embaralhados' e nao consigo fazer uma combinação que funcione corretamente. Meu display nao tem identificação e por isso nao sei exatamente qual eh o seu datasheet. Provavelmente é esse: http://html.alldatasheet.com/html-pdf/683804/FORYARD/FYQ-2841BX-20/912/3/FYQ-2841BX-20.html
O 2841B.
Como altero a combinação dos pinos entre o MAX7219 e o display para que funcione exibindo os digitos corretamente ? Nao consigo entender como é feita essa combinação.
Valeu
Luiz, a combinação dos pinos é feita pelos fios interligando os dois. Dê uma olhada na primeira parte desta série (http://dqsoft.blogspot.com.br/2014/04/max7219-display-driver-introducao.html). O MAX7219, no modo 7 segmentos, requer um display do tipo catodo comum. O 2841B é anodo comum, neste caso não dá para usar o modo 7 segmentos. Dá para usar como se fossem LEDs discretos, mas é mais complicado. O jeito mais fácil de conferir a pinagem do display é fazer testes ligando os pinos a 5V através de um resistor de 1K (isto é fácil de fazer na protoboard).
Alguem um projeto de um Placar Simples de dois times? Com acréscimo e decréscimo de pontos?
se eu quizer colocar um botão pra fazer a contagem e outro pra zerar, como eu faria?
Basta ligar os botões a entradas digitais, usar digitalRead para testar se um dos botões está apertado e tratar adequadamente.
Obrigado "Daniel Quadros" Testei aqui e Deu Certo!
copiei o projeto exatamente igual e não funcionou, o display ficou maluco.
SuB, provavelmente o seu display tem uma pinagem diferente do que eu usei. O display precisa ser do tipo catodo comum, veja na parte 1 qual pino do 7219 corresponde a qual dígito e qual segmento. Por exemplo, o pino 2 do 7219 precisa ser ligado ao catodo comum do primeiro dígito do display e o pino 14 do 7219 ao segmento A dos displays.
Postar um comentário