ÍNDICE DE CONTEÚDO
- Raspberry PI – GPIO output com Python
- Raspberry PI – GPIO input com Python
- Raspberry PI – PWM com Python
- Raspberry Pi – Display LCD com Python
- Raspberry Pi – Projeto Termômetro Digital com Python – Teoria
- Raspberry Pi – Projeto Termômetro Digital com Python – Prática
- Raspberry Pi – Comunicação Serial (UART) entre a Raspberry Pi e Arduino em Python e Wiring
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
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:
1 2 |
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.
1 |
cleiton@vm03 ~ $ apt-get update && apt-get -f -y install python-pip |
Vamos verificar o modulo RPi.GPIO e instalar.
1 2 3 4 |
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:
1 2 3 4 5 6 7 8 9 10 11 |
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.
1 |
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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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.
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
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 😉
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
Muito obrigado pela observação Victor, você tinha razão. Código corrigido!
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.
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.
Bem lembrado Daniel.
O Pingo é realmente fantástico.
Fazer uns testes com ele.