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.
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.
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.
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.
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
- 1 x Placa Franzininho DIY;
- 1 x Protoboard;
- 1 x Registrador de deslocamento CI74HC595;
- 8 x LED difuso de 5mm;
- 8 x Resistores de 1 kΩ;
- Fios de jumper macho-macho.
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.
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:
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!
Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.