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

Aprenda a utilizar o Sensor Vazão de Água com Arduino

por autocore
7 anos ago

Crie projetos com STM32 utilizando a IDE Arduino

por Oderlando Silva
1 ano ago

Funcionamento Resistores Pull-Up e Pull-Down

por Danilo Nogueira
6 anos ago