Atualmente, muitos produtos e equipamentos utilizam como base o sistema operacional Linux. Nesse aspecto, é comum dizer que o produto ou equipamento em questão utiliza “Linux embarcado”, o que nada mais é que dizer que o equipamento é capaz de rodar uma distribuição Linux, muitas vezes otimizada para o uso referido.
Sem dúvidas, o uso de Linux embarcado facilita muito a vida de quem desenvolve produtos e equipamentos diversos. Uma vez que utilizando um sistema operacional do tipo, é possível ter à disposição suporte a conectividades diversas (wifi, Bluetooth, Ethernet etc.), suporte a criação de interfaces gráficas muito ricas e tudo mais que um computador pessoal poderia oferecer. As grandes vantagens aqui ficam por conta de oferecer o mesmo poder computacional de um computador pessoal com as facilidades de se ter um tamanho diminuto, ter baixo consumo de energia elétrica e, ainda, ter uma relação custo / benefício muito boa.
Dada a importância e versatilidade do Linux embarcado na tecnologia atual, este artigo vai ensinar uma das mais básicas e importantes tarefas de um sistema com Linux embarcado que deve interagir com circuitos externos: controle de GPIOs via linha de comando. Para tornar o aprendizado mais acessível, será usado como hardware a popular Raspberry Pi, acionando um relé.
Material necessário
Para seguir os passos deste artigo, você precisará de:
Uma placa Raspberry Pi, de qualquer modelo. Este artigo utilizará a placa Raspberry Pi 3B por razões de popularidade e disponibilidade para compra.
Um cartão micro-SD de, no mínimo, 8GB
Uma fonte chaveada 5V / 3A, com conector micro-USB
Protoboard (400 pontos)
Um relé com tensão de bobina de 5V
Um diodo 1N4007
Um resistor de 100k? / 0.25W
Um resistor de 10k? / 0.25W
Um transistor FQP30N06L (MOSFET canal N)
Jumpers macho-macho e macho-fêmea
Pré-requisitos
Este artigo assume que sua Raspberry Pi já esteja operante, ou seja, com sistema operacional Linux (Raspberry Pi OS ou Raspbian) já instalado e conectividade à rede funcionando.
Caso você não saiba como fazer isso, leia este artigo (https://www.newtoncbraga.com.br/index.php/microcontrolador/143-tecnologia/16859-raspberry-pi-3b-do-zero-ao-uso-com-linux-mic369) que explica detalhadamente como preparar sua Raspberry Pi para o uso.
GPIOs na Raspberry Pi
Inicialmente, é preciso saber o que é um GPIO. O acrônimo GPIO faz referência a General Purpose Input / Output, o que significa entrada/saída de propósito geral. Um GPIO consiste de um pino de um microcontrolador / SoC / SIP que pode ser configurado para operar como entrada digital ou saída digital. Ou seja, pinos com a designação GPIO podem servir de entrada ou saída digital para seu projeto, conforme sua necessidade.
A Raspberry Pi oferece um header de expansão de 40 pinos, dentre os quais estão GPIOs que o usuário / desenvolvedor pode utilizar livremente para seus projetos. Este header é o mesmo para todas as Raspberry Pi mais recentes (mais presentes no mercado), exceto para as primeiras produzidas, onde eram usados 26 pinos somente no header de expansão. Veja na figura 1 a localização deste header e o que cada um dos 40 pinos possui de funcionalidade.
Na figura 1, é possível ver que, dentre os pinos presentes, alguns possuem a funcionalidade de GPIOs. São estes que podemos usar no exemplo / experimento deste artigo (acionamento de um relé).
Pontos de atenção
Os GPIOs da Raspberry Pi possuem alguns pontos de atenção, conforme descritos abaixo. Não os obedecer significa correr um grande risco de destruir sua Raspberry Pi.
1. Nível de tensão: os GPIOs da Raspberry Pi trabalham com nível de tensão máximo de 3,3V, não tolerante a 5V.
2. Corrente de saída (GPIOs configurados como output): os GPIOs da Raspberry Pi configurados como output podem oferecer no máximo 16mA de corrente, sendo que o máximo de corrente fornecida por todos os GPIOs em modo output não deve superar 50mA. Dessa forma, é altamente recomendável utilizar circuitos como opto acopladores ou boosts de corrente (com transistores BJT ou MOSFET canal N) em tais GPIOs, visando utilizar a menor corrente elétrica possível deles.
GPIOs no Linux embarcado
O Linux possui um framework dedicado ao acesso e controle dos GPIOs, chamado de GPIO framework (sua documentação completa pode ser acessada clicando aqui https://www.kernel.org/doc/html/latest/driver-api/gpio/index.html ). Esse framework disponibiliza acesso aos GPIOs via sysfs, acessível por linha de comando, a partir de arquivos no diretório /sys/class/gpio. Isso significa dizer que, no Linux embarcado, o uso dos GPIOs (escrita e leitura) é feito a partir de escritas e leituras em arquivos deste diretório.
Sendo assim, a primeira coisa a ser feita antes de efetivamente manipular os GPIOs é ir ao diretório dos GPIOs no syfs: /sys/class/gpio. Para isso utilize o comando abaixo:
cd /sys/class/gpio
Para utilizar um GPIO no Linux, seja para escrita ou leitura, é preciso primeiramente exportá-lo para o usuário. Isso é feito escrevendo-se o GPIO desejado no arquivo /sys/class/gpio/export. Assumindo que você já esteja no diretório /sys/class/gpio, para utilizar o GPIO 17, por exemplo, use o seguinte comando:
echo 17 > export
Feito isso, o diretório gpio17 irá surgir dentro de /sys/class/gpio. Este diretório conterá todos os arquivos para configurar e utilizar o GPIO17. Para acessar este diretório, utilize o comando abaixo:
cd /sys/class/gpio/gpio17
O modo de operação do GPIO17 é definido no arquivo direction, contido no diretório do GPIO17 (cd /sys/class/gpio/gpio17). Este modo de operação pode ser:
in: neste modo de operação, o GPIO será configurado como entrada digital.
Por exemplo: para configurar o GPIO17 como entrada digital, assumindo que você já esteja no diretório /sys/class/gpio/gpio17, utilize o comando abaixo:
echo “in” > direction
out: neste modo de operação, o GPIO será configurado como saída digital.
Por exemplo: para configurar o GPIO17 como saída digital, assumindo que você já esteja no diretório /sys/class/gpio/gpio17, utilize o comando abaixo:
echo “out” > direction
Neste ponto, você já definiu o modo de operação do GPIO17. Vamos agora aprender a como escrever (modo: saída digital) e ler (modo: entrada digital) o GPIO17.
No modo de operação de saída digital (out): para fazer a escrita do GPIO17, ou seja, fazer com que o pino do header do GPIO17 tenha nível lógico alto (3,3V) ou baixo (0V), utilize o arquivo value, contido no diretório /sys/class/gpio/gpio17. Por exemplo, para fazer com que o pino do GPIO17 tenha tensão de 3,3V, assumindo que você já esteja no diretório /sys/class/gpio/gpio17, utilize o comando abaixo:
echo 1 > value
Já para fazer com que o pino do GPIO17 tenha tensão de 0V, assumindo que você já esteja no diretório /sys/class/gpio/gpio17, utilize o comando abaixo:
echo 0 > value
No modo de operação de entrada digital (in): para fazer a leitura do GPIO17, ou seja, saber se o pino do header correspondente ao GPIO17 possui nível lógico alto/1 (3,3V) ou baixo/0 (0V), assumindo que você já esteja no diretório /sys/class/gpio/gpio17, utilize o comando abaixo:
cat value
A resposta do comando será o nível lógico (0 ou 1) presente no pino do header correspondente ao GPIO17.
Acionando um relé via linha de comando no Linux embarcado
Agora, vamos botar em prática a manipulação de GPIOs no Linux acionando um relé via linha de comando no Linux embarcado. Para isso, primeiro é preciso montar o circuito esquemático mostrado na figura 2. Note que, assim como nos exemplos anteriores, aqui utilizaremos o GPIO17 para controlar o relé.
Uma vez montado o circuito esquemático da figura 2, podemos avançar para o acionamento do relé propriamente dito. Para isso, no terminal, configure o GPIO17 com modo de operação de saída digital. Para isso utilize os comandos abaixo:
cd /sys/class/gpio
echo 17 > export
cd gpio17
echo “out” > direction
Feito isso, o GPIO17 está pronto para controlar o relé. Para acionar o relé, utilize o seguinte comando:
echo 1 > value
E para desacionar o relé, utilize o comando abaixo:
echo 0 > value
Você pode ligar uma carga (circuito AC ou DC) na saída do relé e ver tal carga ser acionada ou desacionada mediante comandos feitos na linha de comando do Linux embarcado. Dessa forma, demonstramos o controle de cargas de diversas vias GPIO na linha de comando do Linux, utilizando como hardware uma placa Raspberry Pi.
Última etapa - liberação do GPIO para uso
No Linux embarcado, quando você faz o export do GPIO (conforme mostrado no tópico “GPIOs no Linux embarcado” deste artigo), você “reserva” para você (usuário) o GPIO, não permitindo que outros usuários acessem o GPIO enquanto você o utiliza. Dessa forma, após o uso do GPIO, é necessário liberar para uso de outros o GPIO que você utilizou. Este procedimento é chamado de unexport.
Para fazer essa liberação, considerando o mesmo GPIO17 dos exemplos anteriores, utilize o comando abaixo:
echo 17 > /sys/class/gpio/unexport
Você perceberá que o diretório gpio17 (localizado dentro do diretório /sys/class/gpio) irá sumir. Isso significa que você (seu usuário Linux) não detém mais o poder de uso deste GPIo e que este pode ser utilizado por outros usuários.
Conclusão
Neste artigo, vimos o que são e como funcionam os GPIOs no Linux embarcado, via linha de comando. Ainda, você aprendeu como utilizar um GPIO como entrada ou saída digital, conforme necessidade de seu projeto.
Para demonstrar o conteúdo aprendido, foi feito um experimento simples porém muito útil: o acionamento de um relé via GPIO, na linha de comando. Com esse experimento, você é capaz de acionar quaisquer cargas DC ou AC que estejam dentro dos limites de operação do relé utilizado. Isso permite que uma Raspberry Pi controle desde pequenas até grandes cargas. Esse tipo de abordagem abre possibilidades diversas de projetos e aplicações, tanto para fins de teste e experimentação quanto para fins de automação.