Os primeiros passos com Raspberry Pi 3: Controlando a GPIO por SYSFS

Não é de se negar que a Raspberry Pi mudou o mundo dos dispositivos embarcados, da mesma forma que o Arduino mudou. Há alguns anos atrás, não podíamos imaginar...

Não é de se negar que a Raspberry Pi mudou o mundo dos dispositivos embarcados, da mesma forma que o Arduino mudou. Há alguns anos atrás, não podíamos imaginar que daria para construir o seu próprio computador, em casa e com pouco dinheiro.

Hoje, conseguimos fazer muitos projetos complexos, que antes só eram possíveis com placas caríssimas, das quais não tínhamos acesso, as vezes somente em universidades. Com a Raspberry Pi podemos fazer projetos que vão desde uma simples automação residencial, um media center,
videogame e até sistemas de visão computacional que reconhecem rostos e objetos.

Alguns projetos, fazem interação com outros periféricos, como sensores, câmeras, unidades de armazenamento, atuadores, LEDs entre outros. Alguns deles fazem o uso das GPIOs, ou General Purpose Input/Output, das quais vamos falar neste artigo a respeito das GPIO’s.

O que é uma GPIO?

Uma GPIO é uma porta, de entrada ou saída genérica, digital, que possibilita ser controlada e programada para diversos fins, desde uma comunicação entre periféricos, controle de estado de entrada, como um botão ou saída com um LED, por exemplo.

A GPIO tem dois estados apenas, 0 e 1, ou seja, desligada ou ligada. Quando ligada, a tensão medida no pino da GPIO é de 3.3V e quando desligada é 0V.
O LED que pisca em uma placa, sinalizando um estado, por exemplo, é uma GPIO programada para essa função.
Portanto, em um projeto em que queremos interagir com outros periféricos, o uso das GPIOs é inevitável.

GPIO na Raspberry Pi

Desde a primeira versão da Raspberry Pi, em 2012, o número de GPIOs tem aumentado. A tabela abaixo mostra o número de GPIOs de acordo com cada modelo e dependendo do processador utilizado.

Vemos portando, que a Raspberry Pi B 3, da qual estamos tratando neste artigo, tem 46 GPIOs (nem todas estão disponíveis para serem utilizadas), um número mais que o suficiente para grande parte das aplicações. Mas antes de continuar, temos que entender algumas limitações e precauções no uso das GPIOs.

A GPIO está diretamente ligada ao processador, sem nenhum tipo de proteção externa, portanto, se algo der errado, as chances de queimar o processador são grandes. Para isso vamos tomar alguns cuidados quando utilizarmos as GPIOs da Raspberry.

  1. A corrente máxima de cada GPIO é de 50mA.
    • Por isso o uso de um resistor para limitar a corrente é essencial.
    • Para correntes mais altas, use um driver de corrente, feito com um transistor, por exemplo.
  2.  A tensão de cada GPIO é de 3.3V.
    • A Raspberry não é tolerante a 5V, portando não use tensões superiores a 3.3V nas GPIOs.
  3.  Algumas GPIOs já estão em uso por outros periféricos.
    • Tome cuidado ao usar as GPIOs para não utilizar alguma que já estiver em uso por outro
      periférico.
  4. Existem pull-up e pull-down internos.
    • Se precisar, use-o.
  5.  Curto-circuito pode danificar a sua Raspberry
    • Conecte os cabos nas GPIOs com ela desligada e verifique sempre as ligações.

GPIO Header

Todas as GPIOs disponíveis estão no barramento de 40 pinos da Raspberry. A figura abaixo mostra todos os pinos do barramento e sua respectiva função.

 

Para ligar um LED nas GPIOs da Raspberry Pi 3, devemos seguir conforme o esquemático abaixo:

O pino anodo (+) do LED deve ser conectado no GPIO21 e o catodo (-) deverá ser conectado no GND, utilizando um resistor de 220 ohms, para limitar a corrente na porta.
Devemos nos atentar ao fazer as conexões de forma correta, pois um erro pode danificar a placa.

Controlando uma GPIO por Sysfs

Para entender como funciona o controle da GPIO, devemos primeiramente entender o funcionamento de um pedaço do Kernel Linux, que os sistemas operacionais baseados nele utilizam.

