Controle GPIO da Raspberry Pi e Python – Parte 2

Este é um tutorial sobre como usar a GPIO da Raspberry Pi usando a biblioteca Python. Ele foi dividido em quatro partes para facilitar o acesso:

  • Parte 1: introdução e configuração
  • Parte 2: acesso às entradas e saídas
  • Parte 3: aguardando eventos
  • Parte 4: callbacks

Introdução

Vimos no artigo anterior como configurar a GPIO da Raspberry Pi, sua pinagem e um programa básico em Python para piscar um LED. Neste artigo vamos mostrar algumas funcionalidades mais avançadas da biblioteca em Python de acesso a GPIO e como fazer a leitura da uma entrada.

]5 Raspberry Pi 1 (esquerda) e Raspberry Pi 3 (direita)

Materiais necessários

  • Raspberry Pi com sistema operacional Raspbian já instalado (vamos usar o a RPi 2 modelo B, mas pode ser utilizado outro, caso queira)
  • Led
  • Resistor 100 Ohm
  • Push button
  • Jumpers
  • Protoboard

Conexão

O circuito utilizado aqui vai ser um pouco diferente do anterior. Agora vamos usar dois LEDs e dois botões, como mostrado no esquemático abaixo.

  • Conectar o lado positivo LED (anodo) ao pino 12 (GPIO 18) da RPi. O lado negativo conectar ao resistor e o outro lado do resistor ao terra (GND).
  • Conectar o lado positivo do outro LED (anodo) ao pino 16 (GPIO 23) da RPi. O lado negativo conectar ao resistor e o outro lado do resistor ao terra (GND).
  • Conectar um lado do push button ao pino 18 (GPIO 24) da RPi e o outro lado ao terra (GND).
  • Conectar um lado do outro push button ao pino 22 (GPIO 25) e o outro lado ao 3.3V.

Configuração

Primeiramente, precisamos incluir a biblioteca para podermos usar.

import RPi.GPIO as GPIO

A partir de agora, quando precisarmos usar a biblioteca, podemos usar diretamente GPIO (muito mais fácil, né?).

Depois, precisamos configurar o modo como vamos acessar os pinos. Como você deve ter percebido anteriormente, os pinos de GPIO da RPi pode ter duas formas de serem identificados:

  • GPIO: é a forma como a RPi “vê” os pinos. Os números não fazem nenhum sentido, é simplesmente como os pinos estão conectados diretamente ao chiṕ da Broadcom. Provavelmente, para identificar corretamente os pinos você vai precisar de alguma ajuda (normalmente, caso esteja usando o extensor, ele já vem impresso esse modo também). Para a biblioteca, esse modo é identificado como GPIO.BCM.
  • Físico: a outra forma é simplesmente contando o pino fisicamente. O pino 1 se refere ao pino superior esquerdo (mais próximo ao SD Card). A figura abaixo mostra o pinos na “forma física”. Para a biblioteca, esse modo é identificado como GPIO.BOARD.

Qual modo você vai usar depende do que você se sente mais confortável. Caso esteja conectando diretamente a RPi, o modo físico é mais fácil. Para fazer a configuração, basta usar a função GPIO.setmode([mode]).

GPIO.setmode(GPIO.BOARD)

Antes de poder ser utilizado, cada pino deve ser setado com o modo que vai ser trabalhado (GPIO.IN para entrada ou GPIO.OUT para saída) através da função GPIO.setup([pin], [mode]). Essa função pode ser usada a qualquer momento do código e o pino pode ser alterado de função a qualquer momento.

GPIO.setup(12, GPIO.OUT)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(18, GPIO.IN)
GPIO.setup(22, GPIO.IN)

O número do pino deve ser de acordo com o que foi configurado anteriormente em GPIO.setmode.

Saída

Para deixar um pino como nível alto ou nível baixo, basta usar a função GPIO.output([pin], [level]). O nível pode ser definido como GPIO.HIGH, 1 ou True quando se quiser nível alto; ou GPIO.LOW, 0 ou False para quando se quiser nível baixo.

GPIO.output(12, GPIO.LOW)
GPIO.output(16, True)

O pino 12 (GPIO 18) também pode ser utilizado como saída PWM (somente ele tem essa capacidade). Para inicializar o PWM, utilize a função GPIO.PWM([pin], [frequencia]). Atribua essa função a uma variável para você poder controlar depois durante o programa. Para iniciar, use o comando pwm.start([duty cicle]).

Você pode mudar o valor da saída PWM através da função pwm.ChangeDutyCicle([duty cicle]) a qualquer momento. Para interromper, use pwm.stop.

pwm = GPIO.PWM(12, 1000)
pwm.start(75)
pwm.ChangeDutyCycle(50)
pwm.stop()

Não se esqueça de configurar o pino como saída antes de usar.

Entrada

Se um pino é configurado como entrada, você pode usar a função GPIO.input([pin]) para ler o seu valor. Essa função retorna True ou False indicando se o pino está em nível alto ou baixo, respectivamente. Você pode usar então dentro de um if para fazer a sua ação.

if GPIO.input(18):
    print('Pino 18 está acionado')
else:
    print('Pino 18 está baixo')

Lembra quando configuramos o pino como estrada ou saída na função GPIO.setup? Existe para essa função um terceiro parâmetro, que você pode setar um resistor de pull-up (GPIO.PUD_UP) ou pull-down (GPIO.PUD_DOWN).

GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

Caso nada seja declarado no terceiro parâmetro, ambos os resistores são desabilitados.

Programando

Para assimilarmos o que aprendemos até agora, vamos fazer um programa simples para acionar um LED quando o botão for pressionado.

Acredito que o código abaixo é bem auto-explicativo com seus comentários. Copie-o e salve em um arquivo chamado bot_led.py

import RPi.GPIO as GPIO
import time
 
LedPin = 12    # pin12 --- led
BtnPin = 18    # pin12 --- button
 
GPIO.setmode(GPIO.BOARD)       # Pinagem física
GPIO.setup(LedPin, GPIO.OUT)   # Pino de led como saída
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)    # Pino do botão como saída e aciona o pull-up
GPIO.output(LedPin, GPIO.HIGH) # Desliga o led
 
print('Pressione Ctrl+C para sair')
# Loop principal
try:
    while True:
        # Como estamos usando o botao no pino 18, sem acionar o nivel ja e
        # alto. Quando pressionado, ele envia o sinal de terra ao pino.
        # Por isso recebemos nível baixo ao ser pressionado.
        if GPIO.input(BtnPin) == GPIO.LOW:
            print('Liga o LED...')
            GPIO.output(LedPin, 1)
        else:
            print('Desliga o LED...')
            GPIO.output(LedPin, 1)
 
        # Aguarda um tempo
        time.sleep(1)
 
except KeyboardInterrupt:
    # Ctrl+C foi pressionado
    pass
 
GPIO.output(LedPin, 0)
GPIO.cleanup()  # Limpa configuração

Execute o programa:

python bot_led.py

Pressione o botão para ver o LED acender. Você deve verificar que ocorre um atraso entre você apertar o botão e o LED realmente acender. Isso é causado pelo tempo que colocamos entre uma verificação e outra. Vamos resolver isso no próximo artigo da série.

2 opiniões sobre “Controle GPIO da Raspberry Pi e Python – Parte 2”

  1. Muito bom o material, muito obrigado! Colaborando, favor corrigir as linhas para o correto funcionamento do programa!

    GPIO.output(LedPin, GPIO.HIGH) # Desliga o led ///// HIGH por LOW
    print(‘Desliga o LED…’)
    GPIO.output(LedPin, 1) ///// 1 por 0

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *