Corrigindo o efeito bouncing com Arduino

corrigindo-o-efeito-bouncing-com-arduino
Font Size

Olá, tudo bem? Hoje vamos estar corrigindo o efeito bouncing nos projetos com Arduino. Este efeito, ocorre muito em circuitos que utilizam botões. Isso porque, hoje em dia, botões são a maneira mais fácil de fazer com o que o ser humano e a máquina 🤖 possam se interagir. 

Contudo, quando estamos trabalhando com um circuito que envolve essas chaves mecânicas, acontece o surgimento de um efeito indesejável conhecido como “bouncing”.

Porque o bouncing se torna indesejável? 🤔

Basicamente, porque ele se apresenta como um pequeno problema em nosso circuito. Uma vez que que ele pode indicar equivocadamente acionamentos que não ocorreram realmente, e tudo isso em um pequeno intervalo de tempo 😨 

O Efeito Bouncing 🙌

Vamos então buscar entender o que provoca esse efeito e como corrigir. Para começar, vamos construir um circuito bem simples, um circuito muito utilizado para acionamentos simples de chaves. Neste circuito, iremos envolver uma chave mecânica (o conhecido botão) e um resistor de 10K. Aqui o resistor é conhecido como resistor de pull-down e não um resistor de pull-up.

Qual a diferença entre eles?

A diferença entre eles já foi abordado no blog, e caso você queira saber mais detalhadamente sobre eles basta clicar no link abaixo:

Caso já tenha visto, aqui vai uma relembrada, observe a imagem abaixo:

Resistor Pull-Up // Pull-Down

Fonte: AutoCore Robótica

Você conseguiu observar a diferença? 👀

Assim, em nosso circuito estamos utilizando um resistor de pull-up maravilha? Ou seja, isto significa que no momento inicial, sem pressionar o botão, o valor que temos no pino conectado ao circuito será nível lógico alto, pois este está atrelado ao nosso resistor que vai para o Vcc. Tudo certo até aqui? 🤙

Mas os pressionarmos o nosso botão, estaremos fazendo uma ligação direta com o terra. Como não há nenhuma tipo de resistência no caminho, nosso pino então possuirá o valor de nível lógico baixo.

Mas é na hora de pressionar o botão, que o abençoado do bouncing dá as caras 🤦 e provoca esse efeito aqui mostrado abaixo:

Diagrama de tempo do efeito bouncing

Fonte: Arduino e Cia

Mas que raios é isso? 🤯

Bom, uma imagem vale mais que mil palavras correto? Então ela já diz tudo. Como você pode ver, esse efeito é caracterizado por “idas” e “vindas”, do nível lógico alto e o nível lógico baixo, antes de efetivamente estabilizar no 5V ou 0V.

Mas agora imagine essas oscilações rápidas gerando acionamentos indevidos no nosso programa, já imaginou o tamanho do problema? 🤔 Isso é o efeito bouncing, ele faz com que o circuito intérprete que você pressionou rapidamente várias vezes o botão, quando na verdade foi apenas uma vez!

Será que tem solução esse efeito? 😧

Claro que tem e o remédio chama-se Debouncing 🙌. São duas formas aliás de fazer debouncing, por meio de software ou hardware, então vamos lá aprender como fazer o debouncing.

Debouncing

Utilizando Software 💻

O debouncing por meio de software é realizado utilizando um pequeno atraso no código (o conhecido delay), que seria o tempo suficiente para que a etapa do efeito bouncing passasse, e desta forma minimizar esse problema.

Componentes utilizados

Circuito do Projeto

Observe o circuito abaixo com o resistor pull-up falado lá em cima 👆 lembra?
MAS NÃO SE ESQUEÇA: FAÇA TODAS AS LIGAÇÕES COM SEU ARDUINO DESCONECTADO DA ALIMENTAÇÃO.

Ligação do circuito no Arduino

Fonte: AutoCore Robótica

Código do Projeto Comentado

O código que iremos utilizar está logo abaixo e ele está todo comentado, o que facilita seu entendimento. Maravilha?

/*
      --------- AutoCore Robótica ----------
      Projeto Efeito Bouncing
      Data: 17/08/2018
      Obs: Exemplo Deboucing retirado do site oficial do Arduino
*/
const int buttonPin = 2; // Porta onde a chave está conectada
const int ledPin = 13; // Led na porta 13

int buttonState; // O valor atual da chave no circuito
int ledState = HIGH; // Estado atual do pino do led
int lastButtonState = LOW; // O valor prévio da chave no circuito

long lastDebounceTime = 0; // Variável utilizada na temporização
long debounceDelay = 30; // tempo para estabilizar e minimizar o efeito bouncing
void setup()
{
pinMode(buttonPin, INPUT); // Define o botão ou chave como entrada
pinMode(ledPin, OUTPUT); // Define o led como saída
digitalWrite(ledPin, ledState); // Define estado atual do led
}

void loop(){

// faz a leitura da chave e armazena na variável
int reading = digitalRead(buttonPin);

// Verifica se houve alterações com o valor prévio da chave
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Reinicia a variável de temporização
}
if ((millis() - lastDebounceTime) > debounceDelay) {

// Depois de esperar o tempo especificado no começo, verifica se o estado atual da chave mudou
if (buttonState == HIGH) {
ledState = !ledState;
}
}

// Atribui o valor para o led
digitalWrite(ledPin, ledState);

// Atualiza a variável com o valor lido na chave
lastButtonState = reading;
}

Utilizando Hardware 📟

Uma das alternativas que eu mais utilizo é de simplesmente adicionar um capacitor (de no mínimo 10mF) ao circuito. Isso porque o capacitor irá atenuar (acalmar aquele “vai e vem” do sinal), sendo que a malha resistor/capacitor irá gerar um tempo de atraso no circuito (o delay que nós buscamos).

Devido a esse tempo, isso fará com que as rápidas oscilações indesejadas sejam atenuadas. Na imagem abaixo você pode ver como vai ficar o circuito no qual a saída out é conectada ao nosso pino 2 do Arduino.

Circuito de debouncing com capacitor

Fonte: AutoCore Robótica

Bom, por hoje foi isso, busquei explicar e trazer algumas soluções para te ajudar a resolver esse problema. Então caso tenha ficado algo incompleto para você, comente abaixo 📝 que irei te responder rapidão, pode confiar!

Dicas? 😯 Dúvidas? 🤔 Idéias de post?💭 Críticas? 😱 Só comentar abaixo ok? 😉

Forte abraço!

Posts relacionados

Integrando teclado matricial, DHT22 e Display LCD

por autocore
8 anos ago

Conhecendo o Arduino Lilypad e os Circuitos Vestíveis

por Luan Fernandes
3 anos ago

Como utilizar as diretivas de compilação no Arduino?

por Danilo Nogueira
6 anos ago
Sair da versão mobile