debounce: como simplificar?

791 views
Skip to first unread message

Luciano Ramalho

unread,
Aug 12, 2013, 10:51:26 AM8/12/13
to hacker...@googlegroups.com
o uso de botões com arduino é surpreendentemente complicado por causa
do problema do "bounce".

http://arduino.cc/en/Tutorial/Debounce

estou explorando alternativas simples para fazer debouncing, que não
envolvam complicar demais a lógica dos programas dos principiantes (o
código acima é complicado demais para principiantes, e se tiver mais
de um botão no circuito, fica horrível até para especialistas).

Vejo duas alternativas:

1) usar uma biblioteca em C ou C++ que faça o debouncing e tenha uma
API amigável, talvez usando interrupt, algo como:

Button.setup(pin); --> configura o botão neste pino
Button.pressed(pin); --> devolve TRUE se o botão foi pressionado
Button.lastPress(pin); --> devolve 0 se não foi pressionado, ou o
número de ms desde que foi pressionado
Button.pressCount(pin) --> devolve o número de vezes que o botão foi pressionado
Button.reset(pin) -> zera os contadores de

2) usar um CI de latch. qual, como?


[ ]s
Luciano


--
Luciano Ramalho / OFICINAS TURING
Twitter: @ramalhoorg

Autor e professor dos cursos:

* Objetos Pythonicos --> http://turing.com.br/oopy
* Python para quem sabe Python --> http://turing.com.br/ppqsp

Luciano Ramalho

unread,
Aug 12, 2013, 10:53:11 AM8/12/13
to hacker...@googlegroups.com
Opa, faltou falar: se alguém puder recomendar uma biblioteca para
fazer o debouncing, é uma boa! Podendo evitar, eu prefiro não
reinventar a roda ;-).

[ ]s
Luciano

2013/8/12 Luciano Ramalho <luc...@ramalho.org>:

Oda

unread,
Aug 12, 2013, 10:55:08 AM8/12/13
to hacker...@googlegroups.com
Ramalho, pq vc nao coloca um capacitor em paralelo com o botao?

--
Oda
------------------------------------------------------
If you don't have time to do it right, where
are you going to find the time to do it over?
------------------------------------------------------


2013/8/12 Luciano Ramalho <luc...@ramalho.org>:
> --
> .--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
> Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
> Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
> Maiores opções sobre o Google Groups, visite: http://groups.google.com/group/hackerspacesp
> .--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- ..
> Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
>
>
>

Alexandre Vecchio

unread,
Aug 12, 2013, 10:57:22 AM8/12/13
to hacker...@googlegroups.com
Oi Ramalho,

Eu estava pensando em usar esta biblioteca em um projeto. Veja se te ajuda.

Abraços

> Date: Mon, 12 Aug 2013 11:53:11 -0300
> Subject: [GaroaHC] Re: debounce: como simplificar?
> From: luc...@ramalho.org
> To: hacker...@googlegroups.com

Luciano Ramalho

unread,
Aug 12, 2013, 10:58:40 AM8/12/13
to hacker...@googlegroups.com
2013/8/12 Oda <o...@member.fsf.org>:
> Ramalho, pq vc nao coloca um capacitor em paralelo com o botao?

Porque eu não sei o suficiente de eletrônica para pensar nisso, mas
parece simples e genial!

Pode ser igual ao circuito mais simples desta página?

http://www.zen22142.zen.co.uk/Design/debounce.htm

Valeu, Oda!

[ ]s
Luciano

DQ

unread,
Aug 12, 2013, 11:05:25 AM8/12/13
to hacker...@googlegroups.com
Ramalho,

Dependendo do uso do botão, o debounce pode ser simplificado ou mesmo omitido. Por exemplo tem o clássico

for (;;)
{
  if (digitalRead(buttonPin))
    digitalWrite (ledPin, HIGH);
  else
    digitalWrite (ledPin, LOW);
}

Onde o debounce é feito pela visão do observador.

Umas solução simples (com restrições obvias) é dar um delay curto após detectar uma mudança. Por exemplo, para contar quantas vezes um botão é apertado:

contador = 0;
for (;;)
{
  if (digitalRead(buttonPin))
  {
    contador++;
    delay (10);  // ignora o bounce ao apertar
    while (digitalRead(buttonPin))
      ;
   delay (10);  // ignora o bounce ao soltar
  }
}

