Manual

do

Maker

.

com

Vários modos de interagir com o GPIO do Raspberry Pi

Vários modos de interagir com o GPIO do Raspberry Pi

Existem diversas maneiras de interagir com o GPIO do Raspberry Pi. Em Linux, os dispositivos são arquivos descritores. Isto é, se temos um SSD conectado ao computador, ele aparecerá no sistema operacional como um arquivo dentro de /dev. Então manipulamos esse arquivo descritor para modificar informações do disco. Do mesmo modo, os pinos de GPIO possuem uma interface com o sistema que permite sua manipulação por linha de comando, sem precisar de programas para sua utilização. Não é incrível? E veja só como é fácil fazê-lo.

cd /sys/class/gpio

Dentro desse nível de diretório estão 2 arquivos e 1 link simbólico. Utiliza-se export para habilitar um pino para uso, unexport para desabilitá-lo.

gpio

Outra forma de acessar os GPIO é através do programa gpio. Ele utiliza uma notação que referencia diretamente o respectivo GPIO, facilitando a interação com o recurso. Porém na board a posição do pino continuará não tendo relação com o número do GPIO.

Relação do pinos

Os pinos disponíveis para uso são o 0, 1, 4, 7 a 11, 15, 17, 18, 21 a 25 etc. Mas esses números não tem relação direta com a posição dos pinos no header.  Pra piorar, na própria board não temos uma identificação, o que acaba nos fazendo depender sempre de uma imagem do pinout.

Vamos ver uma tabelinha pra ajudar (revisão A e adjuntamente, revisão B):

relacao_pinos.jpg

Nessa tabela temos a referência do wiringPi, que aponta para o número do pino. Ao centro, temos o BMC, que se refere ao número que utilizamos quando fazemos o acesso ao pino pela interface /sys/class/gpio. Na coluna da direita, temos os nomes das funções de cada pino. Por fim, a coluna central contém o número dos pinos no header; esse é o número conforme a posição física. Já ajuda agora, hum? Mas, e os headers de 40 pinos?

Procurando rapidamente no google images, encontrei essa relação que achei bem interessante, porque está referenciando a direção de leitura dos pinos, de modo que dá pra saber onde é o pino 1:

bmc_header_pinout.webp

Por mais que esteja muito bonito, é horrível ter que contar os pinos. Daí a solução mais atraente que encontrei foi...

Shield expansor de GPIO para Raspberry

Esse shield lhe oferece 3 colunas de 40 pinos. Claro que podemos utilizar o mesmo pino para acionamentos diferentes (e simultâneos), lembrando sempre da regra de consumo citada mais adiante. Como se não bastasse a vantagem de tornar-se independente de protoboard para pequenas conexões, ainda tem a descrição dos GPIO e dos recursos como SPI e I2C! Realmente, é uma solução super agradável para não ter que ficar esfregando a ponta do dedo na barra de pinos para saber onde conectar um jumper.

Esse shield você encontra na UsinaInfo através desse link.

Interagir com o GPIO utilizando /sys/class/gpio

Esse modo é bastante simples de utilizar e vai bem em um shell script. Mas antes de fazer um shell script, vamos compreender o conceito.

O diretório /sys/class/gpio contém as seguintes referẽncias:

export   gpiochip0   unexport

Para habilitar um pino (por exemplo GPIO3, que é o pino 15), executamos o comando:

echo 15 >export

Após o comando, teremos um link simbólico para o pino 15 do header:

export   gpio15   gpiochip0   unexport

Esse comando habilitou a manipulação do pino. Agora vamos pensar como em qualquer microcontrolador; o que fazemos para manipular um pino?

  • Primeiramente, definimos a direção
  • Depois, em algum momento definimos seu estado, ou lemos seu estado.

E algumas coisas mais são possíveis também, como a borda para uma interrupção. No Arduino utilizamos pinMode(pino,direção). No Raspberry utilizamos o comando echo para definir se é input ou output:

set_direction_of_pin-300x126.webp

Repare que utilizei o comando echo out >gpio15/direction e seu estado inicial era in. Daí já envolvemos mais um conceito interessante. No Arduino utilizamos **digitalRead()**para ler o estado de um pino, enquanto no Raspberry simplesmente utilizamos o comando cat para ver o conteúdo do arquivo descritor do pino. Colocamos o pino 15 em output. Qual seu valor agora (HIGH = 1 e LOW = 0)?

value_of_pin_15-300x63.webp

