Vamos trabalhar com botões em entrada analógica, um dispositivo que lê dez botões utilizando apenas uma entrada analógica de qualquer microcontrolador. A ideia é economizar pinos de microcontroladores, como por exemplo do Attiny85 que tem apenas 6 pinos disponíveis.
Faço isso através de divisor resistivo, onde cada botão pressionado “fecha” o circuito com um resistor de valor diferente. Isso possibilita obter tensões diferentes com o pressionar de botões diferentes.
A tensão na imagem está 5V, porém 3,3V podem ser utilizados. Veja que temos um resistor de 10k na parte alta e os seguintes resistores na parte baixa: 8k2, 10k, 12k, 22k, 33k, 39k, 47k, 56k, 68k, 100k. Abaixo você vê os valores inteiros obtidos no Arduino UNO para cada resistor, bem como a respectiva tensão.
No nosso caso de 10 botões os valores em tensão ficaram bem afastados uns dos outros, qualquer conversor analógico-digital consegue fazer a leitura. Fiz um protótipo do circuito em placa perfurada, já com os componentes “finais”. No teste abaixo eu estou utilizando o Fritzen UM, um Arduino que eu mesmo fiz.
Eu então criei uma placa de circuito impresso para o projeto, conforme visto abaixo. Coloquei um capacitor de 100nF na saída da tensão analógica, para filtro.
Todos os arquivos de fabricação da placa (em Kicad) estão aqui.
Teste de funcionamento
A fim de testar o funcionamento do produto eu criei um código para Arduino, neste link. Criei também um código para microPython do Raspberry Pi Pico, que tem uma resposta em 16 bit (65535 valores). O Circuito é visto abaixo: o pino analógico é o 26, fora isso é só colocar 3,3V e GND na placa.
Em termos de código eu fui bem simples, apenas leio o valor inteiro (representação do analógico) em
pot_value = pot.read_u16()
e mando imprimir na porta serial, a cada 100mS.
# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-analog-inputs-micropython/
from machine import Pin, ADC
from time import sleep
pot = ADC(Pin(26))
while True:
pot_value = pot.read_u16() # read value, 0-65535 across voltage range 0.0v - 3.3v
print(pot_value)
sleep(0.1)
Lembrando que para trabalhar com microPython no Raspberry Pi Pico eu utilizo a Thonny IDE, cujo guia de configuração está aqui. O resultado aparece no Shell/console da Thonny IDE, visto abaixo.
Veja que o valor 21221 é o botão um, 32679 é o botão dois e assim por diante, até chegar em 59406 que é o botão zero (ver imagem do teclado acima). O primeiro e último valor da imagem (64911 e 64943) são para nenhum botão pressionado (fundo de escala).
Estes valores podem então ser processados, por exemplo através de IF() para executar a função que você desejar.
Conclusão
A ideia de utilizar uma entrada analógica para ler diversos botões não é nova, na internet tem bastante referências (principalmente em Inglês). É uma ótima “ferramenta” para ser ter na sua caixinha do dia-a-dia. Caso você queira adquirira a placa, comente logo abaixo ou então entre em contato pelo meu LinkdeIn.