Arduino, S2A, Tecnologia

Bounce e Debounce no Arduino e no Scratch

Escrito por: ­ 25 de nov de 2016 ­ 917 views

Você já reparou que muitas vezes em seu projeto eletrônico, seja com Arduino ou Scratch + Arduino, usando um botão (switch/push button) mesmo apertando uma única vez o microprocessador lê múltiplas vezes, como se você tivesse apertado mais de uma vez?
Imagine como seria se você quisesse fazer um contador, a cada aperto do botão ele poderia computar pressionadas a mais que o desejado.

Esse efeito é chamado de bounce (traduzindo para o português, seria algo como “ressalto” – mas em eletrônica é mais comum usar o termo original em inglês, portanto ficamos com o bounce [baʊns].
O efeito bounce é muito comum em chaves mecânicas, pois o contato de ferro com ferro, muitas vezes ocorre de maneira imprecisa, gerando ruídos  e uma simples “encostadinha” pode gerar um repique e desta forma o microprocessador irá ler o valor mais de uma vez.

HackEduca_Bounce_Effect

Exemplo do efeito Bounce

Um dia resolvi montar um projeto/jogo no Arduino junto com minha filha de 8 anos.
A ideia inicial era para acertar se o próximo número sequencial seria uma divisão exata por 2 ou por 3.

O LED Vermelho acenderia indicando que o número era divisível por 2, se fosse o divisível por 3, o LED Verde acenderia. Caso fosse divisível por 2 e 3 (no caso do número 6) ambos os LED acenderiam.

O primeiro protótipo (sem o visor LCD) era assim:

bounce debounce arduino projeto switch button botão scratch

O programa:

Montando o circuito acima e carregando o programa você já poderá ver o que é o efeito Bounce na serial do seu Arduino.

No exemplo foi apertado o botão 10 vezes Hackeduca Serial Bounce, no entanto foi computado 15 vezes.

Para o propósito desejado, esse programa não pode ser utilizado, pois a função de contagem que ele possui não pode é eficiente.
Existem, no entanto, algumas soluções para o caso, desde as mais simples até as mais complexas.

As opções mais simples estão relacionadas diretamente a modificação da programação (software), que por sua vez envolve uso de memória, outras envolvem hardware, que por sua vez são mais caras, elevando, desta forma o custo  do seu projeto.

Para projetos simples, software está OK.

 

Veremos a seguir como resolver esse caso:

A solução está no Debounce

Debounce é uma solução encontrada para compensar o erro na leitura. Como já citado anteriormente o contato ferro com ferro pode causar uma leitura dupla/tripla, uma vez que de fato pode ter ocorrido realmente o contato duplo ou foi simplesmente algum ruído.

1ª solução – Capacitor

O capacitor se enche com uma carga de 5v, quando o botão é pressionado e se esvazia quando o botão é liberado.
Esse processo faz com que o sinal que sai para o microprocessador demore alguns ms e desta forma o capacitor “filtra” o sinal.

Nesta caso o polo negativo do capacitor deve estar em Gnd e o positivo, depois do resistor de 10KΩ

Foi pressionado 10 vezes e o programa leu exatamente as 10 vezes
bounce debounce arduino projeto switch button botão scratch bounce debounce arduino projeto switch button botão scratch

2ª solução – delay(50)

Essa solução é a mais simples de todas, porém deve ser evitada, pois ela causa uma parada no programa toda vez que precisa ser executada.
Nesse caso, 50ms não vai fazer diferença em termos de performance, porém em programas mais elaborados a somatória dessa função ao longo do projeto atrapalhará o resultado final.
A função delay (50); deverá ser colocada na linha 61 do programa acima

Teste e veja o resultado: 10 pressionadas = 10 registros.
(50milisegundos de atraso no programa é imperceptível.)
Hackeduca Serial Bounce II

3ª solução – millis()

Essa função é mais elaborada e um pouco mais trabalhosa para usar, porém a contagem ocorre com o programa ainda em operação, ou seja , ela não paralisa a execução, causando atrasos, como na função delay ().
Há um exemplo no sketch do seu Arduino chamada BlinkWithoutDelay que faz um bom uso dessa função.
A função millis() utiliza o contador interno do Arduino, cujo contagem, inicia-se junto com a execução do programa ou um através de um Reset.

Neste caso vamos perguntar ao nosso programa quando ocorreu a última pressionada no botão. Caso tenho ocorrido em menos tempo que o estipulado ele não autorizará a execução. É como se descartássemos os toques duplos e triplos (quando ocorrido em tempo inferior a 50ms) que é o tempo suficientemente superior ao típico do bounce.

Veja como o projeto fica:

Scratch

O Scratch, não sofre tanto desse problema quando está integrado ao Arduino, mas é necessário colocar um comando para que a programação aguarde até que ocorra uma mudança da variável, caso contrário ela ficará efetuando a leitura eternamente.

hackeduca_scratchdebounce

 

Exemplo do mesmo jogo feito no Arduino:

hackeduca_scratchdebounce_ii

Previous Post Next Post

Você também pode gostar / You Might Also Like

No Comments

Leave a Reply

Show Buttons
Siga-nos no Facebook
Siga-nos no Twitter
Siga-nos no Google Plus
Siga-nos no Pintrest
Siga-nos no Youtube
Siga-nos no Scratch
Hide Buttons
CLOSE
CLOSE
Top