Windows PC の USB 端子に接続する巨大な電源ボタンを作りました。 キーボードデバイスとして認識されます。 ボタンを長押しすると、キーボードの SLEEP ボタンを押した時の信号が出力されて、PC がスリープ状態になります。ボタンを短く押すと、PC がスリープ状態から復帰します。
動作を調べたところ、Windows PC を USB 接続のキーボードからスリープさせる方法と、スリープからのウェイクアップさせる方法は全く異なっていました。
Windows7,8,10 では [Power][Sleep][Wake] のキーがあるキーボード(日本語112キーボード) の [Sleep] キーを押すとスリープ状態になります(この挙動はコントロールパネルの[電源オプション][電源ボタンの動作を選択する] から変更できます)。
通常の USB キーボードを Windows PC に接続すると、デバイスマネージャ上に [キーボード]-[HIDキーボードデバイス] として表示されますが、[Sleep] キーのあるキーボードの場合は、これに加えて [ヒューマンインタフェースデバイス]-[HID 準拠システムコントローラ] という項目が追加されます。Windows はこのデバイスから [Sleep] キーのキーコードを受け取るとスリープ状態になります。
PC がスリープ状態になった後で、同じくキーボードの [Wake] キーを押すとウェイクアップします。ただしスリープ状態では OS 側からどのキーを押したかを判定できません。
そこで、キーボード側から USB の信号線を一定のパターンでプルアップ、プルダウンすることでウェイクアップするようになっていすのですが、この手順がなかなか見つからずに苦労しました。最終的には [PS2USB:https://github.com/robszy/ps2usb] というプロジェクトの sendRemoteWakeUp() 関数内で同じことをやっているのを見つけて実現しました。