帰宅したときに部屋が暑すぎるのが嫌だったのでリモートからエアコンの電源を操作できたらいいなあ、という理由で USB 接続の赤外線リモコンを購入してみた。
購入したものはコレ。
USB接続 赤外線リモコンキット
半田付けするのはめんどうだったので、完成品を購入。
フリスクのケースにあうように作られているらしい。
届いてから色々と調べてみて Linux では hiddev ファイルに書き込めばいいらしいということがわかったのですが、スレッドの msg#1.2.1 と同じようなことになり使うことができなかった。
このリモコンキットはファームウェアのソースコードやWindowsのアプリのソースコードなどが公開されているので、それを参考にしつつプログラムを作ってみた。
app-misc/lirc とかのドライバとして作るのがほんとはいいのかも。
Linuxで操作するための手段としては
などがあるが、HIDのインターフェイスのことがよくわからず、Broken pipeばかりで解決できなかったので libusb を使うことにした。
このリモコンキットには4つのInterfaceDescriptorがありますが、使用するのは interfaceNumber 3 のみです。
購入したものはコレ。
USB接続 赤外線リモコンキット
半田付けするのはめんどうだったので、完成品を購入。
フリスクのケースにあうように作られているらしい。
届いてから色々と調べてみて Linux では hiddev ファイルに書き込めばいいらしいということがわかったのですが、スレッドの msg#1.2.1 と同じようなことになり使うことができなかった。
このリモコンキットはファームウェアのソースコードやWindowsのアプリのソースコードなどが公開されているので、それを参考にしつつプログラムを作ってみた。
app-misc/lirc とかのドライバとして作るのがほんとはいいのかも。
Linuxで操作するための手段としては
- hiddev インターフェイスを使う
- libhid を使う
- libusb を使う
などがあるが、HIDのインターフェイスのことがよくわからず、Broken pipeばかりで解決できなかったので libusb を使うことにした。
このリモコンキットには4つのInterfaceDescriptorがありますが、使用するのは interfaceNumber 3 のみです。
lsusbの結果
今回使う部分だけ抜粋すると下記の部分です。
逆にデバイスに書き込む際は EP Address 0x04 を渡せばいいようです。
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 文があり、そこに制御コードが書かれています。
赤外線をリモコンキットで受信する場合は
パケットサイズは 64 Bytes なので余った部分は 0xFF で埋めます。
これで受信待ちモードになったので、続いてデバイスからデータを読み出す制御コードを送りつけます。
これは〔ファームウェアソースコード(Ver2.1.0〕の中を参考にします。
アーカイブの中の main.c がファームウェアのソースコードのようです。
ProcessIO() の中に switch 文があり、そこに制御コードが書かれています。
制御コード | 説明 |
---|---|
0x56 | Get Firmware version |
0x80 | EEPROMにデータを設定(サイズ61) |
0x81 | EEPROMにデータを設定(サイズ10) |
0x82 | EEPROMからデータ読み出し(サイズ61) |
0x83 | EEPROMからデータ読み出し(サイズ10) |
0x40 | Echo back |
0x41 | Echo 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 に投げつければ送信されます。
久々にブログ書いたけど、文章まとめるの難しい..
0 件のコメント:
コメントを投稿