Manual

do

Maker

.

com

Multiplexação com shift register 74HC595 e Arduino

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):

(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.

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 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:

  • 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-1-300x203.webp

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);     
}

https://youtu.be/L6ICKH8CcTQ

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!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.