DQ

Alexandre Vecchio

unread,
Aug 12, 2013, 11:06:56 AM8/12/13
to hacker...@googlegroups.com
Também não sei quase nada de eletrônica. 
Oda, dá para usar os capacitores em paralelo para o Keypad tb?



> Date: Mon, 12 Aug 2013 11:58:40 -0300
> Subject: Re: [GaroaHC] Re: debounce: como simplificar?
> From: luc...@ramalho.org
> To: hacker...@googlegroups.com
>

Rafael M. Lopes

unread,
Aug 12, 2013, 11:13:08 AM8/12/13
to hacker...@googlegroups.com
Além das opções mencionadas existe essa biblioteca:


2013/8/12 Alexandre Vecchio <aleve...@hotmail.com>

Aylons Hazzud

unread,
Aug 12, 2013, 11:14:56 AM8/12/13
to hacker...@googlegroups.com
Pode, mas estes circuitos são todos mais complicados do que precisam ser.

O segundo circuito desta página dá e sobra (em vez do inversor na
saída, já pode ligar direto no arduino):

http://www.ganssle.com/debouncing-pt2.htm

As fórmulas para calcular os valores estão na própria página, mais abaixo.

2013/8/12 Luciano Ramalho <luc...@ramalho.org>:

Oda

unread,
Aug 12, 2013, 11:33:11 AM8/12/13
to hacker...@googlegroups.com
Esse link que o Aylons mandou mata a cobra. Funciona com qq botao,
portanto deve funcionar com esse keypad (mas tem uma chance de ele ja
ter algo parecido internamente).

Para ter uma intuicao de pq isso funciona, pense no capacitor como um
integrador (ele de fato integra a corrente no sentido matematico, uma
vez que ele acumula eletrons). Entao eh como se vc acabasse com uma
media das coisas.

--
Oda
------------------------------------------------------
If you don't have time to do it right, where
are you going to find the time to do it over?
------------------------------------------------------


2013/8/12 Aylons Hazzud <ayl...@gmail.com>:

Luciano Ramalho

unread,
Aug 12, 2013, 12:05:34 PM8/12/13
to hacker...@googlegroups.com
2013/8/12 DQ <d.qu...@yahoo.com>:
> Dependendo do uso do botão, o debounce pode ser simplificado ou mesmo
> omitido. Por exemplo tem o clássico
>
> for (;;)
> {
> if (digitalRead(buttonPin))
> digitalWrite (ledPin, HIGH);
> else
> digitalWrite (ledPin, LOW);
> }
>
> Onde o debounce é feito pela visão do observador.

Esse eu cheguei a preparar para mostrar pros meus alunos.

> Umas solução simples (com restrições obvias) é dar um delay curto após
> detectar uma mudança. Por exemplo, para contar quantas vezes um botão é
> apertado:
>
> contador = 0;
> for (;;)
> {
> if (digitalRead(buttonPin))
> {
> contador++;
> delay (10); // ignora o bounce ao apertar
> while (digitalRead(buttonPin))
> ;
> delay (10); // ignora o bounce ao soltar
> }
> }

Boa dica, o delay ajuda a manter o código simples, evitando a lógica
de marcar o tempo transcorrido etc.

Eu preciso de debounce lógico para fazer um simples botão mudar o
estado de um circuito a cada clique, por exemplo, um semáforo com 3
leds e um botão: cada vez que o botão é pressionado, muda o estado do
semáforo.

Valeu, DQ!

[ ]s
Luciano
> --
> .--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .-
> .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-..
> . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
> Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
> Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
> Maiores opções sobre o Google Groups, visite:
> http://groups.google.com/group/hackerspacesp
> .--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ...
> . --- .-- .. -.- ..
> Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
>
>
>



Luciano Ramalho

unread,
Aug 12, 2013, 12:11:17 PM8/12/13
to hacker...@googlegroups.com
Legal, valeu a dica, padawan!

Vou dar uma estudada neste código, parece bem legal! Porém já o autor
já perde 2 pontos de cara: não tem código no repositório, e o download
é em formato .rar...

Valeu, Rafael!

[ ]s
Luciano



2013/8/12 Rafael M. Lopes <raf...@rafaelme.com>:

Luciano Ramalho

unread,
Aug 12, 2013, 12:15:02 PM8/12/13
to hacker...@googlegroups.com
Excelente, Aylons, vou estudar esses circuitos e quando montar o meu,
mostrar pra vcs!

Valeu!

[ ]s
Luciano

2013/8/12 Aylons Hazzud <ayl...@gmail.com>:

Luciano Ramalho

unread,
Aug 12, 2013, 12:17:46 PM8/12/13
to hacker...@googlegroups.com
2013/8/12 Luciano Ramalho <luc...@ramalho.org>:
> 2013/8/12 DQ <d.qu...@yahoo.com>:
>> Dependendo do uso do botão, o debounce pode ser simplificado ou mesmo
>> omitido. Por exemplo tem o clássico
>>
>> for (;;)
>> {
>> if (digitalRead(buttonPin))
>> digitalWrite (ledPin, HIGH);
>> else
>> digitalWrite (ledPin, LOW);
>> }
>>
>> Onde o debounce é feito pela visão do observador.
>
> Esse eu cheguei a preparar para mostrar pros meus alunos.

A versão Arduino do código acima é:

void loop() {
if (digitalRead(buttonPin))
digitalWrite (ledPin, HIGH);
else
digitalWrite (ledPin, LOW);
}

ou simplesmente:

void loop() {
digitalWrite(ledPin, digitalRead(buttonPin));
}

[ ]s
Luciano

André Oliveira

unread,
Aug 12, 2013, 12:31:07 PM8/12/13
to hacker...@googlegroups.com
Luciano,
Acho melhor essa solução:

Mas bom mesmo é usar interrupção externa e não polling, na interrupção tratar bouncing e ruídos, mas Arduino não é bom pra isso.

Solução radical, um 555 gerando um pulso de tamanho conhecido pra cada botão [rs]

[]s,

        André M de Oliveira

.oO ineptire est juris gentium Oo.
   http://int2float.blogspot.com



2013/8/12 Luciano Ramalho <luc...@ramalho.org>

Aylons Hazzud

unread,
Aug 12, 2013, 12:53:00 PM8/12/13
to hacker...@googlegroups.com
2013/8/12 Luciano Ramalho <luc...@ramalho.org>:
> Excelente, Aylons, vou estudar esses circuitos e quando montar o meu,
> mostrar pra vcs!

Leva o seu circuito lá que eu te mostro ele funcionando o osciloscópio.

Igor Isaias Banlian

unread,
Aug 12, 2013, 12:55:28 PM8/12/13
to hacker...@googlegroups.com
Aff, vocês estão querendo complicar algo simples demais... ¬¬

Luciano, como eu já te falei pessoalmente, é só você colocar um capacitor em paralelo com o botão, um capacitor cerâmico, que não tem polaridade, número 104, já resolve esse problema aí e não custa nem R$0,05 centavos!

Todas essas coisas complexas que postaram acima são como usar uma bomba atômica para matar uma formiga!

Atenciosamente,
Igor Isaias Banlian

Allan Moreira

unread,
Aug 12, 2013, 1:06:37 PM8/12/13
to hacker...@googlegroups.com
Luciano,

Apenas aumentando a lista de soluções, 

ESD-Protected, Single/Dual/Octal, CMOS Switch Debouncers  http://www.maximintegrated.com/datasheet/index.mvp/id/1896 

Abraços,

Allan Moreira




Luciano Ramalho

unread,
Aug 12, 2013, 2:05:55 PM8/12/13
to hacker...@googlegroups.com
Valeu pela dica, Igor, vou experimentar a sua dica assim que chegar no
Garoa mais tarde hoje.

Aliás, quero contar para todo mundo que gostei muito de contar com a
sua ajuda como monitor na sessão-teste interno da oficina Makers
Arduino do Gizmodo [1].

[1] http://www.makers.net.br/arduino/

Muito grato pela força, Igor! Vamos continuar colaborando!

[ ]s
Luciano


2013/8/12 Igor Isaias Banlian <igorisai...@gmail.com>:

Igor Isaias Banlian

unread,
Aug 12, 2013, 4:32:11 PM8/12/13
to hacker...@googlegroups.com
Eu que agradeço a oportunidade, só de participar dessa sua oficina já valeu muito a pena, nem precisava eu ter ganho o kit (embora, claro, eu fiquei mais feliz com ele, hehehehe, e alias, já estou fazendo um mega projeto com tal kit, que irei te mostrar e explicar direitinho em uma próxima oportunidade de nos encontrarmos no Garoa)! :-P

