Codificação compatível com Arduino 10: Multiplexação de sete segmentos usando Arduino e MAX7219

No tutorial anterior, aprendemos como fazer a interface de um display de sete segmentos com o Arduino. Um display de sete segmentos é composto por uma unidade de oito LEDs, sete dos quais são em forma de barra e um é um ponto. Essas unidades de exibição são ideais para exibir números ou letras.

Por exemplo, eles são frequentemente usados ​​como uma unidade de exibição em aplicações sensíveis ao custo, onde um sistema embarcado pode exigir apenas informações numéricas, como um relógio digital ou uma placa de exibição de token. Esta opção normalmente é mais econômica do que monitores LCD completos.

No tutorial anterior, descobrimos que a interface de um único display de sete segmentos requer oito ou nove conexões. A unidade de sete segmentos só pode exibir um único dígito. Se forem necessários mais dígitos, serão necessários mais segmentos.

Se cada sete segmentos tiver interface independente com o controlador (como Arduíno), são necessários vários canais de E/S digitais. Geralmente, o número de pinos de E/S digitais em qualquer controlador é limitado. No entanto, muitos monitores de sete segmentos podem ter interface com um controlador usando a técnica de multiplexação.

Ao usar esta técnica, o número de pinos necessários para fazer a interface de vários segmentos de sete segmentos com um controlador pode ser bastante reduzido. Existem também vários CIs de driver de vídeo de sete segmentos que podem executar a técnica de multiplexação e usar interfaces seriais padrão para se comunicar com um controlador.

MAX7219 é um IC driver de LED que permite multiplexação de até oito monitores de sete segmentos. Ele usa uma interface SPI para se comunicar com o controlador. Desta forma, apenas três pinos do controlador são ativados para controlar oito dos monitores de sete segmentos. Caso contrário, a multiplexação direta exigiria pelo menos 16 pinos de E/S digitais.

Multiplexação de sete segmentos
Existem dois tipos de displays de sete segmentos: cátodo comum e ânodo comum.

Quando um único cátodo comum de sete segmentos faz interface com um controlador, o terminal de cátodo comum geralmente é conectado ao terra. Da mesma forma, quando um único ânodo comum de sete segmentos faz interface com um controlador, o terminal de ânodo comum é normalmente conectado ao VCC. Desta forma o sete segmentos está sempre ativo e pronto para ligar/desligar seus LEDs de acordo com o sinal lógico em seus pinos de dados (a, b, c, d, e, f, g e dp).

Com a técnica de multiplexação, múltiplos sete segmentos fazem interface com um controlador e as respectivas linhas de dados de todos os segmentos são encurtadas. Assim, quando o controlador transfere a lógica para ligar/desligar os segmentos, ela é passada para todos os sete segmentos ao mesmo tempo. No entanto, apenas uma unidade de exibição é ativada por vez.

Além disso, cada um dos sete segmentos multiplexados com um controlador deve ser do mesmo tipo (ou seja, todos devem ser ânodo comum ou cátodo comum).

Os terminais de ânodo comum ou cátodo comum são não conectado ao VCC ou ao terra. Em vez disso, eles fazem interface com os pinos do microcontrolador. Os terminais de ânodo comum ou cátodo comum dos sete segmentos servem como linhas selecionadas. Um dos segmentos pode ser selecionado passando a lógica relevante para os terminais cátodo comum/ânodo comum.

Se for ânodo comum, sete segmentos são multiplexados:

  • Um dos sete segmentos pode ser selecionado passando uma lógica HIGH para o terminal de ânodo comum que deve permanecer ativado por vez.
  • Todos os outros sete segmentos podem ser mantidos inativos mantendo uma lógica LOW em seus terminais de ânodo comum.
  • O dígito desejado pode ser exibido nos sete segmentos selecionados ligando os segmentos de LED apropriados simplesmente passando uma lógica LOW para as respectivas linhas de dados.

