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).
Fonte – 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.
Fonte: https://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.
Fonte: https://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.
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.
void main(void)
{
unsigned char valTemp;
unsigned char valAtual;
unsigned char tempo;
TRISB = 0x00; //configura a porta B como entrada
BitClr(INTCON2,7); //habilita pull-up interno do microcontrolador
valAtual = PORTB; //inicialização do valor
for(;;)
{
//aguarda uma mudança na porta B
while(valAtual==PORTB);
//quando acontecer alguma mudança, aguarda até estabilizar
valTemp = PORTB;
tempo = 22;
while (tempo > 0){
if (valTemp == PORTB){ // se não mudar continua a contar
tempo--;
}
else{
valTemp = PORTB; // se mudar, atualiza o sistema e reinicia o tempo
tempo = 22;
}
}
valAtual = valTemp; //valor atualizado;
PORTD = valAtual; //coloca o valor no barramento de leds
}
}
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.














Rodrigo, que capacitor e resistor devo usar para esse circuito que evita o debouncing?
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?
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… Leia mais »