Como Usar Botões de Pressão com Pinos GPIO do Raspberry Pi

Se você já usou um LED com um Raspberry Pi, então provavelmente sabe como funcionam as saídas GPIO. O código faz a eletricidade fluir através dos pinos de Entrada/Saída de Uso Geral (GPIO), passa pelos LEDs e ilumina as coisas. Mas você já tentou fazer o contrário? Com botões de pressão, você pode fazer exatamente o oposto. Este tutorial mostra como transformar um pino GPIO em um pino de entrada, ouvindo cada pressionamento de botão que você faz!
Índice
- Como Funcionam os Botões de Pressão
- Botões de Pressão de 4 Pinos
- Usando Botões de Pressão com Pinos GPIO do Raspberry Pi
- Como Usar Botões de Pressão
- Hardware em Botões de Pressão
- Comandos de Importação
- Comandos de Configuração
- Comandos em Loop
- Perguntas Frequentes
Leia também: Como Fazer LEDs Piscarem com o Raspberry Pi
Como Funcionam os Botões de Pressão
Um botão de pressão é um tipo de interruptor. Ele tem dois pinos condutores separados que impedem um circuito completo por estarem separados um do outro. Quando você pressiona um botão de pressão, na verdade está juntando os dois pinos, completando o circuito. Mas se você soltar, há um mecanismo semelhante a uma mola que separa os pinos novamente.

Leia também: Como Transformar Seu Raspberry Pi em uma Estação de Videoconferência
Botões de Pressão de 4 Pinos
O botão de pressão típico em kits de sensores tem quatro pinos, com cada pino separado dos outros. Uma placa de metal móvel fica logo abaixo da área do botão, que desce e conecta todos os outros pinos quando o botão de pressão é pressionado para baixo.

Você encontrará duas placas dentro de um botão de pressão de 4 pinos. Cada uma está conectada a dois pinos externos. Ambas as placas são mantidas separadas uma da outra e só podem ser conectadas pressionando uma terceira placa – a placa de metal sob o botão.

De certa forma, sempre há dois pinos conectados em um botão de pressão. Quando você pressiona o botão de pressão de 4 pinos, você conecta todos os quatro pinos juntos.
Leia também: Como Programar um Arduino com um Raspberry Pi
Usando Botões de Pressão com Pinos GPIO do Raspberry Pi
Desta vez, estamos fazendo os pinos GPIO do Raspberry Pi detectarem um pressionamento de botão de um botão de pressão. Quando a eletricidade passa por ele, o Raspberry Pi imprimirá uma mensagem dizendo que está funcionando.
Coisas que Você Vai Precisar
- Botão de pressão (4 pinos)
- Resistor (um entre 100Ω e 1000Ω deve funcionar)
- Fios jumper
- Voltímetro (opcional)
- Raspberry Pi
- Monitor e teclado (ou SSH)
Leia também: Como Instalar o Windows 11 em um Raspberry Pi 4
Como Usar Botões de Pressão
- Abra seu editor de código de sua escolha e cole o seguinte código:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)Salve como “rpi-pushbutton.py” (ou qualquer nome que você quiser, desde que a extensão do arquivo seja a mesma).
Monte o circuito. Em um pino do botão de pressão, conecte-o ao pino 7 e a um resistor em paralelo. Conecte um fio jumper a um pino GND (pinos 6, 7, 14, 20, 25, 30, 34 ou 39) do outro lado deste resistor, depois conecte outro fio jumper a um pino de 3.3V (pinos 1 ou 17) em um pino separado do botão de pressão.

Dica: para encontrar o número do pino correto, segure seu Raspberry Pi de forma que os pinos GPIO fiquem no canto superior direito. O pino superior esquerdo é o pino 1, e à direita dele está o pino 2. Abaixo do pino 1 está o pino 3, à direita está o pino 4, e assim por diante.

- Ligue seu Raspberry Pi e abra o terminal. Use
cdpara mover para o diretório do script Python, depois digitepython3 rpi-pushbutton.py. Se você usou um nome de arquivo diferente, use esse em vez de “rpi-pushbutton.”

- Você deve ver uma nova linha de texto dizendo
Pin 7 is LOW...a cada 0.15 segundos no terminal. Se você pressionar o botão, a nova linha seráPin 7 is HIGH!.
Se você trocar os pinos GND e 3.3V, com 3.3V no resistor e GND do outro lado do botão de pressão, você inverterá a lógica do botão de pressão. Ele irá gerar Pin 7 is HIGH! o tempo todo e se tornará Pin 7 is LOW quando você pressionar o botão.

Leia também: As Melhores Alternativas ao Raspberry Pi de 2024 que Você Deve Conferir Agora
Hardware em Botões de Pressão
Botões de pressão usam dois tipos de resistores: pull-up e pull-down. O que tem 3.3V conectado ao resistor é um resistor pull-up. Ele puxa a voltagem para cima. Enquanto isso, resistores pull-down puxam a voltagem para baixo ao ter um pino GND conectado a eles.
Você ainda pode usar um botão de pressão sem um resistor, mas fazer isso deixa seu pino GPIO em flutuação. Um pino GPIO flutuante não recebe carga elétrica direta, então ele procura cargas em seus arredores. Se houver um campo eletromagnético forte perto dele, por exemplo, ele apenas medirá isso.

É por isso que você precisa de um ponto de referência. Se você conectar o pino GPIO a 0V (GND) por padrão, então ele medirá 0V enquanto o botão não estiver pressionado. Mas se você não fizer isso, o valor do pino GPIO pode estar em qualquer lugar – até mesmo volts negativos!
Pinos flutuantes podem fazer algumas coisas interessantes, no entanto. Se você deixar um pino flutuante, ele pode sentir a diferença de voltagem no ar, medindo até mesmo o efeito de ter seu dedo se movendo perto do próprio pino. É como um sensor de presença eletromagnética ou algo assim.
É uma pena que você não possa fazer isso no Raspberry Pi. Para que isso seja útil, você precisará de pinos analógicos, e o Raspberry Pi não os possui.
Código para Botões de Pressão
Sabendo disso, você deve entender que o pino 7 sente se 3.3V ou 0V passa por ele. Se ele sente 3.3V, então se reporta como HIGH. Mas se sente 0V, então está LOW.
Vamos dividir o código em três partes: comandos de importação, comandos de configuração e comandos em loop.
Comandos de Importação
Estamos usando dois comandos de importação:
import RPi.GPIO as GPIO
from time import sleepimport RPi.GPIO as GPIO importa o módulo RPi.GPIO, que permite que você faça coisas com os pinos GPIO do seu Raspberry Pi. Ao adicionar as GPIO no final, você está dizendo ao Python que digitar GPIO é equivalente a digitar RPi.GPIO. Você pode até substituí-lo por outras strings, e o código ainda deve funcionar, desde que você o formate corretamente.
Por outro lado, from time import sleep importa apenas uma parte do módulo de tempo do Python. Ele permite que você use a função sleep().
Comandos de Configuração
Estamos trabalhando com os três comandos do módulo RPi.GPIO nos comandos de configuração para corrigir algumas configurações.
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)O módulo RPi.GPIO normalmente mostra uma mensagem que avisa sobre o uso dos pinos GPIO assim que você inicia o script Python. GPIO.setwarnings(False) impede que isso aconteça.
GPIO.setmode(GPIO.BOARD) é outro comando do módulo RPi.GPIO. Ele diz ao Python que você está usando a pinagem “BOARD”. Existem dois tipos de pinagem no RPi.GPIO: BOARD e BCM. BOARD permite que você escolha pinos usando os números dos pinos. BCM (abreviação de “Broadcom”) permite que você escolha pinos com seu Canal SOC Broadcom individual. BOARD é muito mais fácil de usar, pois é sempre o mesmo, não importa que tipo de placa Raspberry Pi você use. A pinagem BCM pode mudar dependendo do modelo que você usa.
Por fim, GPIO.setup(7, GPIO.IN) permite que você defina o pino 7 como um pino de entrada. Ele usa a função .setup() e lê 7 como o pino que você está tentando escolher. GPIO.IN significa que você está tentando definir isso como um pino de entrada.
Leia também: Guia do Iniciante para Arduino
Comandos em Loop
Sistemas embarcados normalmente usam apenas algumas linhas de código e as repetem indefinidamente. Diferentes linguagens de programação usam diferentes maneiras de fazer isso. Mas o conceito é o mesmo: elas usam algum tipo de loop. Para Python, isso é while True:.
while True:
if GPIO.input(7) == GPIO.HIGH:
print("Pin 7 is HIGH!")
elif GPIO.input(7) == GPIO.LOW:
print("Pin 7 is LOW...")
sleep(0.15)while True: permite que você execute o código indefinidamente. Tudo que você colocar dentro dele será executado para sempre, enquanto houver eletricidade na placa.
if GPIO.input(7) == GPIO.HIGH: é uma declaração if. Ela diz que se o pino 7, que é um pino de entrada, ler como HIGH, então deve fazer tudo dentro dela.
print("Pin 7 is HIGH!") está dentro de uma declaração if. Tudo o que faz é imprimir Pin 7 is HIGH! no console. Você pode substituir isso por qualquer string, número ou variável que contenha isso.
Em seguida, temos elif GPIO.input(7) == GPIO.LOW:. É basicamente o mesmo que if GPIO.input(7) == GPIO.HIGH: exceto pela primeira parte: usa elif em vez de if. O código elif significa Else If. O que ele diz é que se todo o código acima retornar falso, então o Python deve executar esta declaração else-if.
Por fim, sleep(0.15) pausa o código por 0.15 segundos. Por que pausar o código? É principalmente por questões de desempenho. O Raspberry Pi enviará o código de saída tão rápido que fará sua GUI travar um pouco. Isso é ainda mais pronunciado se você estiver usando seu Raspberry Pi via SSH. Haverá um atraso perceptível que só vai piorar com o tempo. Pausar o código o desacelera para evitar problemas de desempenho.
Leia também: Como Programar Arduino Através do Visual Studio Code Usando PlatformIO
Perguntas Frequentes
É seguro trocar pinos no Raspberry Pi enquanto está ligado?
Trocar pinos, ou substituir os pinos do Raspberry Pi enquanto está ligado, geralmente é uma má ideia. É sempre mais seguro removê-lo da fonte de alimentação antes de trocar.
O que torna os botões de pressão de 4 pinos melhores do que os de 3 pinos?
Em termos de utilidade, eles são basicamente os mesmos. Mas ter quatro pinos permite que você conecte o botão de pressão de 4 pinos a outro botão de pressão em um circuito em série.
Posso transformar qualquer pino do Raspberry Pi em um pino de entrada?
O Raspberry Pi pode ter 40 pinos, mas apenas 27 deles são GPIO. Você só pode programar pinos GPIO como pinos de entrada e saída. A maioria dos IDEs não permitirá que você reprograme um pino não-GPIO como um pino de entrada.
Todas as fotos e capturas de tela por Terenz Jomar Dela Cruz