ファンアウト仙台

button1.jpg button2.jpg button3.jpg

概要

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

動作

  • あらかじめ下記の「Windows の電源の設定」を行っておく必要があります。
  • スイッチを長押し(1秒以上)すると、PC がスリープ状態になります。
  • PC がスリープ状態の時にスイッチを短く押すと、スリープから復帰します。

Windows の電源の設定

  • Windows 側で下記の設定をしておかないと動作しません。

スリープさせる

  • 電源オプション → 電源ボタンの動作を選択する → スリープボタンを押したときの動作」を「スリープ状態」にします。
setting1.png

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

  • 電源オプション → プラン変更の設定 → 詳細な電源設定の変更 → USB設定 → USBのセレクティブサスペンドの設定 を「無効」にします。
setting3.png
  • デカスギ電源ボタンを USB コネクタに接続して、Windows に「HID 準拠システムコントローラ」として認識されてから、デバイスマネージャ → ヒューマンインタフェースデバイス → HID 準拠システムコントローラ の設定で、「このデバイスでコンピュータのスタンバイ状態を解除できるようにする」にチェックを入れます。
setting2.png

作り方

回路

  • 図のように PB0(D0) と GND の間にスイッチを1個付けるだけです。
  • USB ケーブルが長いと不安定になることがあります。また USB ハブを通さないと認識されないことがあります。
    sch.png

Digispark用ファームウェア

原理

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

Windows PC をスリープさせる

102key.jpg

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

dev.png

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

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

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

そこで、キーボード側から USB の信号線の電圧レベルを一定のパターンで変化させることでウェイクアップさせるようになっているのですが、この手順がなかなか見つからずに苦労しました。

(参考) USB1.1仕様書 の"7.1.7.5 Resume" に書いてありますが複雑です。また "Table 9-8. Standard Configuration Descriptor (Continued)" にある bmAttributes の "D5: Remote Wakeup" を有効にする必要がありました。

最終的には PS2USB というプロジェクトの sendRemoteWakeUp() 関数内で実現できているのを見つけて、これを真似して実装しました。

補足

  • ファームウェアは C言語 で書いて avr-gcc-4.9.3 でコンパイルしました。
  • ソースコードは USB HID keyboard with V-USB をベースにしていますが、main.c 中の HID ディスクリプタを全面変更しています。
  • スリープ中の OS をウェイクアップできる USB デバイスにするために、usbdrv.c 中のコンフィグレーションのアトリビュート(bmAttributes) を変更する必要がありました。
[usbdrv.c : ウェイクアップ可能デバイスにするための bmAttributes の変更]
#if USB_CFG_IS_SELF_POWERED
(1 << 5) | (1 << 7) | USBATTR_SELFPOWER, /* 変更後 */
 // (1 << 7) | USBATTR_SELFPOWER,        /* 変更前 */
#else
(1 << 5) | (1 << 7),                     /* 変更後 */
// (1 << 7),                             /* 変更前 */
#endif
  • 有用なツール [#ce0386eb]
    • USBlyzer : USB デバイスのディスクリプタやキーを押したときに発生するイベントを調べるためのツールです。有料ですが1ヶ月間の評価版もダウンロードできます。
  • 今回は関係ありませんでしたが、HID 仕様書 に出てくる "Boot Keyboard" とは BIOS 画面の操作に使えるキーボードのことだそうです。

Counter: 367, today: 6, yesterday: 2

添付ファイル: filesetting3.png 26件 [詳細] filesetting2.png 40件 [詳細] filesetting1.png 26件 [詳細] filesch.png 30件 [詳細] fileDigispark_pwrbtn.zip 22件 [詳細] filedev.png 30件 [詳細] file102key.jpg 37件 [詳細] filebutton3.jpg 29件 [詳細] filebutton2.jpg 28件 [詳細] filebutton1.jpg 26件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-13 (水) (162d)