fbpx

Expandindo as portas digitais da Franzininho DIY usando o registrador de deslocamento CI74HC595

A Franzininho DIY (Figura 1) é uma placa microcontroladora baseada no ATtiny85, compatível com o Arduino Gemma, desenvolvida pelo brasileiro Fábio Souza.

Figura 1 – Franzininho DIY.

Ao contrário de muitas placas microcontroladoras existentes no mercado, a Franzinho DIY vem totalmente desmontada (Figura 2), o que a torna ideal para quem está iniciando no mundo maker. Assim, é possível aprender a soldar e programar.

Figura 2 – Peças para montagem da Franzininho DIY.

A Franzininho DIY possui 5 pinos I/O, LED indicador de alimentação, LED de uso geral, conector USB para alimentação e gravação, conector para alimentação externa e botão de Reset. A descrição de pinagem pode ser observada na Figura 3.

pinagem Franzininho DIY
Figura 3 – Pinout da Franzininho DIY.
Fonte: Franzininho, 2021.

Para saber mais sobre a placa Franzininho DIY clique aqui!

Neste tutorial, aprenderemos como expandir as portas digitais da placa Franzininho DIY usando o CI74HC595.

O circuito integrado 74HC595 (Figura 4) é um tipo de registrador de deslocamento Serial-Paralelo de 8 bits. Este CI é comumente utilizado para expandir as portas dos microcontroladores, já que cada microcontrolador tem um número limitados de pinos de entrada e saída. Por exemplo: Se um projeto requer o controle de 8 LEDs individualmente, isso significa que normalmente será necessário o uso de 8 portas do microcontrolador. Usando o CI 74HC595 é possível controlar os 8 LEDs usando apenas 3 portas digitais.

A imagem mostra de maneira real uma foto de circuito integrado 74HC595
Figura 4 – Circuito integrado 74HC595.

Para saber mais sobre o CI74HC595 clique aqui!

Neste projeto, usaremos o CI74HC595 para acionar 8 LEDs usando apenas 3 portas da placa Franzininho DIY.


MATERIAIS NECESSÁRIOS


ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES

Monte o circuito utilizando a protoboard, o registrador de deslocamento, os LEDs, os resistores e os fios, conforme a Figura 5.

Figura 5 – Esquemático de ligação dos componentes.

Ao montar seu circuito observe os seguintes pontos:

  • Localize o chanfro em forma de U no CI75HC595. Quando voltado para cima, os pinos de 1-8 ficarão do seu lado esquerdo de cima para baixo e os pinos 9-16 estarão localizados a sua direita de baixo para cima;
  • Conecte o CI74HC595 no centro da protoboard, no espaço vazio para encaixe de circuitos integrados, garantindo que cada lado do CI esteja em um lado da protoboard;
  • Os pinos 15, 1, 2, 3, 4, 5, 6 e 7 são os pinos de saída. Deste modo, devem ser conectados aos LEDs;
  • Os pinos 8 e 13 devem ser conectados ao GND;
  • Os pinos 16 e 10 dever ser ligados a alimentação de 5V;
  • O pino 11 do CI74HC575 deve ser conectado ao pino 2 da placa Franzininho DIY;
  • O pino 12 do CI74HC575 deve ser conectado ao pino 1 da placa Franzininho DIY;
  • O pino 14 do CI74HC575 deve ser conectado ao pino 0 da placa Franzininho DIY;

ELABORANDO O CÓDIGO

Após a montagem do circuito, vamos a programação do Sketch. Acompanhe os passos a seguir para melhor compreensão da lógica de programação:

1. Declarar as variáveis
Iniciamos a programação, declarando quatro variáveis:

  • dadosPin: responsável por alimentar os dados no registrador de deslocamento (entrada serial);
  • latchPin: responsável por setar o latch do registrador de deslocamento;
  • clockPin: responsável pelo clock do registrador de deslocamento;
  • leds: responsável por armazenar o padrão de quais LEDs serão ligados ou desligados. Esta variável será do tipo byte, que representam números positivos usando oito bits (de 0 a 255);

