Arduino搭載HID UPS:ダミー電源をUSB対応バックアップにアップグレード
部品と材料
| Arduino Pro Micro | ×1 | |
| ブレッドボード(汎用) | ×1 | |
| ジャンパーワイヤー(汎用) | ×1 |
このプロジェクトについて
最近Arduinoで遊んでいて、何ができるか探っていました。USBポートのない古い「ダミー」UPSを持っているのですが、これがホストコンピュータに状態を報告できません。Arduinoボードを使ってこのダミーUPSの「頭脳」を作り、内部状態(残量、充放電状態、電流、電圧など)を読み取り、USBインターフェース経由でホストOSに伝え、市販のスマートUPS(APC製など)と同じように扱えるようにしたいと考えました。
カスタムUPS用のハードウェアドライバを開発したくなく、「プラグアンドプレイ」で動くようにしたかったため、調査の結果、HID準拠インターフェースをこの仕様に従って実装することにしました。HIDは「Human Interface Device」の略で、本来はキーボード、マウス、ジョイスティックなど人間の入力デバイス向けに設計されましたが、最近ではUPS、バッテリー、充電器などの電源デバイスもサポートするよう拡張され、ホストコンピュータとのインテリジェントな通信にHID標準が活用できるようになっています。
Leonardo、Pro Micro、それらのクローンなど一部のArduinoが、ホストに対してHIDキーボードやマウスとして認識させられることを知りました。ArduinoのHIDライブラリ、Keyboardライブラリを分析し、検索を重ねた結果、独自のHIDPowerDeviceライブラリを書き上げました。セットアップと使い方の詳細はGitHubのREADMEをご覧ください。
テスト環境はシンプルです:ノートPC、Arduino Pro Micro(USBで接続。私の場合はMacBookですが、Windows 10やUbuntuでも動作)、ブレッドボード、スイッチ1つ(実際はジャンパーワイヤーで代用)。診断用にLEDを2つ、充電レベルシミュレーション用にポテンショメータを追加しました。回路図は以下の通り:


スイッチS1はArduino Pro Microのピン4をGNDに接続し、UPSがバッテリー駆動に切り替わったことをシミュレートします。S1がOFFのときは「充電中」とPCに報告します。


HID準拠のため、Windows 10でもArduinoをHIDバッテリーとして認識し、残量パーセンテージが正しく表示されます:


重要な制限事項: Windows 10では複数のバッテリーをシステムに登録でき、すべてトレイに表示されます。しかし、すべてのバッテリーが同じモード(HID仕様ではmAh、mWh、パーセントをサポート)で状態を報告する必要があります。ほとんどのUPSはパーセントのみ報告します。すでにACPIバッテリー(ノートPCの内蔵バッテリーなど)がシステムにある場合、パーセント表示が正しく反映されないことがあります。
同様にLinuxでも動作しますが、追加設定が必要な場合があります。READMEを参照してください。



更新(2021-06-12) Synologyでのサポートについて複数の問い合わせを受け(ArduinoボードがSynologyでHID準拠UPSデバイスとして認識されない)、調査しました。原因はSynologyディストリビューションで使用されているNetwork UPS Tools(NUT)にあります。NUTはデフォルトで全HID準拠UPSモデルのUSBインターフェース0を想定していますが、Arduino Leonardo/Pro Microはコンポジットデバイスとして認識され、UPS機能はインターフェース2で公開されます。割り込みエンドポイントについても同様の問題があります。技術的詳細はこちら。
Arduino対応に修正したNUTライブラリはこちら。ソースからビルドしてターゲットプラットフォーム(Synologyやその他の互換Linuxディストリビューション)にインストールしてください。まだ実験的段階なので、現在のNUTファイルのバックアップを強く推奨します。
お楽しみください! :)
コード
HIDPowerDevice ソースコード
https://github.com/abratchik/HIDPowerDevice
回路図
arduino_ups_mlvhJQLrSZ.fzz
製造プロセス
- Satellite CCRMAキットでセンサー駆動オーディオエフェクトを構築
- K30 CO2センサで室内空気質をリアルタイム監視する
- 1SheeldとArduinoで盲ろう者のコミュニケーションを支援する
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DFRobot静電容量式指紋センサーをArduino/ESP8266で使う – 登録・認証・削除の完全ガイド
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- コンパクトなArduinoレーダーシステム – HC-SR04超音波センサー & 1.8インチST7735ディスプレイ搭載
- Arduinoで楽器演奏:音階生成のステップバイステップガイド