Da mesma forma, se o cátodo comum, sete segmentos são multiplexados:

  • Um dos sete segmentos pode ser selecionado passando uma lógica LOW para o terminal de cátodo comum que deve permanecer ativado por vez.
  • Todos os outros sete segmentos podem ser mantidos inativos mantendo uma lógica ALTA em seus terminais de cátodo comum.
  • O dígito selecionado pode ser exibido nos sete segmentos selecionados ligando os segmentos de LED apropriados passando uma lógica HIGH para as respectivas linhas de dados.

Os sete segmentos multiplexados podem ser vistos como uma matriz de LEDs agrupados por unidades de display de sete segmentos – cada unidade é ativada, uma após a outra. Os LEDs da unidade são controlados passando a lógica apropriada.

Apenas um sete segmentos é ativado por vez e o dígito desejado é exibido nele. Em seguida, o outro sete segmentos é ativado e o dígito selecionado é exibido nele. Isto continua para todos os sete segmentos multiplexados.

Se 25 quadros (ou mais) forem exibidos em um segundo, o olho humano verá os quadros como uma exibição contínua. Assim, os sete segmentos multiplexados aparecerão como se estivessem exibindo os dígitos simultaneamente.

CIs de driver de LED
Mesmo quando sete segmentos são multiplexados diretamente nos pinos de E/S digital de um controlador, eles envolvem muitos pinos. A interface de cada sete segmentos requer o envolvimento de um pino adicional no controlador. Isso sem contar os oito pinos já ocupados para as linhas de dados. Se os oito ou sete segmentos forem interligados ao controlador, serão necessários 16 pinos de E/S digital (oito para as linhas de dados e oito para as linhas de seleção).

No entanto, nem todos os microcontroladores possuem tantos GPIOs. E, mesmo que o façam, normalmente não é aconselhável usar tantos pinos para fazer a interface com um sistema de exibição. Isso ocorre porque outros componentes também podem exigir interface com o controlador.

A solução para este problema: CIs de driver de LED. Esses ICs realizam multiplexação em seus próprios canais/pinos, o que significa que os sete segmentos ou matrizes de LED podem ser controlados por meio de interfaces seriais padrão (como SPI ou I2C). Os ICs de driver de LED requerem apenas a obtenção de dados do controlador, usando a interface I2C ou um SPI de três fios.

O I2C permite comunicação de dados half-duplex em dois fios. Isso significa que um IC driver de display LED usando a interface I2C envolve apenas dois pinos de um microcontrolador para controlar vários dos displays de sete segmentos ou a matriz de LED.

O SPI de três fios permite a comunicação de dados unidirecional em três fios. Um IC driver de display LED usando um SPI de três fios envolve apenas três pinos de um microcontrolador para controlar vários dos displays de sete segmentos ou a matriz de LED.

O driver de LED de 8 dígitos MAX7219
MAX7219/MAX7221 é um driver de display LED de cátodo comum de oito dígitos. Permite a interface de um microprocessador ou microcontrolador com unidades de display de sete segmentos com até oito dígitos. Displays gráficos de barras e matrizes de 64 LED também podem ser interligados com um controlador/computador usando este IC.

O IC inclui:

  • Um decodificador BCD código B no chip
  • Um driver de segmento e dígito
  • Um circuito de varredura multiplex
  • Uma RAM estática 8×8 para armazenar até oito dígitos

O IC possui uma interface serial de 10 MHz que pode se comunicar com um controlador/computador através de um IPSum QSPI ou um MICROWIRE.

Ele opera com uma fonte de 5V 330mA e consome apenas 150 uA de corrente no modo desligado. Para operação em 3V, o MAX6951 pode ser usado. O MAX7219/MAX7221 suporta modo de desligamento, controle de brilho analógico e digital e modo de teste que força todos os LEDs a acenderem. Cada segmento de LED também pode ser controlado individualmente por este driver.

O MAX7219 vem em pacotes DIP e SO de 24 pinos, com o seguinte diagrama de pinos:

O MAX7219 possui este diagrama funcional:

O IC MAX7219 possui a seguinte configuração de pinos:

Multiplexação com Arduino usando MAX7219
É bastante simples multiplexar as unidades de exibição de oito e sete segmentos com um controlador/computador por meio do MAX7219/MAX7221.

  • Os pinos de dados dos sete segmentos devem primeiro ser conectados ao SEG A ao SEG G e aos pinos DP do MAX7219.
  • Os terminais cátodo comum dos segmentos devem ser conectados aos pinos DIG0 a DIG7 do MAX7219.
  • Os pinos 4 e 9 do IC devem ser conectados ao terra.
  • O pino 19 do IC deve ser conectado a 5V DC.
  • O pino 18 do MAX7219 também deve ser conectado a 5V DC através de um resistor adequado.
  • Os pinos DIN, LOAD e CLK do IC devem ser conectados aos pinos de E/S digital de um controlador/computador.

Uma interface SPI com Arduino
O barramento SPI é um barramento de dados serial síncrono mestre-escravo. Só pode haver um mestre em um barramento SPI e vários dispositivos escravos podem compartilhá-lo.

Um barramento SPI possui quatro fios:

1. Master Out Slave In (MOSI) — para transferência de dados do mestre para o escravo
2. Master In Slave Out (MISO) — para transferência de dados do escravo para o mestre
3. Serial Clock (SCK/SCLK) — para sinal de clock do mestre para o escravo
4. Slave Select (SS no Master)/Chip Select (CS no Slave) — para seleção do escravo pelo master

Alguns componentes eletrônicos requerem apenas a transmissão ou recepção de dados. Essas partes só podem ter um canal MISO ou MOSI. Alguns dispositivos usam um SPI de três fios, no qual o MISO e o MOSI são combinados com um fio, e são chamados de MIMO.

Um barramento SPI pode comunicar dados ao hardware através de um simples registrador de deslocamento. Os bits de dados são comunicados ininterruptamente e continuamente com cada bit transferido em cada pulso de clock.

A maioria das placas Arduino possui pelo menos uma interface SPI. O Interface SPI no Arduino UNO é mostrado aqui:

Como o MAX7219 funciona no barramento SPI
O IC MAX7219 requer um barramento SPI de três fios para comunicação de dados com um controlador/computador, onde o barramento possui apenas os pinos MOMI, CLK e SS/CS.

O IC possui um registrador de deslocamento interno de 16 bits onde os dados são transferidos de um controlador/computador quando há uma borda ascendente no pino LOAD do IC. Os dados transferidos para o IC através de um SPI possuem dois bytes.

  • O primeiro byte é o endereço de um registrador interno, que seleciona um dos registradores internos.
  • O segundo byte grava dados no registro interno selecionado.

Ao passar os dados de 16 bits para o IC, vários dígitos de sete segmentos – e recursos como controle de brilho, modo de teste e modo de desligamento – podem ser controlados.

O MAX7219 registra
O MAX7219 possui esses registros internos…

Registro autônomo – quando os dados são transferidos para este registro, nenhuma operação é executada nas unidades de exibição de sete segmentos do IC MAX7219 fornecido. Este registro é usado quando vários ICs MAX7219 são conectados em série.

Por exemplo, se quatro ICs MAX7219 estiverem conectados em série, para transferir dados para um quarto IC, os três primeiros ICs MAX7219 deverão ter dados gravados em seus registradores não operacionais. Este registro possui um endereço bXXXX0000 (0xX0).

DigitrRegistradores – usado para controlar os oito dígitos exibidos nas unidades de exibição de sete segmentos. Existem registros de oito dígitos que possuem endereços de bXXXX0001 (0xX1) a bXXXX0111 (0xX7).

