Manual
do
Maker
.
com
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.
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.
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.
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):
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:
Por mais que esteja muito bonito, é horrível ter que contar os pinos. Daí a solução mais atraente que encontrei foi...
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.
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?
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:
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)?
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:
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.
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:
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.
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:
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.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.