Raspberry PI – GPIO output com Python

IOs
Este post faz parte da série Raspberry PI com Python

Introdução

Vimos no artigo ‘Python + Arduino – Comunicação Serial’ como é simples e prático iniciar uma comunicação serial passo-a-passo. Mas Python possui um leque maior de recursos para os sistemas embarcados como, por exemplo, interagir com um GPIO (General Purpose Input Output), ou melhor, os pinos programáveis de entrada e saída da placa Raspberry Pi.

Se não conhece a Raspberry PI recomendo ler o artigo Raspberry Pi, do Thiago Lima. Se já conhece essa board mas não é muito familiarizado com Linux, Vinicius Maciel escreveu o artigo Raspberry Pi e o Linux que irá dar uma excelente base sobre os dois assuntos.

Configuração do ambiente host

  • Board: Raspberry PI B
  • Distribuição: Raspbian – Debian Wheezy (2014-01-07)
  • Kernel 3.12.22
  • Python 2.7
  • RPi.GPIO 0.5.6

Esquema da ligação

IOs
Figura 01 – Ligações Raspberry Pi GPIO

Ligação simples como podemos ver na Figura01, onde ligamos o led vermelho ao GND e usando um resistor conectamos ao pino 12 (BOARD) [GPIO18 (BCM)] e o led verde ao GND e pino 11 (BOARD) [GPIO17 (BCM)], logo mais será compreendido os termos BOARD e BCM.

Lembre-se que o GPIO do Raspberry PI utiliza níveis de tensão 3.3V e deve-se utilizar o resistor correto no LED para não causar maiores danos, o que estou usando é um de 330Ohms, visto que era o que tinha disponível e atende a necessidade para a prática deste artigo (limita a correte em 10 mA.).

O Python por si só não sabe interagir com o GPIO (a menos que você utilize /sys/class/gpio/…, mas não é o foco neste artigo), então utilizaremos um módulo que já possui funções prontas para realizar todas as configurações e  interagir com os leds. O mais interessante é que foi possível usar o Python com a filosofia Arduino e criar algo fácil de trabalhar.

O modulo utilizado é o RPi.GPIO, possui licença MIT, e em poucas linhas você configura o modo, pino, direção e já começa a funcionar, é um modulo em constante atualização e promete em breve recursos para comunicar e interagir com SPI, I2C e PWM, já existe um o RPIO mas a licença é LGPLv3 e irei falar dele em um artigo futuro.

Preparando o ambiente

Vamos preparar o Raspbian para utilizar este módulo, utilizando pip (Gerenciador de Pacotes do Python). Não sabe se possui o pip? Execute o comando abaixo:

cleiton@vm03 ~ $ pip –version
pip 1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

Se for exibido um erro durante a etapa acima, execute o procedimento abaixo para instalar, caso seja como a saída acima, ignore a etapa abaixo.

cleiton@vm03 ~ $ apt-get update && apt-get -f -y  install python-pip

Vamos verificar o modulo RPi.GPIO e instalar.

cleiton@vm03 ~ $  pip search RPi.GPIO
RPIO-    Advanced GPIO for the Raspsberry Pi. Extends RPi.GPIO with PWM, GPIO interrupts, TCP socket interrupts, command line tools and more
RPi.GPIO-    A module to control Rapsberry Pi GPIO channels  
...

Pesquisar nos repositórios de pacotes do Python qualquer pacote que no nome ou descrição contenha a expressão informada, no caso RPi.GPIO. Neste caso instalaremos a segunda opção RPi.GPIO, que neste primeiro contato é a que vamos trabalhar, para instalar o pacote RPi.GPIO execute o comando abaixo:

cleiton@vm03 ~ $  pip install RPi.GPIO
Downloading/unpacking RPi.GPIO
Downloading RPi.GPIO-0.5.6.tar.gz
Running setup.py (path:/home/cleiton/projetos/python/rpi/proj_rpi_gpio/build/RPi.GPIO/setup.py) egg_info for package RPi.GPIO
Installing collected packages: RPi.GPIO
Running setup.py install for RPi.GPIO
building 'RPi.GPIO' extension
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c source/py_gpio.c -o build/temp.linux-x86_64-2.7/source/py_gpio.o
...
Successfully installed RPi.GPIO
Cleaning up...