2. Criar a função atualizarRegistrador()
A função atualizarRegistrador() ficará responsável por envia ao registrador de deslocamento o valor da variável leds. Para tal, precisamos inicialmente setar o latch do registrador de deslocamento como nível baixo (LOW) e, em seguida, chamar a função shiftOut() para deslocar os bits da variável leds.

A função shiftOut() recebe 4 parâmetros, iniciando com os pinos definidos nas variáveis dadosPin e clockPin. O terceiro parâmetro especifica em qual extremidade os dados deverão ser deslocados, mais à esquerda (mais significativo – MSB) ou mais à direita (menos significativo – LSB). Vamos começar com o bit mais à direita (LSB). O quarto parâmetro serão os dados a serem deslocados, em nosso exemplo leds.

3. Configurações iniciais
Na função setup(), configuraremos todos os pinos como saída (OUTPUT).

4. Desligar todos os LEDs
Iniciamos a função loop() definindo a variável leds como 0. A função atualizarRegistrador() será chamada para enviar o valor de leds (00000000) para o registrador de deslocamento, fazendo com que todos os LEDs se apaguem.

5. Ligar os LEDs de forma crescente
Usaremos a estrutura de repetição for como um contador incremental da variável i (de 0 a 7). A cada incremento, chamaremos a função bitSet() para definir como ‘1’ um bit da variável leds. Por exemplo, na primeira repetição do for a variável i será igual a 0, então o bit da posição 0 da variável leds será definido como 1, ficando 00000001. Em seguida, chamaremos a função atualizarRegistrador() para que o novo valor de leds seja enviado para o registrador de deslocamento. Incluiremos também um intervalo de meio segundo até que i apenas seja incrementado novamente.

6. Desligar os LEDs de forma decrescente
De forma semelhante, utilizaremos a estrutura de repetição for como contador da variável j, mas de forma decremental (de 7 a 0). A cada decremento, chamaremos a função bitClear() para definir como ‘0’ um bit da variável leds. Por exemplo, na primeira repetição do for a variável leds será 11111111 e j será igual a 7, então o bit da posição 7 da variável leds será definido como 0, ficando 01111111.

int dadosPin = 0; //Pino Dados do CI conectado ao pino 0 do Franzininho DIY
int latchPin = 1; //Pino Latch do CI conectado ao pino 1 do Franzininho DIY
int clockPin = 2; //Pino Clock do CI conectado ao pino 2 do Franzininho DIY

byte leds; //Variável para armazenar o padrão de quais LEDs serão ligados ou desligados

void atualizarRegistrador() {
  digitalWrite(latchPin, LOW); //Define o latch em nível lógico baixo
  shiftOut(dadosPin, clockPin, LSBFIRST, leds ); //Desloca um bit de leds iniciando pelo menos significativo
  digitalWrite(latchPin, HIGH); //Define latch em nível lógico alto
}

void setup() {
  //Configuração dos pinos como saída
  pinMode(dadosPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop() {
  leds = 0; //Inicializa a variável leds como 0, desligando todos os LEDs
  atualizarRegistrador(); //Chama a função atualizaRegistrador()

  for (int i = 0; i < 8; i++) { //Contador incremental de 0 a 7
    bitSet(leds, i); //Seta '1' no bit i da variável leds
    atualizarRegistrador(); //Chama a função atualizaRegistrador()
    delay(500); //Intervalo de 500ms
  }

  for (int j = 7; j >= 0; j-- ) { //Contador incremental de 0 a 7
    bitClear(leds, j); //Define '0' no bit j da variável leds
    atualizarRegistrador();//Chama a função atualizaRegistrador()
    delay(500); //Intervalo de 500ms
  }
}

Após a transferência do código, o projeto funcionará da seguinte maneira:

Vídeo 1 – Expandindo as portas do Franzininho DIY.

A simulação do circuito encontra-se disponível no Wokwi, caso deseje visualizar clique aqui.

Espero ter ajudado,

Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!

Att. Carol Correia Viana

Dúvidas? Deixe seu comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.