O mais comum é vermos um conjunto de chaves/botões/teclas usando pinos digitais. Porém com apenas um pino analógico podemos ler o estado de algumas chaves utilizando o recurso divisor de tensão resistivo.
O problema é o acionamento combinado. Se a mão for trêmula não teremos uma leitura correta 🙂 . Brincadeiras a parte, dependendo da aplicação esta não é uma solução adequada e neste caso é melhor usar um teclado matricial, tanto é que nem vamos implementar os três botões simultâneos.
Neste projeto, vamos usar um divisor de tensão para gerar valores diferentes a cada botão pressionado. Com este recurso teremos como saída (Vout) uma fração da tensão de entrada (Vin), proporcional aos resistores em série (R1 e R2) dado por este circuito:
A tensão de saída será dada pela expressão:
A ligação na protoboard é bem simples. Vejam o esquema a seguir.
Funcionamento
Supondo que o botão 3 (B3) foi pressionado, teremos para R1 = 100K ohms e R2 = 100K ohms. A tensão de entrada é a do Arduino, ou seja 5V.
Aplicando a expressão (não esqueça de compatibilizar as unidades – volts e ohms):
Vsaida = 100000 / ( 100000 + 100000 ) . 5 = 2,5 volts
O retorno de um pino analógico varia de 0 a 1023, então para ficar mais simples os cálculos e não precisar ficar convertendo a leitura em volts faça da seguinte forma:
Valor pino = 100000 / ( 100000 + 100000 ) . 1024 = 512
Montando uma tabela botão pressionado x leitura do pino analógico obtivemos os seguintes valores:
botão | valor lido |
1 | 932 |
2 | 696 |
3 | 512 |
1+2 | 947 |
1+3 | 940 |
2+3 | 777 |
Importante! Os valores obtidos da leitura e dos cálculos podem não ser os mesmos devido a tolerância dos resistores e não se esqueçam que quando pressionamos mais de um botão ao mesmo tempo, os resistores (R1) ficam em paralelo. Por exemplo: pressionando o botão 1 e 3 temos o seguinte resistor equivalente (RE)
1 / RE = (1 / 10000) + (1 / 100000)
RE = 1 / 0,0001 + 0,00001 = 9090 ohms
Aplicando a expressão
Valor pino = 100000 / ( 9090 + 100000 ) . 1024 = 939 aproximadamente, que está próximo do valor obtido na tabela acima (940).
Montagem
Lista de material:
- 3 chaves tácteis
- 1 resistor de 10K ohms (marrom, preto e laranja)
- 1 resistor de 40K ohms (amarelo, preto e laranja)
- 1 resistor de 100K ohms (marrom, preto e amarelo)
- 1 protoboard
- fios jumpers
- 1 Arduino (qualquer modelo)
sketch
Após montar o circuito, execute este sketch para obter os valores (como na tabela acima), pois como explicado anteriormente, devido a tolerância dos resistores os valores podem ser bem diferentes.
void setup() { Serial.begin(9600); } void loop() { int pinoBotao = analogRead(A0); Serial.println( pinoBotao ); }
Anote os valores para cada botão pressionado e altere os valores do array arrValores[] do sketch a seguir.
/* Exemplo usando divisores de tensao para leitura de botoes com apenas uma entrada analogica. */ int arrValores[] = { 932, 696, 512, 947, 940, 777 }; void setup() { Serial.begin(9600); } void loop() { int pinoBotao = analogRead(A0); for ( int indice = 0; indice <= 5; indice++ ) { if ( arrValores[ indice ] == pinoBotao ) { Serial.print("Botao \t"); Serial.println( indice + 1 ); delay(500); break; } } }
Esse artigo é uma boa para economizar nos pinos, gostei.