読者です 読者をやめる 読者になる 読者になる

Webmail windowというUSB接続のLEDランプを制御するプログラムを作りました

プログラム開発の現場では、チームで共有のビルドマシンを置き、そこで自動ビルドや自動テストを行うのが普通だと思います。ビルドやテストに失敗するとエラーメールが来るように設定したりするのですが、それだけでは気づきにくい場合もあります。チームによっては、マヌケな音を鳴らしたりするところもあるそうです。

そもそもプログラム開発の現場というのは、理不尽が幅をきかせる恐ろしい環境ですから、多少面白いことをしたりして気を紛らわせたくなるものです。僕もビルドやテストに失敗したときに何か面白いことができないかといろいろ考えて、ちょうど一年ほど前に、「失敗したら赤いランプが付くようにしたらどうだろう」と思いつきました。ある種の見える化になりますし、失敗した感じがよく出て面白いのではないか、と思ったのです。

ただ、PCからランプを制御する、というのは意外に難しいです。単にUSBから電源を取る、というものであればたくさんあるのですが、それをプログラム的にコントロール可能なものはなかなか見つかりませんでした。例えばこのような製品もあったりするのですが、いくらなんでも高すぎます。

ネットでは結局見つからなかったので、東京に行く用事があったついでに秋葉原によって探すことにしました。そこで見つけたのが、Webmail windowという製品です。ネットで探してもこのAkiba PC Hotlineの記事以外は全くと言っていいくらい情報がない上に、

動作が怪しくて、動く場合と動かない場合がある。正直、よくわからない

と店員に言われてしまうような代物ですが、USB給電でLEDを使用、青、赤、緑の三色に対応と、ハードウェアのスペックはまさに僕の理想通りです。値段もそれほど高くなかったので、早速買ってきました。

ただ難点なのは、ソフトの柔軟性が低いことです。Webmail windowというくらいなので、本来の目的はメールが来たことをユーザに知らせることであり、逆に言うと付属のソフトではそれしかできません。メールの送受信をスイッチにすることはできなくはないのですが、信頼性が低いですし、そもそもビルドマシンでそんな動作が怪しいソフトを動かすのは怖すぎます。ということで、買ったはいいのですがお蔵入りになってしまいました。

ただ、考えてみると、ハードウェアとしてそんな複雑なことをしているとは思えないですし、自分でデバイスドライバを書くという手もありそうです。ということで今日一念発起してやってみたら、意外と簡単にできてしまいました。以下にレポートとプログラムを公開したいと思います。

まずハードウェアとしての基本的な挙動なのですが、USBにWebmail windowを接続すると、HIDデバイスとして認識され、自動的マイクロソフトドライバがインストールされました。HIDデバイスというのは、マウスやキーボード、ジョイスティックのようなUSBデバイスの総称で、ある程度似通った仕組みでコントロールすることができます。

デバイスマネージャを見た限りでも、普通にHIDデバイスとして機能しているように見えます。この画面でわかるのですが、ベンダIDは0x1294、プロダクトIDは0x1320となっています。よって制御するための手順としては、

  • HIDデバイスのリストを取得して、ベンダIDとプロダクトIDがWebmail windowのものになっているデバイスを探す
  • それにデータを送り込んでLEDを制御する

ということになります。問題はどのようなデータを送り込んだらLEDの付き方が変わるのかなのですが…これは正直検討が付きませんでした。そんなに複雑ではないだろうと予測できますが、最悪プロトコルを解析しなければいけません。

もしかしたらWeb上に情報があるかもと思い、基板を見てみることにしました。

恐ろしくシンプルな基板です。真ん中にあるのがLEDですね。複数の色のLEDがセットになった部品のようです。ICは左側に一つしかないので、これがUSBの制御もしているはずですが、刻印も何もないので調べようがありません。残念ながら、基板からは情報が得られませんでした。とりあえず手当たりしだいにデータを送ってみるしかなさそうです。

ネットで調べてみると、WindowsでUSBの制御を行うには、Windows Driver Kitが必要のようです。早速ダウンロードしてインスートールし(結構でかいです)、HIDデバイスのhclientというサンプルを動かしてみると…あっさりWebmail windowを認識して、データを送り込むことができてしまいました。0を送ると付かないまま。1だと…緑になる。2だと…赤。ということは…と考えて、7を送ると、白色になりました。つまるところ、bit0,bit1,bit2に対してそれぞれ緑、赤、青が割り振られており、bitが立っている色が付くということのようです。LEDが付かない状態も含めると、8状態あることになります。

黄色もできるというのは説明書になかったので儲けた感じでした。例えば赤がビルドの失敗、黄色がテストの失敗というような感じで使い分けられそうです。
写真の撮り方がうまくなくて、光量が少ない感じになっていますが、実際には結構目立ちます。

というわけで、サンプルを元に作ったのがgithubに上がっているプログラムです。コンソールプログラムになっていて、使い方は

webmailwindow.exe -c [r|g|b|rg|rb|gb|rgb|none]

のような感じで、付けるLEDの色を指定します。つまり、

webmailwindow.exe -c r

とすれば赤のLEDが付きますし、

webmailwindow.exe -c rgb

では全てのLEDが付くので白になります。LEDを全部消すには

webmailwindow.exe -c none

です。非常駐で、LEDのパターンを変えたらすぐに終了します。点滅させるような用途だと、終了せずに一定間隔でスリープしながら動作するようにプログラムを修正した方がよいですね。

もしWebmail windowを持っている方で、使ってみたいという方は、README.txtに書いてある手順でビルドしていただけたらと思います。

今回はWebmail windowの仕様の単純さと、Windows Driver Kitのサンプルの優秀さに助けられた感じでした。さすがマイクロソフトだと思います。こういうデバイスはプログラムの制御次第でいろいろ面白い使い方ができそうで、楽しいですね。