Raspberry PI - GPIO output 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

 

Figura 01 – Ligações Raspberry Pi GPIO
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:

 

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.

 

Vamos verificar o modulo RPi.GPIO e instalar.

 

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:

 

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.

 

 

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.

 

Figura 02 – Informações GPIO Raspberry Pi
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.

 

 

Para executar o código 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.

 

 

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

 

 

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

 

 

 

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://www.embarcados.com.br/arduino-vs-raspberry-pi/

http://pt.wikipedia.org/wiki/General_Purpose_Input/Output

http://www.hobbytronics.co.uk/raspberry-pi-gpio-pinout

http://cleitonbueno.wordpress.com/2014/08/25/python-solucionando-o-erro-fatal-error-python-h-no-such-file-or-directory-no-pip-install/

 

Outros artigos da série

Raspberry PI – GPIO input com Python >>
Proprietário da B2Open onde oferecemos consultoria, treinamentos e desenvolvimento em Sistemas Embarcados. Entusiasta a filosofia open-source, mais de 10 anos de experiências em Linux e FOSS. Em sistemas embarcado do firmware baremetal ao Linux Embedded, e há aproximadamente 8 anos desenvolvendo em (C, Python, Qt e muito Shell Script), além de profiling, hardening e tuning para targets com Linux Embarcado. Graduado em Engenharia da Computação pela UNICEP com ênfase em robótica e sistemas embarcados.

Deixe um comentário

11 Comentários em "Raspberry PI - GPIO output com Python"

Notificar
avatar
 
Ordenar por:   recentes | antigos | mais votados
trackback
O que pedir pro papai noel?

[…] Raspberry Pi - GPIO output com Python [11], escrito por Cleiton […]

trackback
Raspberry Pi A+

[…] PI – GPIO output com Python [16], escrito por Cleiton […]

trackback
Raspberry PI – GPIO input com Python | Boletim Industrial

[…] da série de interação com o GPIO (General Purpose Input Output) do Raspberry PI no modo Output [1] possui os passos fundamentais para esta segunda etapa como a preparação do ambiente. Nesta […]

trackback
Raspberry PI – GPIO input com Python - Embarcados - Sua fonte de informações sobre Sistemas Embarcados

[…] da série de interação com o GPIO (General Purpose Input Output) do RaspberryPI no modo Output [1] possui os passos fundamentais para esta segunda etapa como a preparação do ambiente. Nesta […]

Emilio Eiji
Visitante
Emilio Eiji

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

Victor Leite
Membro
Victor Leite

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

Daniel Quadros
Visitante
Daniel Quadros

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.

Diego Sueiro
Admin
Diego Sueiro

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

Fazer uns testes com ele.

wpDiscuz