Manipulando os pinos do Raspberry Pi através do sysfs
Em algum lugar alguém uma vez falou que Python é uma linguagem bem fácil de aprender. Talvez por isso deram tanto suporte a ela no RPi, mas... e pra quem já curte uma outra linguagem, tipo PHP?
Veja, fiquei um tempo sem programar pro RPi e hoje, quando voltei, me enrolei todo. Sou adepto a ideia de que o lance é usar uma linguagem apenas, sempre que possível, pois, quando se tem muitas linguagens na cabeça, não dá pra ficar bom em nenhuma delas.
Pois bem. Decidi migrar de Python para PHP no RPi, principalmente agora que quero trabalhar com integração. Pesquisei e percebi que isso não era difícil. Veja os motivos
$ /sys/class/gpio
Aqui dentro ficam, inicialmente, dois arquivos (três, mas ainda não sei nada sobre o gpiochip0):
- export: escrevemos aqui os pinos que vamos habilitar;
- unexport: e aqui os pinos que vamos desabilitar;
Se eu fizer direito, poderei manipular esses arquivos através de qualquer linguagem de programação, até mesmo linguagem de script como o PHP.
Então, o primeiro passo pra fazer a mágica acontecer é ser usuário root ou participar do grupo gpio. Prefiro não ser root (diferente desse post aqui), então vou habilitar o usuário "pi" no grupo "gpio":
$ sudo usermod -a -G gpio pi
O usuário pi agora pode manipular diretamente tudo que o grupo gpio pode.
Com o circuito confeccionado chegou a hora de criar os arquivos que manipularão os pinos. Antes de dar o comando, certifique-se de estar na pasta $ /sys/class/gpio:
$ echo "22" > ./export
Use o comando "ls" para verificar os arquivos da pasta:
Note que o diretório gpio22 foi criado. Quando você enviou "22" para o arquivo "export", o sistema se encarregou de criar a estrutura de pastas para manipulação do pino correspondente. Para consultar o todo conteúdo desse diretório, use:
$ ls -l gpio22/
Dessa vez usei o parâmetro "-l" para identificar o tipo de cada um dos itens do diretório, além das informações sobre o que cada usuário pode fazer. Perceba que o item que começa com um traço (-) é um arquivo, os que começam com a letra "l" são links. Diretórios começam com a letra "d". Vou habilitar os outros pinos:
$ echo "23" > ./export & echo "24" > ./export
O comando "echo" envia uma saída para o terminal (essa tela preta aí). Usando ">", echo envia o conteúdo entre aspas para um arquivo; export nesse caso. Usei "./" antes de export pra indicar que esse arquivo está aqui mesmo nesse diretório. Usei & para enviar vários comandos ao mesmo tempo.
Como todos eles serão configurados como "out", então lá vai:
$ echo "out" > ./gpio22/direction & echo "out" > ./gpio23/direction & echo "out" > ./gpio24/direction
Se você montou seu circuito com um LED de ânodo comum, então ele já vai ficar branco. Acontece que, enviando "0" para o pino, a corrente passa, então, como o conteúdo do arquivo value é [vazio], acaba interpretado como "0", daí todas as cores acendem.
Note que se o seu LED for de cátodo comum, então nada deve ter acontecido.
$ echo "1" > ./gpio24/value & echo "1" > ./gpio23/value & echo "0" > ./gpio22/value
E só o vermelho...
$ echo "0" > ./gpio24/value & echo "1" > ./gpio23/value & echo "1" > ./gpio22/value
E só o verde
$ echo "1" > ./gpio24/value & echo "0" > ./gpio23/value & echo "1" > ./gpio22/value
$ echo "22" > ./unexport & echo "23" > ./unexport & echo "24" > ./unexport
Isso é suficiente para deixar os pinos em seu estado natural e apagar os diretórios e arquivos criados nos comandos anteriores.
Veja, fiquei um tempo sem programar pro RPi e hoje, quando voltei, me enrolei todo. Sou adepto a ideia de que o lance é usar uma linguagem apenas, sempre que possível, pois, quando se tem muitas linguagens na cabeça, não dá pra ficar bom em nenhuma delas.
Pois bem. Decidi migrar de Python para PHP no RPi, principalmente agora que quero trabalhar com integração. Pesquisei e percebi que isso não era difícil. Veja os motivos
É Linux rodando no Raspberry Pi
Isso quer dizer que todos os processos de hardware pode ser interpretados como arquivos de texto através do sysfs. Então, para enviar um sinal para um pino qualquer, basta escrever no arquivo correspondente ao pino e pronto, tudo feito.Ele é um bom servidor Apache + PHP
E também de banco de dados. Claro que ele não será, sozinho, tão rápido quanto ter as páginas num servidor na web ou no próprio PC, mas, com alguns ajustes, e tendo objetivos claro em mente, dá pra fazer praticamente tudo com ele, afinal, ele é um computador.Eu domino PHP
Não tão bem quanto gostaria, mas já conheço a sintaxe, as manhas, e posso desenvolver um conjunto de classes que manipulem o hardware numa velocidade muito superior a qual levaria pra fazer o mesmo em Python ou C++.Mas, antes da queda, o coice.
A primeira coisa que, de longe, devemos fazer, é entender como funciona a manipulação dos pinos através da escrita direta dos arquivos. Isso no Linux é conhecido por "sysfs". Os diretórios e arquivos responsáveis pela manipulação dos pinos no RPi ficam em:$ /sys/class/gpio
Se Linux não é sua praia, use cd /sys/class/gpio para acessar a pasta
Aqui dentro ficam, inicialmente, dois arquivos (três, mas ainda não sei nada sobre o gpiochip0):
- export: escrevemos aqui os pinos que vamos habilitar;
- unexport: e aqui os pinos que vamos desabilitar;
Se eu fizer direito, poderei manipular esses arquivos através de qualquer linguagem de programação, até mesmo linguagem de script como o PHP.
Então, o primeiro passo pra fazer a mágica acontecer é ser usuário root ou participar do grupo gpio. Prefiro não ser root (diferente desse post aqui), então vou habilitar o usuário "pi" no grupo "gpio":
$ sudo usermod -a -G gpio pi
O usuário pi agora pode manipular diretamente tudo que o grupo gpio pode.
Habilitando pinos
Antes de usar um pino precisamos habilitá-lo. A numeração dos pinos seguirá o formato padrão GPIO, ou seja: GPIO22 para o pino 15, GPIO23 para o pino 16, etc. Usarei esse circuito aqui para conectar o LED.Com o circuito confeccionado chegou a hora de criar os arquivos que manipularão os pinos. Antes de dar o comando, certifique-se de estar na pasta $ /sys/class/gpio:
$ echo "22" > ./export
Use o comando "ls" para verificar os arquivos da pasta:
Olha um novo arquivo aí...
Note que o diretório gpio22 foi criado. Quando você enviou "22" para o arquivo "export", o sistema se encarregou de criar a estrutura de pastas para manipulação do pino correspondente. Para consultar o todo conteúdo desse diretório, use:
$ ls -l gpio22/
Conteúdo do diretório.
Dessa vez usei o parâmetro "-l" para identificar o tipo de cada um dos itens do diretório, além das informações sobre o que cada usuário pode fazer. Perceba que o item que começa com um traço (-) é um arquivo, os que começam com a letra "l" são links. Diretórios começam com a letra "d". Vou habilitar os outros pinos:
$ echo "23" > ./export & echo "24" > ./export
O comando "echo" envia uma saída para o terminal (essa tela preta aí). Usando ">", echo envia o conteúdo entre aspas para um arquivo; export nesse caso. Usei "./" antes de export pra indicar que esse arquivo está aqui mesmo nesse diretório. Usei & para enviar vários comandos ao mesmo tempo.
Entrada? Saída? Algo mais?
Ao listarmos o conteúdo da pasta do pino, demos de cara com um arquivo chamado "direction" e outro chamado "value". No direction gravamos a direção do pino, e no value escrevemos "0" ou "1" para "desligado" ou "ligado", respectivamente.Como todos eles serão configurados como "out", então lá vai:
$ echo "out" > ./gpio22/direction & echo "out" > ./gpio23/direction & echo "out" > ./gpio24/direction
Se você montou seu circuito com um LED de ânodo comum, então ele já vai ficar branco. Acontece que, enviando "0" para o pino, a corrente passa, então, como o conteúdo do arquivo value é [vazio], acaba interpretado como "0", daí todas as cores acendem.
Um branco rosado (o resistor do vermelho precisa ser mais forte)
Note que se o seu LED for de cátodo comum, então nada deve ter acontecido.
Passa ou repassa
Escrever no arquivo value para alterar o valor do pino segue a mesma regra. Vou deixar só o azul ligado (GPIO22):$ echo "1" > ./gpio24/value & echo "1" > ./gpio23/value & echo "0" > ./gpio22/value
E só o vermelho...
$ echo "0" > ./gpio24/value & echo "1" > ./gpio23/value & echo "1" > ./gpio22/value
E só o verde
$ echo "1" > ./gpio24/value & echo "0" > ./gpio23/value & echo "1" > ./gpio22/value
Terminando a brincadeira
Ok, isso já é bastante coisa pra um dia de estudos. Se eu não fizer mais nada, os arquivos ficarão lá até que o RPi seja desligado. Isso não é legal, então chegou a hora do unexport:$ echo "22" > ./unexport & echo "23" > ./unexport & echo "24" > ./unexport
Isso é suficiente para deixar os pinos em seu estado natural e apagar os diretórios e arquivos criados nos comandos anteriores.
Comentários
Postar um comentário