先日Developers Boost 2019に参加したのですが、そこで講演・展示されていた株式会社マイクロアドさんのブースでRaspberry Pi用拡張基板(赤外線学習リモコン & 温湿度気圧センサー)を無料配布していたので、ありがたく頂きました。
ちょうど自宅にラズパイがあったので、拡張基板の赤外線学習リモコンとNode-REDを使用してスマホから家電を操作するスマートリモコンを作ってみました。
構成図
- Node-RED Dashboardを使用して画面を作成し、それをスマホで表示する
- ボタンを押すとラズパイ上のNode-RED上でフローが走る
- フロー上でボタンに対応する赤外線送信プログラムが実行される
- 赤外線が送信され、各種家電を制御する
今回はNode-REDを使ってリモコンの画面と赤外線送信部分をサクッと作ってみます。
環境
- Raspberry Pi 3 Model B+
- 赤外線学習リモコン & 温湿度気圧センサ HAT1
- Node-RED v1.0.2
- Node-RED Dashboard v2.19.0
- Python 3.5.3
準備
はんだ付け
今回頂いた物はプリント基板+各種パーツ(抵抗・コンデンサ・赤外線受光モジュール・赤外線LED等)だったので、基板に各種パーツをはんだ付けします。
はんだごてはAmazonで一式キットで2000円くらいで売っています。
インストール
pigpio
ラズパイの高精度なGPIO制御ライブラリ
sudo apt install pigpio python3-pigpio
sudo systemctl enable pigpiod.service
sydo systemctl start pigpiod
sudo crontab -u root -e
# crontabファイルの末尾に以下を追記
@reboot until echo ', 17 w w 17 0 m 18 r pud 18 u' > /dev/pigpio; do sleep 1s; done
IR Record and Playback
赤外線の学習・送信を行うPythonライブラリ
wget http://abyz.me.uk/rpi/pigpio/code/irrp_py.zip
unzip irrp_py.zip
解凍したirrp.py
を適当なフォルダ(例:/home/pi
)に配置します。
Node-RED
フローベースプログラミングツール。コードを書かなくてもノードを繋げていくだけでシステムが作れるのが特徴です。
また、サードパーティのノード(Twitter, Slack, etc.)も充実しているので、各種外部システムとの連携も簡単に行えます。
ラズパイ上に構築する場合は、以下のようにインストールスクリプトを実行するだけで簡単にインストールできます。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo systemctl enable nodered.service
Node-RED Dashboard
Node-RED上でUIを簡単に作れるAngularベースのライブラリです。
ダッシュボード用のチャートやグラフだけでなくボタンやフォームも配置できるので、今回はこのボタンを使用してリモコン画面を作っていきます。
-
http://[ラズパイのIP]:1880
にアクセス - 右上メニュー→「パレットの管理」→「ノードを追加」から
node-red-dashboard
を検索しノードを追加する
- 左側にDashboardのノードが出てきたらOK
実装
基板取り付け
はんだ付けした基板をラズパイと接続します。
今回はピンヘッダを差し込むだけで接続できる基板だったので、上からピンヘッダ部分を被せて繋ぎます。
接続したものが以下になります。
はんだ付けが汚かったりパーツが斜めってたりしますが2、ショート・断線さえしていなければ動くはずです。
赤外線学習
IR Record and Playbackを使って、家にあるリモコンの赤外線メッセージを学習していきます。
学習は以下のコマンドで実行できます。
python3 irrp.py -r -g18 --no-confirm --post 130 -f (保存ファイル名) (識別子)
保存ファイル名・識別子は適当に設定できますが、例えばライトの点灯の場合は
python3 irrp.py -r -g18 --no-confirm --post 130 -f light.irdata power:on
のようにするとよいでしょう。
各種オプションの意味は概ね以下の通りです。
-r: 学習(Record)モード
-p: 実行(Play)モード
-g: GPIO番号(今回は赤外線受光モジュール(受信)を18, 赤外線LED(送信)を17にしています)
--no-confirm: 再確認しない(デフォルトだと同じ信号を確認のため2回受信します)
--post: 学習終了判定するまでの時間間隔(ms)
-f: 保存先ファイル名
--post
の値に関しては、デフォルト値だと一部リモコン(エアコン等)の赤外線メッセージが途中で途切れて学習されてしまう場合があるため、少し長めに取っています。
赤外線送信
学習した赤外線メッセージは以下のコマンドを実行することで送信できます。
python3 irrp.py -r -g17 -f light.irdata power:on
Node-REDでスマートリモコン作成
学習した赤外線メッセージをスマホ上から実行できるようにしてみます。
ボタン押下をトリガーに上記の赤外線送信コマンドを叩けばよいのですが、これはNode-REDのexec
ノードとNode-RED Dashboardのbutton
ノードを使うと簡単に実現できます。
試しにbutton
ノードとexec
ノードを以下のような感じで繋いでみます。
button
ノードのPayload
に保存ファイル名と識別子を入力しておきます。こうすることで、引数だけ変えた別のボタンも簡単に追加できます。
exec
ノードでは、引数にmsg.payload
を指定して、コマンドには保存ファイル名より前の部分を記入します。
こうすることで、ボタンを押したらpython3 /home/pi/irrp.py -p -g17 -f light.irdata power:on
がラズパイ上で実行されます。
他のボタンを追加する際は、以下のようにボタンのPayload
だけ変えて同じexec
ノードに繋げばOKです。
ボタンのレイアウト・順番については、右側の「ダッシュボード」タブから設定できます。
「レイアウト」ボタンをクリックすると、以下のようにグリッドレイアウトを直感的に配置できます。
完成したら「デプロイ」をクリックすればOKです。画面は、ダッシュボードタブのをクリックすれば確認できます。
http://[ラズパイのIP]:1880/ui
にアクセスしても表示できます。スマホから表示する際はこのURLをブックマークに入れておくとよいでしょう。
画面
最終的に以下のような画面になりました。
button
ノードのプロパティから各ボタンの背景色を変えたり、アイコンを設定したり等もできます。
また、テレビのリモコンも同様に作ってみました。
電気よりボタン数が多いですが、やっていることは同じです。
電源ボタン等はLabel
プロパティを設定する代わりに、Icon
プロパティにAngular Material Iconsのアイコン名を設定しています(画像2枚目)。
フローはこんな感じです。ボタン数が多いので線がだいぶカオスですが。
link in / link out
ノードで仮想リンクを作成して見やすくしていたり、template
ノードを利用してファイル名をまとめたりしていますが、基本的には上でやったことを繰り返していくだけで作れます。
ちなみに間に挟んでいるtemplate
ノードは以下のようになっていて、各ボタンのpayload
には識別子のみを入れてファイル名を共通化できるようにしています。
まとめ
Node-REDを使って、ほぼプログラミングレスでスマートリモコンを作成してみました。
Node-REDのうまみはサクサク作れることと拡張性にあると思っています。
例えば上のテレビリモコンくらいだったら慣れれば1時間弱で作成できます。
また、後から「やっぱSlackをトリガーに電源ONにできるようにもしたい」となった時でも、上のフローにSlackノードを繋げるだけでよいので(Slack Appの作成等はありますが)、かなり拡張性が高いと個人的には思っています。
参考
-
格安スマートリモコンの作り方 - Qiita
今回使用したpigpio/IRRPや、回路製作について非常に詳しく解説されています。