Deve-se obter uma versão atualizada da imagem do Raspbian (http://raspbian.org/RaspbianImages) e gravar utilizando o Etcher (https://etcher.io/).

Sysfs

No Linux, uma das formas de fazer a comunicação com o hardware é por meio do sysfs. O sysfs é um pseudo sistema virtual de arquivos que faz interface entre os drivers e hardware e o espaço de usuário.
Em outras palavras, para enviar um comando do nível de usuário para o hardware, fazemos escritas e leituras em um arquivo virtual, que por sua vez faz a interação com o hardware ou o driver do dispositivo.
Com o sysfs, é possível o usuário acessar recursos de hardware por meio dos arquivos virtuais, em uma abstração com o driver que controla o dispositivo no mais baixo nível.
Para entender melhor, vamos fazer o controle de uma GPIO diretamente pelo terminal. Para isso vamos precisar acessar o terminal da Raspberry.

Acessando o terminal

O terminal, ou console de comandos, é uma interface de linha de comandos em que o sistema operacional pode ser controlado e manipulado. No terminal é possível acessar e manipular arquivos, iniciar programas, controlar o funcionamento do sistema entre outras funcionalidades.

Existem diversas formas de acessar o terminal da Raspberry Pi. A mais fácil é conectá-la a um monitor por meio de um cabo HDMI e um teclado USB.

Controlando a GPIO

Para usar uma GPIO, devemos seguir alguns passos antes de propriamente controlá-la. A GPIO tem que ser configurada através de dois passos, o export/unexport e a configuração da direção da GPIO.
O export de uma GPIO é a criação dos arquivos de interface com ela, sem esse passo, a GPIO não pode ser controlada uma vez que as interfaces com ela não foram criadas. O comando unexport é o contrario, remove as interfaces.
Para os próximos passos, vamos utilizar o comando echo para escrever no arquivo.
Para fazer o export, vamos escolher uma GPIO, por exemplo a GPIO21 (pino 40). Para fazer o export da GPIO21, devemos executar a seguinte linha de comando no terminal:

$ echo “21” > /sys/class/gpio/export

Feito isso, note que agora no diretório /sys/class/gpio/ existe um diretório chamado gpio16. Dentro deste diretório, estão todas as interfaces desta GPIO, como por exemplo o arquivo direction, que determina se a GPIO será INPUT ou OUTPUT.

Os arquivos criados são:

/sys/class/gpio/gpio21/direction

Determina se é GPIO de entrada ou saída

/sys/class/gpio/gpio21/value

É o estado da GPIO

/sys/class/gpio/gpio21/edge

Determina o momento da troca do estado

/sys/class/gpio/gpio21/active_low

Inverte a lógica de leitura da GPIO

Para configurar a direção, devemos executar o seguinte comando:

Para OUTPUT:

$ echo “out” >/sys/class/gpio/gpio21/direction

Para INPUT:

$ echo “in” >/sys/class/gpio/gpio21/direction

Lembrando que é possível apenas um modo de cada vez.

Com a GPIO já com as interfaces criadas e a direção escolhida, já podemos fazer o controle ou a leitura do estado. Para isso podemos fazer a escrita ou a leitura do arquivo value.

Para escrever:

$ echo “0” >/sys/class/gpio/gpio21/value

ou

$ echo “1” >/sys/class/gpio/gpio21/value

Após a execução do comando, o estado da GPIO deverá alterar de acordo com o nível lógico escrito no arquivo.

Para ler:

$ cat /sys/class/gpio/gpio21/value

Executado o comando de leitura do arquivo value, o mesmo retornará o estado atual da GPIO.

Com esses comandos já dá para fazer o controle e leitura de qualquer GPIO disponível, até mesmo implementar um script em bash para uma automação ou a implementação do controle das GPIOs em linguagem C.

Conclusão

Este artigo teve como objetivo mostrar como funciona o controle das GPIOs da Raspberry diretamente pelo sysfs. É importante para entender o funcionamento do sistema operacional, antes de embarcar com o uso de bibliotecas que abstraem isso.
Essa técnica pode ajudar até a criar uma biblioteca para uma linguagem ou mesmo um script em bash para o controle direto das GPIOs sem o uso de bibliotecas.
Se o projeto já faz uso de uma linguagem de programação como o Python, o indicado nesse caso é usar uma biblioteca já pronta, como a Rpi.GPIO, pigpio ou wiringpi2.

Referencias:

http://elinux.org/RPi_GPIO_Code_Samples
http://elinux.org/RPi_Low-level_peripherals
https://www.kernel.org/doc/ Documentation/ filesystems/sysfs.txt
https://www.raspberrypi.org/ documentation/ usage/gpio-plus-and-raspi2/
https://www.element14.com/community/ servlet/ JiveServlet/previewBody/73950-102-11-
339300/pi3_gpio.png

Categorias
Raspberry Pi

Formado em Analise de Sistemas e com técnico em Eletrônica, trabalha há mais de 10 anos com o desenvolvimento de produtos, com foco em embarcados. Atualmente trabalha com pesquisa de tecnologias de segurança embarcada, possuindo patentes nacionais e internacionais nas áreas de segurança, wearables e Internet das Coisas. Parceiro do site UsinaInfo.
Sem Comentários

Enviar Resposta

*

*

Sobre nós

Hoje a Usinainfo é um dos maiores ecommerces de Ferramentas, Peças para Eletrônica, Componentes Eletrônicos, Sensores e Arduino do Brasil, contando com uma grande diversidade de produtos na linha de eletrônica.

Sugestões

Artigos Relacionados