Registro de modo de decodificação seleciona a operação BCD Code-B ou sem decodificação para cada dígito. Cada bit no registrador corresponde a um dígito. Uma lógica HIGH seleciona a decodificação do código B e uma lógica LOW ignora o decodificador. Este registro possui um endereço bXXXX1001 (0xX9).

Se o Código BCD-B for selecionado para um dígito, o decodificador apenas olha para o nibble inferior dos dados nos registradores de dígitos (D3–D0) — desconsiderando os bits D4–D6.

O bit D7 dos registradores de dígitos é independente. Se estiver definido como HIGH, ativa o ponto decimal. Caso contrário, se definido como LOW, desativa o ponto decimal.

O código BCD-B controla os dígitos de sete segmentos de acordo com a tabela a seguir:

Se nenhuma decodificação for selecionada, os bits de dados D7–D0 dos registradores de dígitos correspondem às linhas de segmento do MAX7219/MAX7221 conforme mostrado aqui:

Registro de intensidade controla o brilho dos segmentos. Possui um endereço bXXXX1010 (0xXA). Se um resistor com valor mínimo (9,53 kΩ) for conectado entre os pinos V+ e ISET, a corrente de pico fornecida aos segmentos será 100 vezes a corrente que entra no pino ISET. Esta corrente pode ser controlada digitalmente gravando dados no registro de intensidade.

O brilho da tela é controlado digitalmente por meio de um modulador interno de largura de pulso, que dimensiona a corrente do segmento em 16 etapas.

Este modulador de largura de pulso é controlado pelo nibble inferior do registro de intensidade, conforme tabela:

Registro de limite de varredura controla o número de dígitos exibidos pelo MAX7219/MAX7221. Possui um endereço bXXXX1011 (0xXB).

Os dígitos a serem exibidos são controlados de acordo com esta tabela:

Registro de desligamento se o LSB deste registro for definido como 0, o MAX7219/MAX7221 entra em modo shutdown e todos os dígitos são desligados. Este registro possui um endereço bXXXX1100 (0xXC).

Registro de teste de exibição se o LSB deste registro for definido como 1, o MAX7219/MAX7221 entra no modo de teste de display e todos os segmentos dos dígitos são ativados. Este registro possui um endereço bXXXX1111 (0xXF).

Controlando os sete segmentos através do MAX7219
Para controlar as unidades de exibição multiplexadas de sete segmentos por meio do MAX7219/MAX7221, o controlador/computador deve gravar dados nos registros internos do IC usando o barramento SPI, QSPI ou Microwire.

Os dados são passados ​​para o registrador de deslocamento interno de 16 bits do IC, onde o primeiro byte seleciona um registrador interno e o segundo byte grava os dados no registrador selecionado. Se as unidades de exibição de sete segmentos ou o IC precisarem ser testados, os dados poderão ser gravados para exibir o registro de teste (byte de endereço 0x0F). Ele confirmará se todos os dígitos de sete segmentos estão operacionais.

O brilho do display pode ser controlado gravando dados no registro de intensidade (byte de endereço 0x0A). O número de dígitos a ser usado pode ser implementado gravando dados no registrador de limite de varredura (byte de endereço 0x0B). Então, o modo de decodificação deve ser selecionado gravando os dados no registro do modo de decodificação (byte de endereço 0x09).

Os dígitos individuais podem então ser controlados gravando dados nos registradores de dígitos (endereços 0x01 a 0x08). Se o display precisar ser desligado, o MAX7219 pode ser forçado a entrar no modo de desligamento gravando dados no registro de desligamento (byte de endereço 0x0C).

Se mais de um IC MAX7219/MAX7221 estiver conectado em série, o registro não operacional (byte de endereço 0x00) poderá ser usado durante a transferência de dados entre os MAX7219s/MAX7221s conectados em série.

Receita: contador de exibição de sete segmentos usando Arduino e MAX7219