Repare que quando o pino está configurado para input, seu estado é 1, mas quando mudamos a direção para output, automaticamente o pino vai para LOW. Daí podemos simplesmente utilizar o comando echo 1 >gpio15/value para, por exemplo, acionar um relé.

Uma coisa que devemos estar sempre atentos é em relação ao uso do pino e tensão/corrente. Isso porque:

  • O GPIO não é tolerante a 5V - logo, não podemos entrar com esse nível de leitura.
  • O consumo máximo dos pinos somados não deve passar 50mA.
  • O consumo máximo de um pino não deve ultrapassar 16mA.

Por isso é bom utilizar a lógica invertida que, invés de alimentar a partir do Raspberry, utiliza-se do pino para fazer o papel de gnd quando colocado em LOW. Para se ter uma ideia do quanto isso é representativo, um LED de alto brilho consome 3.7V@25mA, ou seja, os pinos do Raspberry não dão conta de um único LED. "Bã, mãs eu fizi issu i nun queimô". Beleza. Continue fazendo para tirar a prova.

Há algum tempo eu escrevi um artigo que considero muito importante como referẽncia sempre, inclusive eu o utilizo para quando necessito verificar detalhes que não me estão frescos à memória. Sugiro que dê uma lida, é bastante esclarecedor.

Interagir com o GPIO utilizando WiringPi

Como uso um sistema personalizado, não sei dizer se o WiringPi vem instalado por padrão. De qualquer modo, a dica de instalação não fará mal algum.

sudo su
apt-get update
apt-get install wiringpi
exit

O comando exit é para abandonar o usuário root, que é assumido com o comando sudo su.

Tendo instalado o programa, já podemos fazer algumas brincadeiras. Vou mostrar algumas interações com todas as referências que estou fazendo, mas não vou publicar o video juntamente com esse artigo, porque ainda preciso gravar. No momento, vou deixar apenas a referência do comando:

wiringpi.webp

Utilizando o WiringPi fica fácil utilizar PWM, fazer um blink e outras coisas relacionadas ao controle dos pinos. Não consigo afirmar se é mais fácil ou mais complexo do que manipular o pino diretamente em /sys/class/gpio, porque para mim é natural utilizar linha de comando e acesso direto aos recursos do sistema, já que trabalhei muitos anos com administração de servidores Linux, redes e estruturas de telecom.

Interagir com o GPIO utilizando Python

Se você programa em Python, já deve estar abandonando todas as opções anteriores. Python é mais simples e intuitivo que shell script, apesar de ainda consumir mais linhas de código.

O primeiro passo é instalar o gerenciador de pacotes Python, o pip. Se já estiver instalado, fazer um update para garantir uma base de pacotes atualizada. Então os passos seriam:

sudo su
#se já estiver instalado:
pip install --upgrade pip
#Senão...
apt-get instal python-pip
#e então...
pip install RPi.GPIO


Se quiser dar uma olhada no que mais tem, você pode executar o comando:

pip search RPi

Vai aparecer muita coisa e com certeza você vai ter vontade de instalar outros pacotes, se for programador Python.

Agora, pra visualizar os recursos disponíveis nessa biblioteca, sugiro que instale o programa bpython. Ele é um programa para programação em fluxo, de modo que você vai escrevendo o programa e ele vai executando. É muito útil para quando estiver testando recursos, mas o mais interessante dele é o auto-complete, que te permite ver todos os recursos de uma determinada biblioteca. Para instalá-lo:

sudo su
apt-get update
apt-get install bpython

Depois de instalado, basta digitar o comando bpython no terminal. Daí, basta importar a biblioteca e começar a experimentar.

Se utilizarmos o modo BOARD, deveremos passar o número do pino no header, contando um a um para saber a posição. Se utilizarmos o modo BMC, podemos apontar diretamente o GPIO. Mais uma vez o exemplo do GPIO3 (BMC) que é o pino 15 (BOARD). Nesse ponto posso reafirmar, nada vai ser mais prático do que utilizar o shield para Raspberry da UsinaInfo, porque em cima do shield está silkado o GPIO!

Agora, fazendo um blink diretamente no terminal do bpython:

gpio_python_blink.png

Fora isso, ainda podemos interagir em C ou C++, abrindo os arquivos descritores em /sys/class/gpio. É diversão que não acaba mais! Dá uma chegada lá no nosso canal no YouTube e se não for inscrito, se inscreve pra receber uma notificação quando o video estiver pronto.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.