DEV Community

Cover image for Projeto Sirios - Apache + Python para Acionar LEDs via Web na Banana Pi
Henrique Otogami
Henrique Otogami

Posted on

Projeto Sirios - Apache + Python para Acionar LEDs via Web na Banana Pi

Introdução

Este artigo implementa um sistema web para acionamento remoto de periféricos.

O sistema web é composto do servidor Apache para hospedar a página em HTML e CSS, além de habilitar o módulo CGI para controle de GPIO. Esse sistema completo será implementado na Banana Pi.

O acesso a página web será restrito apenas à rede local em que a Banana Pi está conectada. Por isso, o acionamento remoto é realizado por qualquer dispositivo da rede local. O periférico de controle utilizado é um led.

Esse projeto foi concebido dessa forma simples e reduzida apenas para validar o funcionamento do sistema como uma ideia inicial que pode expandir para outras aplicações.


Índice

  1. Requisitos
  2. Arquitetura
  3. Dependências
  4. Desenvolvimento
  5. Conclusão
  6. Referências

01. Requisitos

01.01 - Hardware

  • Banana Pi M2 Zero com GPIO disponível
  • Cartão SD com Raspbian Stretch
  • Conexão de rede Wi-Fi
  • 01 Resistor 330 Ohms
  • 01 LED difuso 5mm Verde
  • 02 Fios Jumper Macho-Fêmea

01.02 - Software

  • Raspbian Stretch
  • SSH habilitado na Banana Pi
  • Acesso remoto via SSH configurado
  • Editor de texto (nano, vim ou outro)

02. Arquitetura

Esse projeto utiliza uma arquitetura modularizada em uma Interface Web hospedada em um servidor web Apache com módulo CGI habilitado via LAN para acionamento de um LED conectado fisicamente na Banana Pi.

Imagem 01 - Esquema de Arquitetura do Projeto Sirios

02.01 - Interface Web

Utilizando a LAN (rede local) em que a Banana Pi está conectada via Wi-fi, o usuário consegue acessar a Interface Web (página em HTML) via IP e Porta, por exemplo http://192.168.100.42/.
Na página web, existem dois botões para ligar e desligar o LED.

Cada botão é responsável pela execução de um script Python para acionamento da GPIO do LED. Esses arquivos são gerenciados pelo módulo CGI do Apache.

02.02 - Web Server Apache

Quando o módulo CGI recebe a requisição de um script Python para manipular a GPIO, ele executa o script com as permissões configuradas no sistema, permitindo alterar o valor lógico do pino de GPIO em conjunto com o Linux Kernel.

Imagem 02 - Esquema de Arquitetura do Projeto Sirios

02.03 - Hardware Layer

A camada de hardware é responsável pela conexão física do circuito de alimentação do LED, que será acionado pelos scripts em Python.

O circuito físico de alimentação do LED é bem simples e é o mesmo utilizado no artigo:

Como piscar um LED utilizando Banana Pi e Python via SSH


03. Dependências

03.01 - Atualização da URL do Repositório APT

O Raspbian Stretch utiliza o repositório legacy para a Banana Pi, pois a versão não é mais suportada oficialmente.

É necessário atualizar a configuração do repositório APT para atualizar o sistema e baixar novas bibliotecas.

Para saber como realizar essa configuração, leia o artigo:

Raspbian: Atualização de URL de repositório de pacotes APT do Linux


03.02 - Habilitação do SSH

O SSH, ou Secure Shell, é um protocolo de rede que permite a comunicação e administração remota de computadores de forma segura, utilizando criptografia para proteger os dados.

Durante o desenvolvimento do projeto, utilizando um computador auxiliar em conjunto com a Banana Pi, será necessário transferir arquivos e realizar configurações. Assim, é necessário habilitar o SSH para permitir o acesso na Banana Pi a partir do computador auxiliar.

Para saber como realizar essa configuração, leia o artigo:

Banana Pi - Como Habilitar o SSH no Raspbian


03.03 - Instalação do Apache

O Apache HTTP Server é o servidor web mais popular do mundo desde 1996. Ele foi criado em 1995 e é mantido pela Apache Software Foundation como software open source e gratuito.

Conforme comentado anteriormente, o Apache é importante para sustentar a interface entre humano e máquina, hospedando a página web e permitir o módulo CGI gerenciar a GPIO.

Para saber como realizar essa instalação, leia o artigo:

Banana Pi - Como instalar o Apache


03.04 - Permissões de Execução de Scripts

Os scripts Python que controlam GPIO precisam executar comandos com privilégios de administrador. Para evitar restrições de permissões, é necessário configurar o sudo para o usuário www-data.

Abra o arquivo de configuração do sudo enviando o comando abaixo:

$ sudo visudo
Enter fullscreen mode Exit fullscreen mode

Adicione a seguinte linha ao final do arquivo:

www-data ALL=(ALL) NOPASSWD: /usr/bin/tee, /bin/echo, /usr/bin/gpio, /usr/bin/top, /bin/cat, /bin/df
Enter fullscreen mode Exit fullscreen mode

Essa configuração permite que o Apache (usuário www-data) execute os comandos especificados sem solicitar senha.
Isso é necessário porque:

  • /usr/bin/tee: Usado para escrever valores em arquivos GPI
  • /bin/echo: Usado para enviar comandos para GPIO
  • /usr/bin/gpio: Ferramenta de manipulação GPIO
  • /usr/bin/top, /bin/cat, /bin/df: Comandos de monitoramento adicionais

03.05 - Habilitação do Módulo CGI

O Common Gateway Interface (CGI) permite que o Apache execute scripts externos (Python, Perl, Shell) em resposta a requisições HTTP.
Para habilitar o CGI, envie o comando abaixo:

$ sudo a2enmod cgi
Enter fullscreen mode Exit fullscreen mode

Após habilitar o módulo, é obrigatório reiniciar o Apache:

sudo systemctl restart apache2
Enter fullscreen mode Exit fullscreen mode

Confirme que o serviço reiniciou corretamente:

$ sudo systemctl status apache2
Enter fullscreen mode Exit fullscreen mode

Imagens 03 e 04 - Habilitação do Módulo CGI


04. Desenvolvimento

Para evidenciar o entendimento do projeto, o fluxo de funcionamento está ilustrado na imagem 05 abaixo. O curso do fluxo segue em forma de cascata, sendo dividido em etapas em que cada componente recebe uma entrada e dispara uma saída.

Imagem 05 - Esquema de Fluxo de Funcionamento do Projeto Sirios

  • Usuário: Solicita o acionamento do LED;
  • Navegador: Solicita o acionamento do script;
  • Apache: Executa o script Python;
  • CGI: Permite que o Python acesse a GPIO;
  • Python: acessa a GPIO;
  • GPIO: Define o estado lógico do pino;
  • LED: Acende ou apaga.

04.01 - Arquivos Python

Após realizar o login via SSH na Banana Pi, os scripts Python para controle de GPIO devem ser criados no diretório padrão para scripts CGI no Apache.

Acesse o diretório padrão:

$ cd /usr/lib/cgi-bin/
Enter fullscreen mode Exit fullscreen mode

Para criar o arquivo para ligar o LED:

$ sudo nano gpio_on.py
Enter fullscreen mode Exit fullscreen mode

Adicione o seguinte conteúdo:

#!/usr/bin/env python
print("Content-type: text/html\n")
import subprocess
import os
FNULL = open(os.devnull, 'w')
subprocess.call("echo 7 | sudo tee /sys/class/gpio/unexport", shell=True, stdout=FNULL, stderr=FNULL)
subprocess.call("echo 7 | sudo tee /sys/class/gpio/export", shell=True, stdout=FNULL, stderr=FNULL)
subprocess.call("echo out | sudo tee /sys/class/gpio/gpio7/direction", shell=True, stdout=FNULL, stderr=FNULL)
subprocess.call("echo 1 | sudo tee /sys/class/gpio/gpio7/value", shell=True, stdout=FNULL, stderr=FNULL)
print("LED LIGADO")
Enter fullscreen mode Exit fullscreen mode

Explicação do conteúdo do script para ligar o LED:

  • #!/usr/bin/env python: Shebang indicando o interpretador Python
  • print("Content-type: text/html\n"): Header HTTP necessário para CGI
  • subprocess.call(): Executa comandos shell para manipular GPIO
  • FNULL: Redireciona stdout para /dev/null, suprimindo mensagens
  • GPIO 7: é configurado como saída (out) e valor alto (1)

Após criar o arquivo, é necessário adicionar a permissão para que ele seja executável:

$ sudo chmod +x /usr/lib/cgi-bin/gpio_on.py
Enter fullscreen mode Exit fullscreen mode

