2013年7月21日日曜日

BitTradeOne の赤外線リモコンKitを Linux から使ってみた

帰宅したときに部屋が暑すぎるのが嫌だったのでリモートからエアコンの電源を操作できたらいいなあ、という理由で USB 接続の赤外線リモコンを購入してみた。

購入したものはコレ。

  USB接続 赤外線リモコンキット

半田付けするのはめんどうだったので、完成品を購入。
フリスクのケースにあうように作られているらしい。

届いてから色々と調べてみて Linux では hiddev ファイルに書き込めばいいらしいということがわかったのですが、スレッドの msg#1.2.1 と同じようなことになり使うことができなかった。

このリモコンキットはファームウェアのソースコードやWindowsのアプリのソースコードなどが公開されているので、それを参考にしつつプログラムを作ってみた。


app-misc/lirc とかのドライバとして作るのがほんとはいいのかも。

Linuxで操作するための手段としては

  • hiddev インターフェイスを使う
  • libhid を使う
  • libusb を使う

などがあるが、HIDのインターフェイスのことがよくわからず、Broken pipeばかりで解決できなかったので libusb を使うことにした。

このリモコンキットには4つのInterfaceDescriptorがありますが、使用するのは interfaceNumber 3 のみです。



lsusbの結果
今回使う部分だけ抜粋すると下記の部分です。
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               8
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x04  EP 4 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               8
デバイスからデータを貰ってくるときは EP Address 0x84 を libusb_interrupt_transfer() に渡してあげれば良さそうです。
逆にデバイスに書き込む際は EP Address 0x04 を渡せばいいようです。

続いてリモコンキットの制御コードの部分。

これは〔ファームウェアソースコード(Ver2.1.0〕の中を参考にします。
アーカイブの中の main.c がファームウェアのソースコードのようです。
ProcessIO() の中に switch 文があり、そこに制御コードが書かれています。

制御コード説明
0x56Get Firmware version
0x80EEPROMにデータを設定(サイズ61)
0x81EEPROMにデータを設定(サイズ10)
0x82EEPROMからデータ読み出し(サイズ61)
0x83EEPROMからデータ読み出し(サイズ10)
0x40Echo back
0x41Echo back
0x50赤外線受信データを送信(デバイス->Host)
0x51赤外線受信待ちモード設定(1=受信待ち,  0=解除)
0x52赤外線受信データを送信 拡張版(デバイス->Host, 65 octets)
0x53赤外線受信待ちモード設定 拡張版(1=受信待ち,  0=解除)
0x60赤外線出力データを受信する(7 Octets)
0x61赤外線出力データを受信する 拡張版(65 Octets)


赤外線をリモコンキットで受信する場合は
  0x53 0x01 0xFF 0xFF ....
というパケットを EPAddress 0x04 に投げます。
パケットサイズは 64 Bytes なので余った部分は 0xFF で埋めます。
これで受信待ちモードになったので、続いてデバイスからデータを読み出す制御コードを送りつけます。
 0x52 0xFF 0xFF 0xFF ....
このパケットを繰り返しデバイスに送っておきつつ EPAddress 0x84 を読み込めば赤外線を受信したときにコードを取れます。


リモコンキットから赤外線を送信する場合は
 0x61
の後に続けて送りたいコードをつけて EPAddress 0x04 に投げつければ送信されます。




久々にブログ書いたけど、文章まとめるの難しい..