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.