2018年3月3日土曜日

Raspberry Pi zero Wで赤外線リモコン

Raspberry Pi zero Wで赤外線LEDを使って家電のリモコン操作をします。

lircというモジュールを入れると赤外線送受信(デコード/エンコード)ができるようです。

回路図はESP32のとき(下図)の1号とほぼ同じです。
LEDが2系統となり、流せる電流が16mAと、ちょっと少ないため、ベースの直列抵抗が110ではなく、200Ωになっています。(端子電圧3.3Vに対して、16mAで電圧降下3.2V)



下記のサイトを参考にセットアップします。
@ww24様の
Raspberry Pi Zero で赤外線リモコンを作る
以下引用
sudo apt install lirc
上記の後、/boot/config.txtに下記を追記 
# Uncomment this to enable the lirc-rpi module
dtoverlay=lirc-rpi,gpio_in_pin=24,gpio_out_pin=23

わかりにくいので注意してください。
送信:16番ピン(GPIO23)
受信:18番ピン(GPIO24)

ここで再起動した後、
mode2 -d /dev/lirc0 | sed -ue '1d' | tee aircon_on.txt
で信号を受信するのですが、Partial read 8 bytesというメッセージが出てどうもうまく動きません。

いろいろ調べていくうちに設定を変更するバッチファイルを実行すると動くようになるという記事を見つけました。
https://www.raspberrypi.org/forums/viewtopic.php?t=192891
sudo /usr/share/lirc/lirc-old2new.sh
この後、再起動するとうまく動くようになりました。

信号受信ですが、
irrecordというコマンドで自動で設定ファイルを作成してくれるタイプと、
mode2というコマンドで生データを受信して設定するタイプの2種類あります。

エアコンはmode2の生データで、その他はirrecordで作成しました。
irrecordのやり方は下記のサイトがわかりやすかったです。
Raspbian Jessie 2017-07最終版で LIRCを使って学習リモコン、赤外線リモコンを送受信する方法

うまく設定できると、
irsend SEND_ONCE aircon on
といった感じで赤外線LEDが光るようになります。
エラーが出たりするときは
sudo /etc/init.d/lircd stop
で一度止めて
sudo /etc/init.d/lircd start
したりするとうまくいったりします。

次にBlynkでスマホやIFTTTから操作できるようにします。
他の記事ではルータの外からラズベリーパイに接続するためにngrok等を使われていますが、私はESP32でBlynkを使っていた関係で、今回もBlynkを使っています。

参考にしたのは下記のサイトです。
Raspberry Piブログ様の
第1回 IoTサービス「Blynk」を導入しよう - 連載 IoTサービス「Blynk」を使ってRaspberry Piをスマホからコントロールしよう
以下引用:
$ cd
$ mkdir blynk
$ cd blynk
$ git clone https://github.com/blynkkk/blynk-library.git
$ cd blynk-library/linux
$ make clean all target=raspberry

リンクの作成
$ cd ../..
$ ln -s blynk-library/linux/blynk .

詳細は思い出せませんが、おそらくこのタイミングで
/home/pi/blynk/blynk-library/linuxにあるmain.cppを編集しています。
Blynkでスライダーに0~10までの数字を設定してV0に投げます。

必要部分だけこんな感じです。
case1は照明を切るため順送りのコマンドを3回送信しています。

BLYNK_WRITE(V0)
{
char command[256] = "";
     printf("Got a value: %s\n", param[0].asStr());

switch(param[0]){
case 0:
sprintf(command, "irsend SEND_ONCE LIGHT CH2");
break;
case 1:
sprintf(command, "irsend SEND_ONCE LIGHT CH2");
  system(command);
   delay(400);
   system(command);
   delay(400);
break;
case 2:
sprintf(command, "irsend SEND_ONCE aircon on");
break;
case 3:
sprintf(command, "irsend SEND_ONCE aircon off");
break;
case 4:
                   (すきなだけ並べる)
default:
sprintf(command, "irsend SEND_ONCE LIGHT CH2");
}
  system(command);
}

そして起動
$ sudo ./blynk --token=自分のAUTH TOKENを指定

起動時に自動実行するために/etc/rc.localに
sudo /home/(ユーザー名)/blynk/blynk --token=(トークン)
を記入しました。

Google home → IFTTT → Blynk → Raspberry Pi zero Wという流れで家電をリモコン操作します。