FAVORITAR
FecharPlease loginn
11 Comentários
FAVORITAR
FecharPlease loginn

Raspberry PI – GPIO output com Python

IOs

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:

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.

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.

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://pt.wikipedia.org/wiki/General_Purpose_Input/Output
https://www.hobbytronics.co.uk/raspberry-pi-gpio-pinout

Outros artigos da série

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.
Home » Linux Embarcado » Raspberry PI – GPIO output com Python

WEBINARS

LEIA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Comentários:
Notificações
Notificar
guest

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.

Talvez você goste: