Leitura de chaves mecânicas e o processo de debounce

Leitura-de-chaves
Leitura-de-chaves

As chaves mecânicas são um dos modos mais simples de se adquirir informações digitais do mundo externo. Devido sua robustez e custo são amplamente utilizadas em mecanismos de fim de curso e em interfaces com o usuário.

 

Neste artigo abordaremos o funcionamento básico de uma chave e como transformá-la num sensor eletrônico digital. Um dos maiores problemas com esse tipo de chaves é um efeito conhecido como bouncing, que pode indicar erroneamente o acionamento, levando o processador a acreditar que a chave foi pressionada mais de uma vez em intervalos muito pequenos. Para sistemas que funcionam como contadores este é um problema crítico. Ainda bem que existem soluções simples e baratas para isso.

 

 

Funcionamento de uma chave

 

Para realizar a leitura de uma chave mecânica é necessário criar um circuito que transforme o estado da chave: aberto ou fechado, em um sinal elétrico para cada estado. Os níveis de tensão associados dependem muito dos circuitos envolvidos. Os níveis mais comuns são os compatíveis com TTL, onde o zero lógico é representado por 0v (zero volts) e o um lógico é representado por 5v (cinco volts).

 

Uma maneira de se obter este funcionamento é com o uso de uma chave ligada ao VCC e um resistor de pull-down (ligado ao terra) ou uma chave ligada ao terra e um resistor de pull-up (ligado ao VCC).

 

circuito eletrônico para chave
Figura 1: Circuito de leitura de chave

 Fonte:  http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted

 

Pela figura 1 percebemos que a tensão de saída é igual a VCC quando a chave está desligada, pois não há circulação de corrente no circuito, de modo que  a queda de tensão em R1 é zero.

 

Quando a chave é pressionada uma corrente flui de VCC para o terra passando por R1. Como não existe nenhuma outra resistência no circuito, toda a tensão fica em cima de R1. Deste modo a tensão de saída passa a ser zero.

 

 

O efeito Bouncing 

 

Apesar do funcionamento aparentemente simples, este tipo de circuito apresenta um problema de oscilação do sinal no momento em que a tecla é pressionada. Esta oscilação é conhecida como bouncing. A figura 2 apresenta esse efeito.

 

Efeito de Bouncing nas chaves
Figura 2: Oscilação do sinal no momento do chaveamento

Fonte: http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted

 

Estas oscilações indevidas podem gerar acionamentos acidentais, causando mau funcionamento do programa. Para evitar isso podemos utilizar técnicas de debounce, por hardware ou software.

A opção de debounce por hardware pode ser visualizada na Figura 3.

 

Circuito de Debouncing
Figura 3: Circuito de debounce

Fonte: http://www.ikalogic.com/debouncing.php - Ibrahim Kamal

 

Neste circuito, o capacitor 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 4. Notar que o nível do sinal filtrado não chega a zero em nenhum momento, devido à constante de tempo do filtro RC ser maior que o período de debounce.

 

Sinal de chave com debounce por hardware
Figura 4: Utilização de filtro RC para debounce do sinal

 

 

Leitura de chaves: De-bouncing por software

 

O debounce por software em geral é utilizado em situações onde se deseja aumentar a robustez de uma entrada que já possua um debounce por hardware ou reduzir o custo da placa utilizando apenas a solução por software. A grande desvantagem deste tipo de sistema de leitura de chaves é inserir um atraso na detecção da informação.

 

Para realizar o debounce por software precisamos ter uma noção do tempo que a chave precisa para estabilizar. Da figura 2 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.

 

No código apresentado como exemplo, o contador é iniciado com o valor 22. Deste modo é necessário que o sinal permaneça com o mesmo valor durante os 22 ciclos para que a variável valAtual receba o valor da porta B. Para ter certeza que este valor é suficiente, pode-se utilizar um osciloscópio para esta medida.

 

 

O código é bastante simples e fácil de ser adaptado para diversas arquiteturas. A vantagem da abordagem por software é a redução de custo, retirando a necessidade de um filtro por hardware por cada entrada do sistema. A desvantagem é o consumo de processamento e o atraso inserido entre o evento e a capacidade de resposta do programa. Uma das opções para reduzir esse consumo é fazer o debounce de mais uma entrada de uma única vez. No exemplo apresentado, caso a porta B possua 8 chaves conectadas em seu terminal, todas as 8 serão processadas de uma única vez.

 

Por esses motivos esta é uma boa alternativa para entradas do tipo chaves que realizem interação com o ser humano, visto que o atraso é imperceptível para nós.

 

Para maiores informações sobre debounce, os diferentes tipos de chaves, bem como outras soluções por hardware e software recomendo a leitura deste documento do Jack Ganssle: A guide to debouncing.

 

No próximo artigo veremos como fazer a leitura de uma quantidade de teclas (muito) maior do que a quantidade de terminais disponíveis no microcontrolador.

 

Professor da Universidade Federal de Itajubá onde leciona sobre programação embarcada, sistemas operacionais e desenvolvimento de produtos eletrônicos. Pesquisa na área de sistemas críticos desenvolvendo técnicas para melhoria de confiabilidade e segurança.

Deixe um comentário

10 Comentários em "Leitura de chaves mecânicas e o processo de debounce"

Notificar
avatar
 
Ordenar por:   recentes | antigos | mais votados
eletronpi
Visitante
eletronpi

Um outro aspecto importante no uso de chaves e microcontroladores, é que as chaves, apesar de mecânicas, podem gerar sinais com variação muito rápida no tempo (dv/dt elevado), podendo causar o processo de latch up na entrada à qual está conectada. Este processo faz com que correntes circulem na entrada do microcontrolador, por capacitores intrínsecos, podendo inverter o estado de algumas junções, travando o microcontrolador e até levando à queima. É um processo comum em componentes mais antigos. A solução simples é nunca conectar a porta do microcontrolador diretamente ao mundo externo, mas sempre através de um resistor da ordem de 1K.

Roberto Pinto
Membro
Roberto Pinto

Rodrigo, que capacitor e resistor devo usar para esse circuito que evita o debouncing?

trackback
Sistemas Operacionais de Tempo Real - Teclados Matriciais - Embarcados - Sua fonte de informações sobre Sistemas Embarcados

[…] Leitura de chaves mecânicas e o processo de debounce […]

trackback
Biblioteca de funções e rotinas padronizadas em linguagem C para MCS-51 – Teclados Matriciais | Blog do Engenheiro Puhlmann

[…] Leitura de chaves mecânicas e o processo de debounce […]

Rafael Alves Dias
Membro
Rafael Alves Dias

Rodrigo, Muito boa a abordagem.

Eu nunca usei essa técnica por hardware sempre fiz travas no firmware para corrigir esse problema. Por se tratar de chaves para configurações iniciais e não chaves que fazem parte do processo.
Utilizando a técnica por hardware um capacitor de 100nF resolve o problema, correto?

trackback
Raspberry PI – GPIO input com Python - Embarcados - Sua fonte de informações sobre Sistemas Embarcados

[…] se você não conhece, pode ver o artigo Leitura de chaves mecanicas e o processo de debounce [2], escrito pelo Rodrigo Almedia, indicando como contornar o problema via hardware e software, e […]

trackback
Debouncing via software com Arduino sem usar delay – millis() -

[…] para quem desconhece o que significa debounce em eletrônica digital, aconselho a leitura desse excelente artigo do site Embarcados, autoria do Rodrigo Almeida, que trata desde o conceito de bouncing (com […]

trackback
Debouncing via software com Arduino sem usar delay – millis() | Blog Seja Livre

[…] Primeiro, para quem desconhece o que significa debounce em eletrônica digital, aconselho a leitura desse excelente artigo do site Embarcados, autoria do Rodrigo Almeida, que trata desde o conceito de bouncing (com […]

trackback
Debouncing via software com Arduino sem usar delay – millis() | Jéter Silveira

[…] Primeiro, para quem desconhece o que significa debounce em eletrônica digital, aconselho a leitura desse excelente artigo do site Embarcados, autoria do Rodrigo Almeida, que trata desde o conceito de bouncing (com […]

trackback
Projeto completo de uma UART em MyHDL - Gerando VHDL / Verilog e testando no FPGA - Embarcados - Sua fonte de informações sobre Sistemas Embarcados

[…] start do tx está mapeado em um botão sem debounce e não registrado. Ao apertar o botão para enviar um dado o sinal de “start” vai para […]

wpDiscuz