Pode contar comigo, você e todos do Garoa que precisarem de alguma ajuda, sempre que houver viabilidade técnica, da minha parte estou sempre a disposição para ajudar! :-D

Atenciosamente,
Igor Isaias Banlian

Thiago Lechuga

unread,
Aug 12, 2013, 7:47:37 PM8/12/13
to hacker...@googlegroups.com
Acho que pra garantir, o luciano tinha que usar todas as opções ao mesmo tempo :P

[]s,

--
Thiago Alvarenga Lechuga
cel. +55 (11) 6433-9530

===Knowledge is only useful if you can share it.===

Luis Rossi

unread,
Aug 12, 2013, 9:07:27 PM8/12/13
to hacker...@googlegroups.com
Me desculpe Igor mas isso não é verdade. 

Um capacitor de 100nF ajuda, na borda de subida apenas, mas com certeza não resolve. Ele forma um filtro RC com constante de temp de 1ms (com um capacitor de 10k)... mutas chaves informam no DataSheet que o tempo de instabilidade pode chegar à ordem de multiplos ms. Para piorar as indutancias intrinsica do sistema cria oscilações por causa das transições muito rápidas da chave (tipico over e undershoot). Na borda de descida, não existe filtro, e salvo se o capacitor tiver uma resistencia serie MUITO alta, ele não vai ajudar em quase nada. 

Debounce apenas com capacitor é tipica solução se você não se importa de a sua leitura ser duplicada ou falhar as vezes, como por exemplo testes rápidos em protoboard. No caso do Arduino e para pessoas sem conhecimento é claramente uma chance de injetar ruído no aprendizado da pessoa em questão.

As soluções de hardware são boas, mas se pode ser feito no micro, não vejo motivo de ter toda essa circuitaria...

Abs


2013/8/12 Igor Isaias Banlian <igorisai...@gmail.com>
Aff, vocês estão querendo complicar algo simples demais... ¬¬

--
.--. .- .-. .- .--. --- ... - .- .-. . ... -.-. .-. . ...- .- .--. .- .-. .- .... .- -.-. -.- . .-. ... .--. .- -.-. . ... .--. .- - --. --- --- --. .-.. . --. .-. --- ..- .--. ... -.. --- - -.-. --- --
Regras da Lista: http://garoa.net.br/wiki/Lista:LeiaAntesDeClicarNoSend
Para mais informações sobre o Garoa Hacker Clube acesse http://garoa.net.br
Maiores opções sobre o Google Groups, visite: http://groups.google.com/group/hackerspacesp
.--. .- .-. .- -- .- .. ... .. -. ..-. --- .-. -- .- . ... .- -.-. . ... ... . --- .-- .. -.- ..
Epoch 0 <=> Fundação: 1298244863 s ~ 2.408064*10^52 tP (tempos de Planck)
 
 
 



--
Luís Filipe Rossi
Electrical Engineer
Escola Politécnica
Universidade de São Paulo

Emerson William dos Santos Moura

unread,
Aug 12, 2013, 11:10:02 PM8/12/13
to hacker...@googlegroups.com
Me lembrei que eu tinha esse documento PDF aqui, que aborda soluções
de hardware e software e faz análises diversas do problema. Só 26
páginas. Espero que seja útil...
Emerson W.S.Moura
debouncing.7z

DQ

unread,
Aug 13, 2013, 6:48:46 AM8/13/13
to hacker...@googlegroups.com
Jack Ganssle é o cara! Recomendo a todos ler este documento (não se preocupem com o tamanho, a leitura é bem suave e divertida).

Eu diria que para uma atividade simples de programação com Arduino (que não seja centrada em tratar botões) um filtro RC ou um delay após a leitura deve ser suficiente para não ter problemas práticos. Quando a confiabilidade for importante eu usaria um dos software debouncers descritos no documento (baseados na interrupção de tempo).

DQ

Alexandre Becker

unread,
Aug 13, 2013, 7:19:57 AM8/13/13
to hacker...@googlegroups.com
emersonwsm
Obrigado por compartilhar o arquivo, vai ser muito util em alguns projetos que estamos tocando la no Matehackers.

Luciano Ramalho

unread,
Aug 13, 2013, 10:20:34 AM8/13/13
to hacker...@googlegroups.com
Legal, Emerson, muito grato pelo doc.

Acabei de constatar que é exatamente o mesmo texto que o Aylons citou outro dia:

http://www.ganssle.com/debouncing.htm

[ ]s
Luciano

2013/8/13 Emerson William dos Santos Moura <emers...@gmail.com>:

Igor Isaias Banlian

unread,
Aug 13, 2013, 10:27:07 AM8/13/13
to hacker...@googlegroups.com
Sei que na teoria temos toda essa lógica que você postou, também sei que se colocarmos um osciloscópio aí no meio veremos que o capacitor não filtra todo o problema, mas teste na prática, no circuito que o Luciano quer fazer, com Arduino, e depois volte a dizer aqui se resolveu ou não resolveu o problema dele!

Ainda afirmo que, embora tudo que o Luis falou seja verdade, com apenas um capacitor em paralelo com cada botão, o problema do Luciano estará resolvido, pois no caso do Arduino, só precisa filtrar "o grosso" do efeito bounce, não precisa eliminar ele por completo, ter uma onda perfeitamente simétrica, ter os picos e vales bem definidos, maquiar ela com batom, etc.! :-P

Atenciosamente,
Igor Isaias Banlian

André Oliveira

unread,
Aug 14, 2013, 7:14:30 AM8/14/13
to hacker...@googlegroups.com

Como no Arduino você não acessa diretamente o registrador da porta, ele tem um atraso intrínseco, pode ser que você tenha razão Igor. Mas isso é um caso particular.

[]s,
André M de Oliveira

Antonio Celso C L Souza

unread,
Aug 14, 2013, 8:31:29 AM8/14/13
to hackerspacesp
Opas,


Não li o material soh bati o olho por cima, mas esse eh um problema interessante!

Eu acho que o Bounce acontece por um "efeito de borda", isso eh a geração de frequências altas por características elétricas dos materias de contato, que eu me lembre usavamos um filtro passa-baixo passivo que resolvia boa parte da história. Ai tem o Passa alta e passa baixa ambos são filtros RC e fazem o oposto (imagem googlada) :


Uma outra forma, mais robusta, senão me falha a memória é usando um trigger schimidt, mas aí o molho saí mais caro....Não de money em si, mas de compreensão do sistema.

Só pra terminar, não acho frustrante que as pessoas de repente vejam o seu controle não funcionando a contento, desde que elas saibam o que está causando aquele problema, tem a solução mas vai exigir ir além! rererer

Abs

Antonio Celso

Antonio Celso C L Souza

unread,
Aug 14, 2013, 8:33:19 AM8/14/13
to hackerspacesp
Soh corrigindo é Schmitt Trigger, tenho quase certeza que ele é o cara forte pra resolver isso, está correro DQ?

Abs

Alexandre Vecchio

unread,
Aug 31, 2013, 1:58:04 PM8/31/13
to hacker...@googlegroups.com
Oi Pessoal,

Estou pensando em usar este circuito para eliminar ruídos em um switch que estará em um pino de interrupção. http://www.ikalogic.com/de-bouncing-circuits/  Parece simples e com uma leitura limpa o suficiente.
Porém bateu uma dúvida de símbolos. O Capacitor citado no texto é cerâmico. O desenho no circuito não é de eletrolítico? ( Não conheço quase nada de eletrônica). Qual usar?

Obrigado,
Ale Vecchio

PS: Os cronômetros estão quase prontos. Para os que não sabem qual é o projeto, estou montando cronômetros para serem usados em competições de tiro com arco. Várias funções, controles e saídas diferentes. Na próxima semana vou usá-los em uma competição em Recife. Na seguinte levo ao Garoa para mostrar.


Date: Mon, 12 Aug 2013 13:31:07 -0300

Subject: Re: [GaroaHC] Re: debounce: como simplificar?

DQ

unread,
Aug 31, 2013, 4:26:54 PM8/31/13
to hacker...@googlegroups.com
O símbolo é de um capacitor polarizado, mas pode ser usado um cerâmico sem problema.

DQ

Alexandre Vecchio

unread,
Aug 31, 2013, 11:11:18 PM8/31/13
to hacker...@googlegroups.com
Obrigado DQ.


Date: Sat, 31 Aug 2013 13:26:54 -0700
From: d.qu...@yahoo.com
To: hacker...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages