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
- Requisitos
- Arquitetura
- Dependências
- Desenvolvimento
- Conclusão
- 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
Como piscar um LED utilizando BananaPi e Python via SSH
Henrique Otogami ・ Mar 15
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
Raspbian: Atualização de URL de repositório de pacotes APT do Linux
Henrique Otogami ・ May 31
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
Banana Pi — Como Habilitar o SSH no Raspbian
Henrique Otogami ・ Oct 22
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
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
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
Após habilitar o módulo, é obrigatório reiniciar o Apache:
sudo systemctl restart apache2
Confirme que o serviço reiniciou corretamente:
$ sudo systemctl status apache2
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/
Para criar o arquivo para ligar o LED:
$ sudo nano gpio_on.py
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")
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
Para criar o arquivo para desligar o LED:
$ sudo nano /usr/lib/cgi-bin/gpio_off.py
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")
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
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
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
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
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
- 01. Documentação Apache CGI
- 02. GPIO Interface SysFS
- 03. Banana Pi M2 Zero
- 04. Raspbian Documentation
- 05. GitHub.com/henriqueotogami/project_sirios
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)