Manual
do
Maker
.
com
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.
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):
(https://youtu.be/sLlhRam9Axo)
(https://youtu.be/sOdMPKRTWb0)
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 adquiri-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.
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 dígitos, como o do video acima.
O CI é esse da imagem em destaque, para referência de 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:
pinMode(clock,OUTPUT);
pinMode(latch,OUTPUT);
pinMode(data,OUTPUT);
Quando o CI for receber dados (obviamente em 'data'), segue-se a seguinte rotina:
Escrever o bit em data significa que se for 1, você coloca em HIGH, se for 0, coloca em LOW e em seguida:
Esse simples procedimento será exemplificado no código mais adiante, mas primeiramente o wiring com um Arduino:
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):
#define CLOCK 10
#define LATCH 9
#define DATA 8
int shift = 0;
int myArray[7] = {1};
int myDelay = 300;
void clear(){
for (int j = 0; j<7;j++){
myArray[j] = 1;
}
}
void setup(){
pinMode(CLOCK,OUTPUT);
pinMode(LATCH,OUTPUT);
pinMode(DATA,OUTPUT);
}
void loop(){
if (shift > 6) shift = 0;
clear();
myArray[shift] = 0;
digitalWrite(LATCH,LOW);
for (int i = 0; i < 7; i++){
digitalWrite(CLOCK,LOW);
digitalWrite(DATA,myArray[i]);
digitalWrite(CLOCK,HIGH);
}
digitalWrite(LATCH,HIGH);
shift+=1;
myDelay = myDelay < 5 ? 1 : myDelay-1;
delay(myDelay);
}
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 dígitos, 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.
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.