UPS HID com Arduino: Transforme Fonte "Burra" em Backup USB Inteligente
Componentes e Materiais
| Arduino Pro Micro | × | 1 |
| Protoboard (genérica) | × | 1 |
| Jumpers (genéricos) | × | 1 |
Sobre o Projeto
Tenho brincado com Arduino para ver o que ele pode fazer por mim. Tenho um UPS "burro" (dummy) antigo, que não reporta seu status ao computador por não ter porta USB. A ideia era criar um "cérebro" para esse UPS usando uma placa Arduino: ler capacidade restante da bateria, estado de carga/descarga, corrente, tensão, etc., e transmitir tudo via USB para que o sistema operacional o reconheça exatamente como um UPS inteligente comercial (ex.: APC).
Não queria desenvolver drivers customizados — queria plug-and-play. Após pesquisa, decidi implementar uma interface HID-compliant conforme a especificação HID Power Device Class. HID (Human Interface Device) foi criado para teclados, mouses e joysticks, mas foi estendido para dispositivos de energia (UPS, baterias, carregadores), permitindo comunicação inteligente com o host usando padrões HID.
Descobri que alguns Arduinos (Leonardo, Pro Micro e clones) podem se apresentar ao host como teclado ou mouse HID. Após analisar as bibliotecas HID e Keyboard do Arduino e muita pesquisa, escrevi minha própria biblioteca HIDPowerDevice. Detalhes de configuração e uso estão no README do GitHub.
Banco de Testes
Meu setup é simples: laptop, Arduino Pro Micro conectado via USB (testado em MacBook, Windows 10 e Ubuntu), protoboard, uma chave (usei um jumper), dois LEDs para diagnóstico e um potenciômetro para simular nível de carga.
O interruptor S1 conecta o pino 4 do Pro Micro ao GND, simulando o UPS passando para bateria. Quando S1 está ABERTO, o Arduino reporta "carregando".
Resultados no Windows 10
Como o "UPS" é HID-compliant, o Windows 10 o reconhece como Bateria HID e mostra a porcentagem de carga corretamente na bandeja do sistema.
Limitação importante: O Windows 10 permite múltiplas baterias no sistema, mas todas devem reportar status no mesmo modo (a especificação HID suporta mAh, mWh e porcentagem). A maioria dos UPS reporta apenas porcentagem. Se você já tem uma bateria ACPI no sistema (ex.: testando em um laptop), a porcentagem pode não ser exibida corretamente.
Funcionamento no Linux
O UPS também funciona no Linux, embora possa exigir configuração adicional — veja o README.
Atualização: Suporte a Synology (12/06/2021)
Após várias dúvidas sobre suporte ao Synology (placas Arduino não eram reconhecidas como UPS HID-compliant pelo Synology), investiguei. O problema está no Network UPS Tools (NUT) usado pelo Synology: ele assume interface USB 0 por padrão para todos os modelos HID UPS, mas o Arduino Leonardo/Pro Micro se anuncia como dispositivo composto com o UPS na Interface 2. Há problema similar com endpoints de interrupção.
Detalhes técnicos aqui. Biblioteca NUT modificada com suporte a Arduino aqui. Compile a partir do fonte e instale na plataforma alvo (Synology ou outra distro Linux compatível). Faça backup dos arquivos NUT atuais antes — ainda é experimental.
Divirta-se! :)
Código
Código-fonte HIDPowerDevice: https://github.com/abratchik/HIDPowerDevice
Esquemáticos
arduino_ups_mlvhJQLrSZ.fzz
Processo de manufatura
- Crie Efeitos de Áudio Controlados por Sensores com o Kit Satellite CCRMA
- Sensor K30 CO₂: Monitoramento de Qualidade do Ar Interno em Tempo Real
- Facilitando Comunicação Surdo-Cego com 1Sheeld e Arduino
- Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Integrando Sensor de Impressão Digital Capacitivo DFRobot com Arduino ou ESP8266
- Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
- Braço Robótico 6 GDL Controlado por Nunchuk com Arduino Mega
- Medição Precisa de Radiação Solar com Arduino UNO e Ethernet Shield
- Sistema Radar Compacto com Arduino Nano, Sensor HC-SR04 e Display 1.8"