帰宅したときに部屋が暑すぎるのが嫌だったのでリモートからエアコンの電源を操作できたらいいなあ、という理由で 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 件のコメント:
コメントを投稿