HID-UPS на Arduino: превращаем «глупый» ИБП в умный USB-устройство
Компоненты и материалы
| Arduino Pro Micro | ×1 |
| Беспаечная макетная плата | ×1 |
| Перемычки | ×1 |
О проекте
У меня был старый «глупый» ИБП без USB-порта, который не мог сообщать компьютеру о своем состоянии. Задача: создать «мозги» для ИБП на Arduino, чтобы он считывал заряд батареи, режим заряда/разряда, ток, напряжение и передавал это по USB так, чтобы ОС воспринимала его как обычный умный ИБП (например, APC).
Не желая писать драйверы, я выбрал HID-интерфейс (Human Interface Device). Изначально для клавиатур/мышей, стандарт HID теперь поддерживает устройства питания (UPS, батареи, зарядные устройства), обеспечивая «plug-and-play» совместимость.
Arduino Leonardo, Pro Micro и их клоны могут представляться как HID-клавиатура или мышь. Изучив библиотеки HID и Keyboard, я написал свою библиотеку HIDPowerDevice. Детали настройки и использования в README на GitHub.
Тестовая стенда
Простая схема: ноутбук, Arduino Pro Micro по USB, макетная плата, переключатель (перемычка) для симуляции перехода на батарею, пара LED для диагностики и потенциометр для симуляции уровня заряда.
Переключатель S1 соединяет пин 4 Pro Micro с землей — симуляция работы от батареи. Когда S1 открыт — Arduino сообщает «заряжается».
Результат в Windows 10
Система распознает Arduino как HID-батарею и корректно показывает процент заряда в трее.
Важное ограничение: Windows 10 поддерживает несколько батарей, но все должны сообщать статус в одном формате (мАч, мВтч или проценты). Большинство ИБП выдают только проценты. Если в системе уже есть ACPI-батарея (ноутбук), проценты могут отображаться некорректно.
Работа в Linux
ИБП работает и в Linux, но может потребоваться дополнительная настройка (см. README).
Обновление 12.06.2021: Поддержка Synology
После запросов по Synology (Arduino не определялся как HID-UPS) я исследовал проблему. В Network UPS Tools (NUT), используемом в Synology, по умолчанию ожидается USB-интерфейс 0, но Arduino Leonardo/Pro Micro представляется как композитное устройство с UPS на интерфейсе 2. Также есть нюансы с прерывающими эндпоинтами.
Модифицированная библиотека NUT с поддержкой Arduino: GitHub. Собирается из исходников, устанавливается на целевую платформу. Экспериментально — обязательно бэкап текущих файлов NUT.
Код
Исходный код HIDPowerDevice: https://github.com/abratchik/HIDPowerDevice
Схемы
arduino_ups_mlvhJQLrSZ.fzz
Производственный процесс
- Создание аудио-эффектов, управляемых датчиками, с набором Satellite CCRMA
- Датчик CO2 K30: мониторинг качества воздуха в реальном времени на Arduino
- Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
- Умная копилка: управление монетоприёмником на Arduino Nano
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Интеграция ёмкостного сканера отпечатков DFRobot с Arduino или ESP8266
- Интерактивный HMI-проект на Nextion с Arduino Mega и датчиками
- Роботизированная рука 6 степеней свободы на Arduino Mega с управлением через Nunchuk
- Измерение солнечной радиации на Arduino UNO с Ethernet Shield
- Компактный радар на Arduino Nano с HC-SR04 и дисплеем 1.8"