Arduinoを使用したHID準拠のUPS
コンポーネントと消耗品
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
このプロジェクトについて
私は最近Arduinoで遊んでいて、Arduinoで何ができるかを確認しています。古い「ダミー」のUPSがありますが、USBポートがないため、ホストコンピューターにステータスを報告できません。私が念頭に置いていたプロジェクトの1つは、Arduinoボードを使用してダミーUPSの「頭脳」を作成することです。このようなUPSブレインの目的は、バッテリー残量、充電/放電状態、バッテリー電流、電圧などを測定することにより、UPSの内部ステータスを読み取ることです。これらの読み取り値はすべて、USBインターフェイスを通過し、ホストオペレーティングシステムによって解釈されます。商用スマートUPSで行われるのと同じ方法でコンピューターを使用します(たとえば、APCによる)。
カスタムUPS用のハードウェアドライバーの開発に煩わされることはなく、「プラグアンドプレイ」にしたかったので、調査の結果、この仕様に従ってHID準拠のインターフェイスを実装することにしました。 HIDは「HumanInterfaceDevice」の略で、もともとはキーボード、マウス、ジョイスティックなどの人間入力用のデバイス用に設計されていましたが、最近ではUPS、バッテリー、充電器などの電源デバイスをサポートするように拡張され、HIDを使用することでメリットが得られます。ホストコンピュータとのインテリジェント通信の標準。私の次のステップは、Leonardo、Pro Micro、およびそれらのクローンなどの一部のArduinoが、HIDキーボードまたはマウスとしてホストに表示できることを学ぶことでした。 Arduino HIDライブラリ、キーボードライブラリ、および多くのグーグルを分析した後、私は独自のHIDPowerDeviceライブラリを作成しました。設定方法と使用方法の詳細については、GitHubのreadmeをご覧ください。
私のテストラボは非常にシンプルで、ラップトップ、Arduino Pro MicroをUSB(私の場合はMacbookですが、Windows 10とUbuntuでも動作します)にUSB、ブレッドボード、1つのスイッチ(実際に使用した代わりにジャンパー)。また、診断用のLEDと、充電レベルをシミュレートするためのポテンショメータをいくつか追加しました。回路図は以下のとおりです:


S1は、Arduino Pro Microのピン4をアースに接続し、UPSがバッテリー電源で動作するのをシミュレートします。 S1がオフの場合、Arduinoは「充電中」であることをPCに報告します。


私の「UPS」はHIDに準拠しているため、Windows 10はArduinoもHIDバッテリーとして認識し、残りの容量のパーセンテージが正しく表示されます。


言及すべき重要な制限が1つあります。Windows10ではシステムに複数のバッテリーを使用でき、それらすべてをトレイに表示できます。ただし、バッテリーは同じモードでステータスを報告する必要があります(HID仕様はmaH、mwH、およびパーセンテージをサポートします)が、ほとんどのUPSは充電のパーセンテージのみを報告します。システムにすでにACPIバッテリーが搭載されている場合(たとえば、ラップトップでテストしている場合)、パーセンテージが正しく反映されていない可能性があります。
同様に、UPSはLinuxでも動作しますが、追加の構成が必要になる場合があります。READMEを参照してください。



更新2021年6月12日 Synologyのサポートに関するいくつかの質問を受けた後(ArduinoボードはSynologyによってHID準拠のUPSデバイスとして認識されませんでした)、私はこれについて少し調査することにしました。問題は、Synologyディストリビューションで使用されるネットワークUPSツール(NUT)にあります。これは、すべてのHID準拠のUPSモデルでデフォルトでUSBインターフェイス0を想定していますが、Arudino Leonardo / Pro Miniは、UPSにアクセス可能な複合デバイスとしてUSBポートにアドバタイズします。インターフェイス2で。割り込みエンドポイントにも同様の問題があります。この問題に関する技術的な詳細については、こちらをご覧ください。
Arduinoをサポートする変更されたNUTライブラリはこちらです。ソースからビルドして、ターゲットプラットフォーム(Synologyまたはその他の互換性のあるLinuxディストリビューション)にインストールできます。これはまだ実験段階であるため、現在のNUTファイルのバックアップを作成することを強くお勧めします。
楽しみ! :)
コード
HIDPowerDeviceソースコード
https://github.com/abratchik/HIDPowerDevice 回路図
arduino_ups_mlvhJQLrSZ.fzz 製造プロセス