Nesta receita, projetaremos um contador numérico usando unidades de display de sete segmentos, um driver IC de LED MAX7219 e Arduino UNO. O contador contará de 0000 a 9999.

Componentes necessários

1. Arduino UNO x1
2. SSD x4
3. MAX7219 x1
4. Jumper ou fios de conexão

Conexões de circuito
É usado um módulo driver de sete segmentos baseado em IC MAX7219. Os pinos DIN, CLK e LOAD do IC são conectados aos pinos 12, 11 e 10 do Arduino UNO, respectivamente. O IC MAX7219 é fornecido com 5V DC e aterramento do Arduino.

Esboço do Arduino

Como funciona o projeto
As unidades de display multiplexadas de sete segmentos fazem interface com o IC MAX7219. O IC faz interface com o Arduino UNO através do barramento SPI. Usando a interface SPI do Arduino, 16 bits de dados são transferidos para o registrador de deslocamento do IC MAX7219.

Ao gravar dados nos registros internos do IC MAX7219, dígitos de sete segmentos são controlados para exibir um contador dos números 0000 a 9999

Guia de programação
O esboço do Arduino começa importando a biblioteca SPI. As variáveis ​​globais são definidas para atribuir números de pinos que estão conectados aos pinos DIN, CLK e LOAD do IC MAX7219. Uma variável do tipo array é definida para armazenar os comandos de 16 bits para o MAX7219.

Uma tabela de caracteres é armazenada na memória flash do Arduino UNO usando a construção PROGMEM. Esta tabela contém os bytes que devem ser escritos nos segmentos de LED para exibição dos dígitos de 0 a 9 e das letras de A a F.

Uma função spiTransfer é definida para que a função shiftOut transfira os dados de 16 bits para o IC MAX7219. Cada dado de 16 bits contém dois bytes. O primeiro byte é o endereço do registrador MAX7219 e o segundo byte são os dados a serem gravados em um registrador selecionado. Ambos os bytes são passados ​​como argumentos para esta função definida pelo usuário.

Uma função clearDisplay é definida, onde a função spiTransfer é usada para escrever 0x00 em todos os registradores de dígitos para limpar todos os dígitos. Uma função shutdown é definida, que usa a função spiTransfer para gravar dados no registro do modo shutdown do MAX7219.

Uma função init_7seg é definida para inicializar a exibição. Nesta função, os pinos MOSI, SCLK e CS são configurados para a saída digital. O pino CS está definido como HIGH para selecionar o MAX7219 no barramento SPI.

Um valor de 0x00 é transferido para o registro de teste de exibição (endereço de registro 15 ou 0x0F) usando a função spiTransfer para definir o MAX7219 para o modo normal. Um valor 0x07 é transferido para a varredura do registro limite (endereço de registro 11 ou 0x0B), permitindo o uso de todos os oito dígitos. Um valor de 0x00 é transferido para o registro do modo de decodificação (endereço de registro 9 ou 0x09) para selecionar “sem decodificação” para todos os dígitos.

É definida uma função setChar que grava um valor no registro de dígitos do MAX7219. Tanto o valor quanto o dígito são definidos como parâmetros da função. Nesta função, a validação dos dados do dígito e do valor passado é concluída. Em seguida, o valor verificado é passado para um determinado registro de dígito usando a função spiTransfer .

Na função setup , as funções init_7seg e shutdown(false) são chamadas. A função spiTransfer(10, 8) é chamada para definir a intensidade da exibição. A exibição é limpa chamando a função clearDisplay .

Na função loop , um “loop for” é executado para os valores de 0 a 9999. Para cada número, quatro dígitos são derivados usando operações aritméticas e os dígitos são exibidos nos sete segmentos multiplexados usando a função setChar . Cada número é incremental e exibido em um intervalo de 250 milissegundos. O intervalo é fornecido por meio da função delay .

No próximo tutorialabordaremos como fazer a interface do LCD de caracteres com o Arduino.

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.