Para criar o arquivo para desligar o LED:

$ sudo nano /usr/lib/cgi-bin/gpio_off.py
Enter fullscreen mode Exit fullscreen mode

Adicione o seguinte conteúdo:

#!/usr/bin/env python
print("Content-type: text/html\n")
import subprocess
import os
FNULL = open(os.devnull, 'w')
subprocess.call("echo 0 | sudo tee /sys/class/gpio/gpio7/value", shell=True, stdout=FNULL, stderr=FNULL)
print("LED DESLIGADO")
Enter fullscreen mode Exit fullscreen mode

Explicação do conteúdo do script para desligar o LED:

  • GPIO 7: configura valor baixo (0) para desligar o LED

Após criar o novo arquivo, é necessário adicionar a permissão para que ele também seja executável:

$ sudo chmod +x /usr/lib/cgi-bin/gpio_off.py
Enter fullscreen mode Exit fullscreen mode

Após criar os dois arquivos acima e adicionar as permissões, é necessário reiniciar o apache para aplicar as configurações:

$ sudo systemctl restart apache2
Enter fullscreen mode Exit fullscreen mode

04.02 - Interface Web

A interface é bem simples também e foi concebida como protótipo no Figma para orientar a implementação posterior em HTML e CSS.
A primeira ideia foi retornar os estados do led no próprio botão de ligar e desligar. Mas, para isso será necessário implementar uma página dinâmica utilizando o Javascript, ao invés da página estática utilizada no projeto.

Imagens 05 a 08- Protótipos do Projeto Sirios

Para capturar o estado do LED e retornar como mensagem ao usuário, foi utilizada o iframe do HTML, que funciona como uma janela para imprimir conteúdo externo.

Para criar o arquivo da página em HTML:

$ sudo nano /var/www/html/index.html
Enter fullscreen mode Exit fullscreen mode

Adicione o seguinte conteúdo:

Arquivo da Página Web em HTML do Projeto Sirios

Cada botão de ligar e desligar o LED requisitam a execução de seus respectivos scripts como método GET do protocolo HTTP. Enquanto a resposta é apresentada no iframe, conforme mencionado anteriormente.

Explicação do funcionamento do iframe utilizado na página web:

  • action="/cgi-bin/gpio_on.py": Define o script CGI a ser executado
  • method="get": Método HTTP utilizado
  • target="message_iframe": Exibe a resposta do CGI em um iframe
  • onload: Atualiza a div de saída com o conteúdo retornado pelo CGI

Para criar o arquivo de estilos em CSS da página em HTML:

$ sudo nano /var/www/html/style.css
Enter fullscreen mode Exit fullscreen mode

Adicione o seguinte conteúdo:

Arquivo de Estilos da Página Web em CSS do Projeto Sirios


04.03 - Acessar a Interface Web

Abra o navegador e acesse:

http://seu-ip/index.html

ou simplesmente:

http://seu-ip/

Imagens 09 e 10 da Página Web do Projeto Sirios na versão Desktop e Mobile

Vídeo de demonstração


05. Conclusão

Esse projeto apresentou a proposta de controle remoto de dispositivos gerenciados pela Banana Pi, permitindo que haja uma expansão para controle de periféricos mais complexos como equipamentos de internet das coisas (IoT).

Seguindo nessa direção, é possível implementar recursos que transformem uma simples placa eletrônica, como a Banana Pi, em um dispositivo central de pequenas automações futuras.

As maiores dificuldades enfrentadas foram no entendimento de como o Linux gerencia as permissões dos arquivos de GPIO em Python e configurações de usuário necessárias para o Apache conseguir solicitar a execução dos mesmos.

Além disso, foi muito importante entender como uma página web consegue interagir com os comandos de terminal e capturar a resposta para entregar ao usuário o estado do LED.

Muitas coisas desse projeto estão sendo aproveitadas de projetos de artigos anteriores, tanto no circuito eletrônico quanto em algumas configurações. Isso facilita o desenvolvimento, de modo a permitir o foco nas novas implementações, sem precisar explicar novamente tópicos mais básicos.

06. Referências

Apoie o meu conteúdo com um cafézinho!

Ficou alguma dúvida ou tem sugestões?
Comente aqui embaixo ou me chame em alguma das minhas redes.
Valeu! ✌🏻

Top comments (0)