Corrigindo o efeito bouncing com Arduino
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? 👀
- Se o resistor estiver conectado ao terra, então é chamado de pull-down (down = baixo = GND).
- Se o resistor estiver conectado ao Vcc, então é chamado de pull-up (up = alto = VCC).
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:
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.
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!