Caso durante a instalação do RPi.GPIO um erro como “fatal error: Python.h: No such fileor directory” surgir, não se assuste, é ausência dos headers, algumas bibliotecas necessárias e ferramentas do Python para a construção do pacotes, e que é facilmente resolvido instalando o python-dev.

cleiton@vm03 ~ $  apt-get install python-dev

RPi.GPIO

Iremos ver agora as principais funções do RPi.GPIO e um detalhe importante ao interagir com o GPIO do Raspberry PI.

RPi.GPIO.setmode()=>Modo de acesso ao GPIO, BOARD (Posição física dos pinos) ou BCM (Numero após GPIO, deve-se tomar cuidado com a revisão da placa pois esta informação pode mudar)

RPi.GPIO.setup()=>Configura o pino: (pino e direção [IN ou OUT], exemplo:

RPi.GPIO.setup(12, RPi.GPIO.OUT)

RPi.GPIO.output()=>Configurar como saide: (pino e valor [HIGH ou LOW]), exemplo:

RPi.GPIO.output(12, RPi.GPIO.HIGH)

RPi.GPIO.input()=>Configurar como entrada: (pino) e possui retorno, exemplo:

valor_pino = RPi.GPIO.input(12)

RPi.GPIO.cleanup()=>Restaura para o estado anterior as portas que foram modificadas no programa, deve ser a ultima linha antes de finalizar o programa.

IOs
Figura 02 – Informações GPIO Raspberry Pi

Ao configurar o setmode() como BOARD ou BCM, a diferença é o número do pino, por exemplo, no esquema informado na Figura01 estamos utilizando o Led1(Vermelho) no GPIO18 e o Led2(Verde) no GPIO17, que baseado na Figura02 temos a seguinte informação:

BOARD: BCM
11: GPIO17
12: GPIO18

Se o setmode() for setado como BOARD, devemos usar o número 11 e 12 em setup(). Se for setado como BCM, devemos usar 17 e 18 em setup(). É importante se atentar neste detalhe para não ter maiores problemas.

Código

Agora o código necessário para fazer com que o led verde pisque usando Python no modo BOARD, vamos chamar o código abaixo de led1.py.

import RPi.GPIO as gpio
import time

# Configurando como BOARD, Pinos Fisicos
gpio.setmode(gpio.BOARD)

# Configurando a direcao do Pino
gpio.setup(11, gpio.OUT) # Usei 11 pois meu setmode é BOARD, se estive usando BCM seria 17
while True:
gpio.output(11, gpio.HIGH)
time.sleep(2)
gpio.output(11, gpio.LOW)
time.sleep(2)

# Desfazendo as modificações do GPIO
gpio.cleanup()

Para executar o código led1.py:

pi@rpb01 ~/python/led $ sudo python led1.py

OBS: Deve ser executado como sudo ou permissão de super-usuario visto que RPi.GPIO acessa /dev/mem.

Novamente o mesmo código, alterando apenas o modo para BCM e trocando para o outro led, no led2.py.

import RPi.GPIO as gpio
import time

# Configurando como BCM, Numeracao do GPIO
gpio.setmode(gpio.BCM)

# Configurando a direcao do Pino
gpio.setup(18, gpio.OUT) # Usei 18 pois meu setmode é BCM, se estive usando BOARD seria 12
while True:
gpio.output(18, gpio.HIGH)
time.sleep(2)
gpio.output(18, gpio.LOW)
time.sleep(2)

# Desfazendo as modificações do GPIO
gpio.cleanup()

Para encerrar, vamos interagir com os dois leds, utilizando modo BOARD, no código led1_2.py.

import RPi.GPIO as gpio
import time

# Configurando como BOARD, identificacao fisica dos pinos
gpio.setmode(gpio.BOARD)
print “ Configurando o modo de acesso ao GPIO - BOARD”
print

# Configurando a direcao do Pino
gpio.setup(11, gpio.OUT)
print “Setando modo OUTPUT no PINO11 GPIO17 [LED VERDE]”

gpio.setup(12, gpio.OUT)
print “Setando modo OUTPUT no PINO12 GPIO18 [LED VERMELHO]”
print

gpio.output(11, gpio.HIGH)
print “Led Verde aceso!”
time.sleep(2)

gpio.output(11, gpio.LOW)
print “Led Verde apagado!”
time.sleep(2)

print

gpio.output(12, gpio.HIGH)
print “Led Vermelho aceso!”
time.sleep(2)

gpio.output(12, gpio.LOW)
print “Led Vermelho apagado!”
time.sleep(2)

# Desfazendo as modificações do GPIO
gpio.cleanup()

print
print “Tchau…”

Executando o código, o led verde irá acender e apagar, na sequência o vermelho e no terminal será exibido como abaixo:

pi@rpb01 ~/python/led $ sudo python led1_2.py
Configurando o modo de acesso ao GPIO - BOARD

Setando modo OUTPUT no PINO 11 GPIO17 [LED VERDE]
Setando modo OUTPUT no PINO 12 GPIO18 [LED VERMELHO]

Led Verde aceso!
Led Verde apagado!
Led Vermelho aceso!
Led Vermelho apagado!
Voltando configuracoes default GPIO

Tchau...

Conclusão

Python é muito pratico, prototipar essas ideias e exemplos é brincadeira. Abstrai otimizações do código para melhorar a didática do exemplo e para melhor compreensão da linguagem e familiarizar com o Python, mas aos poucos, nos próximos irei partindo com ideias pythonicas.

O que vem por aí?

No próximo artigo vamos interagir com o GPIO usando um botão e ver alguns problemas e soluções que podem ser implementadas utilizando o RPi.GPIO.

Referências

https://pypi.python.org/pypi/RPi.GPIO
https://pt.wikipedia.org/wiki/General_Purpose_Input/Output
https://www.hobbytronics.co.uk/raspberry-pi-gpio-pinout

Raspberry PI com Python

Raspberry PI – GPIO input com Python
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
11 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Emilio Eiji
24/09/2014 16:47

No parágrafo antes de explicar a imagem você escreveu o seguinte:

“RPi.GPIO.setmode()=>Modo de acesso ao GPIO, BOARD (Posição física dos pinos) ou BCM (Numero após GPIO, deve-se tomar cuidado com a revisão da placa pois esta informação pode mudar)”

E após a imagem você escreveu o seguinte:

“Se o setmode() for setado como BCM, devemos usar o número 11 e 12 em setup(). Se for setado como BOARD, devemos usar 17 e 18 em setup(). É importante se atentar neste detalhe para não ter maiores problemas.”

O BOARD não seria do 1 ao 26 e o BCM as GPIO?

Abraços

Cleiton Bueno
Reply to  Emilio Eiji
27/10/2014 22:12

Opa Emilio, tudo bom? Você esta certíssimo, esta incorreto a maneira que estava escrita, e o correto é BOARD a posição física dos pinos (P1) e BCM o GPIO. Já corrigi, obrigado 😉

Victor Leite
Victor Leite
09/09/2014 10:40

Parabéns pelo artigo Cleiton!
Mas vale lembrar que em alguns exemplos você usou o objeto meu_gpio para configurar as portas sendo que fez o import do módulo como gpio, e isso irá gerar algum erro ou comportamento inesperado.

[]’s

Cleiton Bueno
Reply to  Victor Leite
16/09/2014 08:54

Muito obrigado pela observação Victor, você tinha razão. Código corrigido!

Daniel Quadros
Daniel Quadros
05/09/2014 13:07

Uma opção mais “universal” (suporta tanto a Rasp Pi como a Begalebone Black e outras placas) é a biblioteca Pingo – https://garoa.net.br/wiki/Pingo.

Cleiton Bueno
Reply to  Daniel Quadros
05/09/2014 14:31

Que legal Daniel, não conhecia valeu a dica! Vi que usa o RPi.GPIO para o modulo Raspberry PI, achei interessante ter esses suportes a mais board visando um port da aplicação.
Outra coisa é o tipo de licença MIT, muito interessante isso 😉

Abraço.

Diego Sueiro
Diego Sueiro
Reply to  Daniel Quadros
05/09/2014 14:38

Bem lembrado Daniel.
O Pingo é realmente fantástico.

Fazer uns testes com ele.

Home » Hardware » Placas de desenvolvimento » Raspberry PI – GPIO output com Python

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: