Push button no Arduino com filtro de Bouncing

Por: Ricardo B. Morim e Diego J. Stefanello

 

Botões de pressão, ou push button em inglês, são um meio de interface entre o usuário e a máquina, convertendo os comandos mecânicos em sinais elétricos.

Neste artigo vou lhe mostrar como realizar a leitura de botões utilizando uma placa Arduino Uno. Vou mostrar também como utilizar um filtro de Bouncing para eliminar os ruídos que surgem no acionamento do botão.

 

 Como funcionam as chaves de pressão?

Um botão de pressão (push button) é uma chave que contém um botão que, ao ser pressionado, abre ou fecha os contatos do dispositivo, abrindo ou fechando o circuito onde ele está conectado.

É comum que um push button possua ação de contato momentânea, o que significa que a conexão é aberta ou fechada apenas momentaneamente, enquanto o botão estiver sendo pressionado.

Um dos modelos mais comuns é mostrado na Figura 1.

 

Figura 1: Alguns tipos de botões de pressão (push button).

Os push buttons possuem um mecanismo com mola e contatos elétricos. Normalmente o contato elétrico está aberto, isto é, bloqueando a passagem de corrente elétrica. Quando o botão é acionado pelo usuário, o contato elétrico é fechado, de modo que a sua resistência elétrica se torna muito baixa, próximo de zero Ohm. Assim, é fechado o circuito para a passagem de corrente elétrica.

A forma de utilização mais comum de um botão com o Arduino é para mudar o nível lógico de um pino, quando acionado. Em geral, o pino do Arduino está em nível lógico alto (5V) e é levado ao nível lógico baixo (0 V) quando o botão é pressionado.

A representação em esquema elétrico deste sistema é mostrada na Figura 2.

Figura 2: Botão ligado a um pino do Arduino.

O resistor R2 impõe nível lógico alto a entrada do Arduino enquanto o botão S1 não é acionado. Quando o botão S1 é pressionado, os seus contatos fecham o circuito entre o pino de entrada do Arduino e o 0 V. Assim, é imposto nível lógico baixo e uma pequena corrente elétrica, limitada por R2, circula através do botão S1.

O Resistor R2 geralmente fica entre 1kΩ e 4,7kΩ. Valores abaixo disso drenam corrente em “excesso” da fonte e valores acima disso, podem captar muitos ruídos do ambiente.

 

 Efeito Bouncing, o terrível.

Quando trabalhamos com um circuito que envolve chaves mecânicas, tem-se o surgimento de um efeito conhecido como “bouncing”. Basicamente, isto apresenta-se como um pequeno problema em nosso circuito, já que esse tipo de efeito pode indicar equivocadamente, que ocorreram diversos acionamentos em um pequeno intervalo de tempo. Algo como uma “trepidação” no nível logico do pino do Arduino.

 

Figura 3: Efeito bouncing, ao pressionar o push button.

A imagem 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. Essas oscilações rápidas podem gerar acionamentos indevidos no software, interpretando como varias pressionadas rápidas na chave, ao invés de apenas uma.

 

 Solucionando o problema!

Existem duas formas de eliminar esse problema: por hardware ou por software.

 

  Solução via hardware

A opção de debouncing por hardware pode ser implementada de diversas formas. Uma das mais simples pode ser visualizada na Figura 4.

 

Figura 4: Filtro RC, para evitar o efeito bouncing.

Neste circuito, o capacitor C1 desempenha o papel de amortecedor do sinal. Um circuito com um resistor e um capacitor possui um tempo de atraso para o sinal. Este é o tempo necessário para carregar o capacitor. Deste modo as alterações rápidas no sinal, devido à oscilação mecânica da chave, são filtradas e não ocorre o problema dos chaveamentos indevidos, como pode ser visto na figura 5.

 

TOT push button arduino RC deboucing

Figura 5: Resultado do uso do filtro RC.

 

  Solução via software

A solução via software é muito utilizada, pois são usados menos componentes (custo menor) e também porque muitas vezes é difícil implementar a solução via hardware (depois da placa já montada ou é de difícil acesso). 

Para realizar o debouncing por software precisamos ter uma noção do tempo que a chave precisa para estabilizar. Na figura 3, temos que este tempo, para uma determinada chave, é de aproximadamente 150 microsegundos. É necessário portanto esperar pelo menos este tempo antes de ter certeza que as mudanças no sinal já terminaram, ou seja, a fase de bouncing acabou.

Então, para realizar o filtro por software, vamos utilizar um contador digital. Com este contador, nós estipulamos um número de contagens de leituras para confirmar o estado lógico do botão. Para esclarecer melhor, fiz um fluxograma, que você pode ser na Figura 6.

Figura 6: Fluxograma da leitura do botão.

De acordo com este fluxograma, cada vez que o programa do Arduino identifica que o botão foi pressionado, ele vai para um loop no qual realiza o teste por N vezes. Isto é, o programa faz várias confirmações, espaçadas por um pequeno tempo. Caso o botão permaneça acionado em todas estas confirmações, é porque ele realmente foi acionado pelo usuário.

 


Colocando a teoria em prática

Chegou o momento da diversão. Para a montagem você vai precisar dos seguintes itens:

  • Arduino Uno
  • Fios Jumper’s
  • Protoboard
  • Pushbutton

Montando o circuito

Monte seu circuito conforme a Figura 7. Certifique-se que ele esteja desligado durante a montagem.

 


Figura 7: Circuito teste deboucing com pushbutton

Utilizando o Arduino Uno e um botão, vamos simplesmente ligar ou desligar o LED da placa do Arduino quando o botão é pressionado.

Neste programa utilizamos o recurso de pull-up interno do microcontrolador do Arduino. Assim, não é necessário utilizar o resistor R2 da Figura 2.

 

O que este código faz é monitorar o botão, que é ligado ao pino 12 do Arduino. Quando o botão é pressionado, ele aplica o filtro para eliminar os ruídos de leitura. 
Esse filtro é apenas para o acionamento do botão. Se o problema acontecer no desacionamento também, o filtro pode ser adaptado para atuar na mudança de estado do botão, assim eliminará o boucing no acionamento e desacionamento.

 


Finalizando

Espero que tenha se divertido e conseguido aprender como funcionam as chaves de pressão e como usar o filtro deboucing. Entretanto se ficaram duvidas, não deixe de perguntar.

Compartilhe suas experiências conosco!

2 thoughts on “Push button no Arduino com filtro de Bouncing”

  1. Vocês poderiam escrever sobre como eliminar resets do Arduíno, quando se usa reles pra acionar cargas grandes. Tenho problemas com isso.

E aí, gostou? Opine. Assim poderemos melhorar.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *