ファンアウト仙台

button1.jpg button2.jpg button3.jpg

概要

Arduino 互換の Digispark という小型ボードを利用して Windows PC の USB 端子に接続する大きな電源ボタンを作りました。 接続すると「HID 準拠システムコントローラ」として認識されます。 ボタンを長押しすると、キーボードの SLEEP ボタンを押した時の信号が出力されて、PC がスリープ状態になります。ボタンを短く押すと、PC がスリープ状態から復帰します。

原理

動作を調べたところ、Windows PC を USB 接続のキーボードからスリープさせる方法と、スリープからのウェイクアップさせる方法は全く異なっていました。

スリープさせる

102key.jpg

Windows7,8,10 では [Power][Sleep][Wake] のキーがあるキーボード(日本語112キーボード) の [Sleep] キーを押すとスリープ状態になります(この挙動はコントロールパネルの[電源オプション][電源ボタンの動作を選択する] から変更できます)。

dev.png

通常の USB キーボードを Windows PC に接続すると、デバイスマネージャ上に [キーボード]-[HIDキーボードデバイス] として表示されますが、[Sleep] キーのあるキーボードの場合は、これに加えて [ヒューマンインタフェースデバイス]-[HID 準拠システムコントローラ] という項目が追加されます。Windows はこのデバイスから [Sleep] キーのキーコードを受け取るとスリープ状態になります。

スリープ状態からウェイクアップさせる

PC がスリープ状態になった後で、同じくキーボードの [Wake] キーを押すとウェイクアップします。ただしスリープ状態では OS 側からどのキーを押したかを判定できません。

そこで、キーボード側から USB の信号線を一定のパターンでプルアップ、プルダウンすることでウェイクアップするようになっているのですが、この手順がなかなか見つからずに苦労しました。最終的には PS2USB というプロジェクトの sendRemoteWakeUp() 関数内で同じことをやっているのを見つけて実現しました。

ファームウェアのソースコードは C言語 で書いて avr-gcc でコンパイルしました。USB HID keyboard with V-USB をベースにしていますが、キーボードではなく HID 準拠システムコントローラとして認識させるために main.c 中のディスクリプタを変更しました。また OS をウェイクアップ可能デバイスにするために、usbdrv.c 中のコンフィグレーションのアトリビュート(bmAttributes) を変更する必要がありました。

[usbdrv.c]
#if USB_CFG_IS_SELF_POWERED
(1 << 5) | (1 << 7) | USBATTR_SELFPOWER, /* 変更後 */
 // (1 << 7) | USBATTR_SELFPOWER,        /* 変更前 */
#else
(1 << 5) | (1 << 7),                     /* 変更後 */
// (1 << 7),                             /* 変更前 */
#endif

参考にしたツール

作り方

Digispark用ファームウェア

回路

動作

Windows の電源の設定

スリープさせる

スリープ状態からウェイクアップさせる


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS