Multiplexação com shift register 74HC595 e Arduino

Multiplexar é uma forma de fazer persistência de visão, que é o atraso entre o evento e a percepção desse evento pelo nosso cérebro. Decidi escrever de forma sucinta e dedicada sobre esse assunto porque caminhamos para um novo projeto bacana (se der certo como deu o PID) e a multiplexação é o princípio desse objetivo.

Normalmente displays de 7 segmentos e 4 digitos são multiplexados, auxiliando assim na economia dos recursos utilizados na microcontroladora, uma vez que poucos pinos serão necessários com a ajuda de um CI conhecido por shift register. Dentre os existentes, utilizaremos o 74HC595 para exemplificar.




Como funciona a multiplexação

Essa técnica consiste em ligar e desligar alternadamente os LEDs receptores de forma tão rápida que não há tempo suficiente para o nosso cérebro processar a mudança de estado. Assim, a impressão é que determinada sequência está simultaneamente acessa. Esse é um ótimo exemplo de multiplexação (usando PWM pra controlar a luminosidade):

(acendimento de 1 digito por vez)

(em uso multiplexado, sem percepção visual)

Para controlar esse display apenas 7 pinos do Arduino foram utilizados. Se todos os segmentos fossem ligados de forma independente, seriam necessários 29 pinos!

Em relação ao display, é importante saber que existem displays de 2 tipos, atente-se ao tipo desejado quando for adquirí-los. Um deles tem anodo comum, outro tem o catodo comum. Isto é, se tiverem anodo comum, apenas 1 pino de tensão positiva é necessário para manter o display; se o catodo for comum, apenas um GND é necessário para aterrar o display. Isso faz diferença e também depende da sua implementação. Aqui vamos ver os 2 tipos de display para reforçar a ideia.

Como funciona o 74HC595 (sem cascata)

Você pode fazer cascata e assim expandir o controle. No exemplo será utilizado apenas 1 CI com display de 7 segmentos e com um display de 4 digitos, como o do video acima.

Primeiramente, vejamos o CI:

74HC595 pinout
74HC595 pinout

Dependendo do datasheet ou da representação gráfica do CI, ele pode ter diferentes descrições, mas a pinagem é a mesma.Vamos ver somente os pinos que serão utilizados, para manter o foco no funcionamento. Basicamente, 3 pinos serão necessários para fazer o controle de deslocamento de bits:

Quando o CI for receber dados (obviamente em ‘data’), segue-se a seguinte rotina:

– Baixar a trava (latch)
– Baixar o clock
– Escrever o bit em data

Escrever o bit em data significa que se for 1, você coloca em HIGH, se for 0, coloca em LOW e em seguida:

– Levanta o clock
– Baixa o clock
– Escreve o próximo bit

Esse simples procedimento será exemplificado no código mais adiante, mas primeiramente o wiring com um Arduino:

74hc595-7seg_bb

Basicamente, considere fonte de alimentação externa, mas jamais um pino digital. Isso porque o pino digital de uma microcontroladora (seja qual for) tem uma corrente limitada; o Arduino oferece 40mA por pino, por exemplo. Considerando um LED de 5mm, apenas 1 pode consumir até 25mA (dentro da normalidade de uso). Ou seja, 2 LEDs drenariam mais do que a MCU pode oferecer. Tendo isso claro, sigamos.

O pino 10 está conectado ao clock, identificado na imagem por SRCLK. O latch (ou RCLK) está conectado ao pino 9. Por fim, o pino Data (ou SER) está conectado ao pino 8 do Arduino. Esse parágrafo é apenas para situá-lo no código. Quanto a conexão ao 74HC595, basta seguir as imagens descritivas anteriores.

Agora, utilizando um display de 7 segmentos, vamos comprovar o efeito da multiplexação. Vamos deixar claro que ligamos aqui 7 pinos do display, cada qual ao respectivo pino do 74HC595. Logo, para acender qualquer valor no display não é necessário multiplexar, mas se assim fosse não seria possível exemplificar agora mesmo o recurso pretendido. O que será feito então é escrever os 7 bits 6 vezes e em cada vez acender um dos segmentos das bordas, de forma a ver seu deslocamento em sentido anti-horário, acelerando gradativamente até que não se perceba mais a mudança de estado e então será visto apenas um ‘0’ constante no display, ainda que fazendo a escrita dos 7 bits, 1 segmento por vez.




Para que você possa fazer o teste, disponho abaixo o código para essa etapa do teste (e tem mais dicas, não abandone o texto):

 

Certamente já está mais do que provado o conceito, se você chegou nesse ponto. Agora um breve raciocínio; foi acesso um segmento por vez porque o propósito era provar o conceito de multiplexação, mas para acender um único display de 7 segmentos, não é necessário multiplexar, uma vez que o registrador tem 7 bits disponíveis, certo? Bem, então fica mais claro que para acender um display de 4 digitos, basta deslocar os dígitos diretamente, não é necessário trabalhar isoladamente cada um dos segmentos.




O display de 4 digitos foi exemplificado utilizando um contador nesse outro post, mas como eu não estava falando diretamente do recurso de multiplexação, resolvi escrever um post específico e referenciá-lo aqui.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Próximo post a caminho!

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta