Registrador de deslocamento

Neste tutorial, você irá aprender a aumentar o número de portas do seu micro controlador (MCU) usando um registrador de deslocamento 74HC595 (Shift Register). Funciona com qualquer MCU: ATtiny85, Arduino, PIC, ESP8266, ESP32, Raspberry, Onion, etc. Usaremos neste tutorial um ATtiny85 para controlar 8 LEDs apenas com 3 pinos do MCU!

 

O que são?

Dentro de um registrador de deslocamento há diversos Flip-Flops interligados que de tal forma, consegue converter sinais de um tipo para outro (Serial-Paralelo/Paralelo-Serial) ou até mesmo para expansão de portas de um micro controlador.

Usaremos o 74HC595, um registrador de deslocamento Serial-Paralelo de 8bits, isto significa, que cada registrador irá controlar até 8 componentes. Também é possível liga-los em modo cascata, um após o outro. Com isto, podemos ligar diversos registradores e usando apenas 3 pinos, controlar 40, 80, 160 componentes e assim por diante. Este registrador tem apenas pinos de saída, caso seja necessário leitura de botões (input de dados), procure por outros, existem até alguns com comunicação I2C!

Para mais informações sobre registradores de deslocamento, clique AQUI.

Datasheet do 74HC595.

As aplicações para um registrador de deslocamento são bem variadas, pode tanto fazer a conversão de dados Seriais para Paralelo, Paralelo para Serial, ou quando é necessário mais pinos para nosso MCU. Com 5 registradores de deslocamento de 8 bits em cascata, usamos 3 pinos do MCU para controlar até 40 componentes! Perfeito para matrizes de LED 3D ou robôs com vários atuadores.

Fig 1 – Matriz de LED 3D.

Mãos à obra

Componente necessários

Para este tutorial, usaremos um ATtiny85, mas você pode usar qualquer MCU.

Montando o projeto

Agora vamos conectar os componentes do projeto. Monte seu circuito conforme a figura a seguir. Não se esqueça de ler a explicação do hardware logo abaixo.

 

 

Veja como ficou o nosso:

 

Código do projeto

/*
Pino 0 = Clock.
Pino 1 = Latch.
Pino 2 = Serial IN.
*/

void setup()
{
   for (byte i = 0; i < 3; i++)//Declaração dos pinos de saida.
   {
      pinMode(i, OUTPUT);
   }

   int x = 1;
   for (byte i = 0; i < 8; i++)//Ligamos um LED após o outro, permanecendo o estado do anterior.
   {
      s595(x);//Função que faz o gerencimento do registrador.
      x = (x * 2) + 1;//Conta binaria que faz BitShift: 0b001 -> 0b011 -> 0b111...
      delay(150);
   }
}

void loop()
{
   s595(random(0, 256));
   delay(500);
}

void s595(byte data)//O argumento para acender os LEDs pode ser em binario
{
   digitalWrite(1, LOW);//Fecha o Latch para input de dados.
   shiftOut(2, 0, LSBFIRST, data);//Função própria da Arduino IDE.
   digitalWrite(1, HIGH);//Abre o Latch para output dos dados.
}

Entendendo a fundo

Software

 

-Função s595()

void s595(byte data)
{
    digitalWrite(1, LOW);//Fecha o Latch para input de dados.
    shiftOut(2, 0, LSBFIRST, data);//Função própria da Arduino IDE.
    digitalWrite(1, HIGH);//Abre o Latch para output dos dados.
}

Esta função criada faz todo o gerenciamento do registrador de deslocamento.

Primeiramente fechamos o Latch para a entrada de novos valores, após a entrada dos valores pelo shiftOut(), abrimos o Latch para que as saídas sejam iguais ao dados que definimos com a entrada anterior.

Para entender melhor sobre a função shiftOut(), clique AQUI.

O legal desta função é que podemos usar diretamente binário para representar os LEDs, por exemplo:

s595(0b11001100);

Com isto, os LEDs serão idênticos ao binário, respectivamente Q0 -> Q7. As saídas Q0, Q1, Q4 e Q5 estarão em HIGH e o restante em LOW.

Hardware

Pinos necessários para o registrador funcionar. Adicione MR ao Vcc  e  OE ao GND.

O nosso registrador de deslocamento usado, tem 3 pinos básicos: Serial data IN, Latch e Clock.

  • Serial data IN: Aqui é adicionado os bit’s para futuramente após o latch, virarem output.
  • Output Enable (OE): Ativo em LOW.
  • Latch: O latch funciona como se fosse um portão. quando em HIGH, o portão se abre, liberando os bit’s que adicionamos anteriormente.
  • Clock: O clock deve ser oscilado a cada bit de entrada, para que sejam armazenados corretamente.
  • Master Reclear (MR): Ativo em LOW.
  • Q7′: Este pino é usado para a ligação em cascata de mais registradores de deslocamento.
  • Q0 a Q7: São as saídas do registrador, use elas normalmente como se fossem pinos de saída, obedecendo os limites de tensão e corrente.

 

A figura abaixo mostra o efeito do Serial+Clock

Após a conclusão da entrada de dados, ao abrir o Latch, os pinos marcados com 1, ficarão em HIGH, e pinos com 0, em LOW. Então se usarmos “0b10010011”, as saídas (Q0 até Q7) ficarão respectivamente: 1, 0, 0, 1, 0, 0, 1, 1.


Desafio

Primeiramente, veja qual LED acende com s595(0b10000000);  e depois dentro da função s595(), troque “LSBFIRST” para “MSBFIRST“, veja qual LED acende e nos conte porque isto acontece!

Finalizando

Em alguns projetos, como matrizes de LED 3D, é necessário o uso de MUX e registradores de deslocamento, uma vez que nosso MCU não tem pinos suficientes para fazer o controle de cada componente. Com este simples e eficiente componente, podemos controlar diversos outros com poucos pinos do MCU, deixando os outros pinos do MCU livres para tarefas mais complicadas.

Privacy Preference Center