Leitura de chaves mecânicas e o processo de debounce

Leitura de chaves
Este post faz parte da série Chaves mecânicas

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 – 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: 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.

Circuito de Debouncing
Figura 3: Circuito de debounce

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.

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.

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.

Chaves mecânicas

Teclado matricial e varredura de teclas
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
10 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Roberto Pinto
Roberto Pinto
28/09/2015 18:21

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

Rafael
Rafael
22/10/2014 09:36

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?

eletronpi
eletronpi
11/12/2016 11:00

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 »

Home » Software » Leitura de chaves mecânicas e o processo de debounce

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: