Raspberry Pi/赤外線リモコンアドバンスをRaspPi Zero Wで使ってみる

# はじめに

事の発端は[ラズベリー・パイ専用 学習リモコン基板](http://btoshop.jp/2017/12/08/4562469771380/)が発売されたと聞いて絶対買わねばと思い東京出張のときにツクモロボット館に買いに行ったら売り切れててがっかりしてコンデンサーでもさがすかーと思って千石電商に行ったら偶然前バージョンの[USB赤外線リモコンアドバンス](http://bit-trade-one.co.jp/product/module/adir01p/)を発見した。

Windows用だけど要はシリアル通信だからなんとかすればラズパイで動くんじゃね？と思って衝動してやってみた。

結論、Linuxで動くCLIが用意されていたのでかなり簡単にできました。

# できた図

![IMG_20171229_203354.jpg](https://qiita-image-store.s3.amazonaws.com/0/61995/c5da8810-bb52-c5d0-c2e8-58a9ef08761e.jpeg)

赤外線リモコンアドバンスはUSB Mini B メスでRaspberry Pi Zero WはUSB Micro B メス。
手持ちにMicro Bオス<->Aメスの変換ケーブルとAオス<->Mini Bオスの変換プラグがあったのでつなぎ合わせてこうなりました。

# セットアップ

https://qiita.com/Kaz-su/items/93ec120b4bb90de7da2b

上記を参考にさせていただいた。ありがとうございます。
ざっくりいうと書いてあるとおりにすれば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` を動かす想定でプログラムを組んでおくっていうか上記記事のコピペです。

```ir_send.py
#!/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だと小さいし。