はじめに
事の発端はラズベリー・パイ専用 学習リモコン基板が発売されたと聞いて絶対買わねばと思い東京出張のときにツクモロボット館に買いに行ったら売り切れててがっかりしてコンデンサーでもさがすかーと思って千石電商に行ったら偶然前バージョンのUSB赤外線リモコンアドバンスを発見した。
Windows用だけど要はシリアル通信だからなんとかすればラズパイで動くんじゃね?と思って衝動してやってみた。
結論、Linuxで動くCLIが用意されていたのでかなり簡単にできました。
できた図
赤外線リモコンアドバンスはUSB Mini B メスでRaspberry Pi Zero WはUSB Micro B メス。
手持ちにMicro Bオス<->Aメスの変換ケーブルとAオス<->Mini Bオスの変換プラグがあったのでつなぎ合わせてこうなりました。
セットアップ
上記を参考にさせていただいた。ありがとうございます。
ざっくりいうと書いてあるとおりにすればOK。
sudo apt install libusb-1.0.0
git clone https://github.com/Drunkar/bto_ir_advanced_cmd.git
cd bto_ir_advanced_cmd
make
sudo make install
bto_advanced_USBIR_cmd --help
ヘルプが表示されたらインストール完了です。
リモコン信号を記憶させる
まず以下のコマンドを実行します。
bto_advanced_USBIR_cmd -r
受信を開始しました。
受信を開始しました。
が表示された後、赤外線リモコンアドバンスの受光部に向かってリモコンのボタンを押します。今回はエアコンのONスイッチを押してみました。ボタンを押すと同時に赤外線リモコンアドバンスの緑のLEDが光って受信したことがわかります。
受信できたら、
bto_advanced_USBIR_cmd -s
受信を停止しました。
で受信を終了します。
リモコン信号を送信する
以下のコマンドで data.txt
に受信した信号を書き出します。
bto_advanced_USBIR_cmd -g | tee data.txt
以下のような出力で、 data.txt
に信号が書き込まれます。
取得したbyte配列の要素数:424
0x00,0xe7,0x00,0x4e,0x00,0x12,0x00,0x4e,0x00,0x13,0x00,0x4e,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x4d,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x4c,0x00,0x14,0x00,0x4e,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x15,0x00,0x1d,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x4d,0x00,0x13,0x00,0x4d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x4d,0x00,0x13,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x4d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x4c,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x4c,0x00,0x15,0x00,0x1d,0x00,0x14,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x12,0x00,0x1f,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1e,0x00,0x12,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x13,0x01,0x6a,0x00,0xe6,0x00,0x4e,0x00,0x13,0x00,0x4d,0x00,0x14,0x00,0x4c,0x00,0x13,0x00,0x1f,0x00,0x12,0x00,0x1f,0x00,0x13,0x00,0x4d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1e,0x00,0x14,0x00,0x4b,0x00,0x15,0x00,0x4d,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x4d,0x00,0x13,0x00,0x4d,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x4c,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x4d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x4d,0x00,0x13,0x00,0x1f,0x00,0x12,0x00,0x4d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1e,0x00,0x12,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1d,0x00,0x14,0x00,0x1e,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1e,0x00,0x14,0x00,0x1d,0x00,0x13,0x00,0x1e,0x00,0x13,0x00,0x1f,0x00,0x13,0x00,0x1d,0x00,0x14,0x1e,0x0d
以下のコマンドで、書き込んだ信号を赤外線リモコンアドバンスから発信できます。
bto_advanced_USBIR_cmd -d cat data.txt
エアコンが動きました。LEDが3つも付いてるせいか3mくらい離れたところからでも信号が届くみたい。これいい。
さて、これでシェルでも組めばOKなんだけど、バックグラウンドプロセスで動くプログラムを想定すると、 cat
を使うことができないんで、システムコマンドで bto_advanced_USBIR_cmd
を動かす想定でプログラムを組んでおくっていうか上記記事のコピペです。
#!/usr/bin/python3
import os
import sys
def send(code):
os.system('/usr/local/bin/bto_advanced_USBIR_cmd -d ' + code)
if __name__ == '__main__':
argv = sys.argv
try:
filename = argv[1]
if os.path.isfile(filename) is True:
f = open(filename, 'r')
code = f.read()
send(code)
sys.exit(0)
else:
sys.stderr.write('File not found.\n')
sys.exit(-1)
except (OSError, IndexError):
sys.stderr.write('File not found.\n')
sys.exit(-1)
chmod +x send_ir
./send_ir data.txt
動いた。
まとめ
特にハマりどころなく動いてすごいなと思った。あとはアプリをつくってインターネット経由でON OFFできるようにすればIoT家電的な感じにできますね。学習リモコンって買おうと思って調べたらけっこう高いものだったので余ってるラズパイとこういうモジュールを組み合わせてできると安くできていいですね。Zero Wだと小さいし。