はじめに
Home IoTって響きカッコ良いですよね。家中の家電を IoT に繋げるのってロマンですよね。この記事は、Home IoT の第一歩として、まずは家電の自動制御についての紹介です。
家電を制御するには、以下のような手段が考えられます。
- 赤外線リモコン (テレビやエアコンが代表例)
- WIFI, Bluetooth搭載家電 (稀有ですね)
- switchbot の様な外付け制御装置
- スマートプラグで、ACコンセントの断続を WIFI, Bluetooth などで制御
今回は、家電制御の主流である 1. 赤外線リモコン に着目してみます。
マイコンと、簡単な外付け回路で、赤外線リモコンの信号データ収集と
送信を実現します。
マイコンで赤外線リモコンの送受信制御が本稿のテーマ
micropython
本稿のこだわりは、micropython。組込みマイコンにも python の波が押し寄せています。まだ一部のマイコンボード限定ですが、C/C++ アレルギーの方には朗報でしょう。これは使い倒す以外にありません。
- シンプルなプログラミング言語 python のサブセット
- 書いたコードが即座に動く REPL 環境
- 公式ドキュメント の充実
- 開発環境のセットアップが不要
とは言え、micropython にも欠点があります。リアルタイム性に弱く、処理スピードが (C/C++ に比べ) 遅くなっています。赤外線リモコンの送受信処理では、この欠点が致命傷になります。本稿で紹介する赤外線リモコンライブラリは、その欠点を巧みに回避し、安定した動作を実現しています。
micropython は欠点を踏まえて使えば最強。
リモコン送受信ライブラリの決定版 RemotePy
Arduino版(C/C++) の赤外線リモコンライブラリと言えば、IRremote でしょう。リモコン信号解析などの機能も豊富で、かなり大がかりなライブラリです。
一方 micropython 版になると、あまり良い赤外線リモコンライブラリがありません。そこで、自作してしまいました。github で公開しています。「決定版」だなんて自画自賛も甚だしい限りです...
- 本家 micropython 上で動作します。
- ESP32, RP2040 (Raspberry Pi Picoが代表例) の両マイコン限定です。
- 極めてシンプルな構成のライブラリで、理解・改変も容易でしょう。
- リモコン信号の取得に校正処理を掛けているため、極めて安定した動作をします。
- リモコンのメーカに依らず、家電の種類にも依りません。
- すぐ使えるように、PC側のGUIアプリケーションソフトも同梱しています。
赤外線リモコンライブラリの (自称) 決定版 RemotePy
プログラム準備
対象となるマイコンは、ESP32 と RP2040(代表例 Raspberry Pi Pico) の2種類になります。
- 本家micropython Download から、適切なファームウェアをダウンロードします。
- マイコンに同ファームウェアを書込みます。
- github RemotePy をダウンロードします。UpyIrTx.py, UpyIrRx.py 2つのファイルを、マイコンに書込みます。
- 赤外線送信は UpyIrTx.py を、赤外線受信は UpyIrRx.py を用いて、メインプログラム main.py を記述します。main.py をマイコンに書込めばプログラム完成です。
- マイコンボードとは別に、赤外線リモコン送受信する外付け基板を用意します。
外付け赤外線送受信回路
赤外線リモコン送受信するには、専用回路が必要になります。回路の代表例は
下回路図の通りです。専用の回路を起こすのが大変な場合、出来合いのモジュール製品(IR REMOTE UNIT) を利用すると便利です。
送信側と、受信側の回路は独立しているため、どちらか一方しか使わないなら、他方は不要です。受信回路は、リモコン信号を学習する時にだけ、使われることが多いでしょう。
送信には、赤外線LED ( 部品例 ) が必要です。
受信には、赤外線リモコン受信モジュール ( 部品例 ) が必要です。稀に Vout にプルアップ抵抗が必要になるモジュールも存在します。その場合、RxPin にはプルアップ抵抗を挿入します。
プログラム事例
ライブラリ UpyIrTx.py , UpyIrRx.py のAPI仕様は、ドキュメント をご覧ください。使い方はとっても簡単です。受信ライブラリ UpyIrRx.py により、リモコン信号が数値リスト形式で取得出来ます。送信ライブラリ UpyIrTx.py により、得られた数値リストを指定すると、赤外線リモコン送信されます。
ESP32 内蔵の M5Stack ATOM と、IR REMOTE UNIT を Grove コネクタで接続した場合のプログラム事例です。
# main.py
from machine import Pin
from UpyIrTx import UpyIrTx
from UpyIrRx import UpyIrRx
rx_pin = Pin(32, Pin.IN) # Pin No.32
rx = UpyIrRx(rx_pin)
tx_pin = Pin(26, Pin.OUT) # Pin No.26
tx = UpyIrTx(0, tx_pin) # 0ch
...
# 3000msec 以内に、受信回路に向けてリモコン送信すると、リモコン信号取得される。
rx.record(3000)
if rx.get_mode() == UpyIrRx.MODE_DONE_OK:
signal_list = rx.get_calibrate_list()
# ex) [430, 1290, 430, 430, 430, 860, ...]
else:
signal_list = []
...
# 送信回路から、リモコン信号を送信する。送信完了までブロッキング。
if signal_list:
tx.send(signal_list)
...
デモプログラム
赤外線リモコン信号を学習 & ファイル保存し、送信テストも出来る GUI アプリケーションソフトも同梱されています。M5Stack ATOM と、IR REMOTE UNIT を Grove コネクタで接続した実機で、すぐに試せます。
PC 側は、Windows, Ubuntu, Raspbian での動作を確認しています。この PC 側アプリケーションソフトは、M5Stack ATOM 以外のマイコンに対しても使えます。但し、一部モジュール communication.py を微修正する必要があります。詳しくは マニュアル をご覧ください。
- デモ用 main.py と、ライブラリ UpyIrTx.py , UpyIrRx.py をマイコンに書込みます。
- M5Stack ATOM と PC 間を USBケーブルで接続します。
- PC 側には python (可能ならAnaconda推奨) をインストールをします。
- PC 側には、pySerialライブラリ をインストールします。
$ pip install pyserial
- デモ用PCアプリ を PC にコピーして、PC から main.py を起動します。
既存又は新規ファイル名をオープンして、赤外線リモコン信号の学習 & 保存が出来ます。学習データの正当性を確認するために、送信を試すことも出来ます。赤外線リモコン信号は、json 形式のテキストファイルとして保存されます。詳細な使い方は、マニュアル を参照ください。
赤外線リモコン信号を学習した json ファイルを事前に用意しておけば、その記録信号を元に好きに送信することが出来ます。json ファイルは以下の様なフォーマットになっています。"signal" キーにある、数値リストで、赤外線リモコンの送信が出来るようになります。上記のプログラム事例での、tx.send(数値リスト)
に相当します。
{"リモコン信号キー名1(ex. CH1)" : {"signal": [数値リスト...], "comment": "任意コメント1"},
"リモコン信号キー名2(ex. VolUp)": {"signal": [数値リスト...], "comment": "任意コメント2"},
...}
家じゅうにある赤外線リモコンをかき集めて、信号を片っ端から学習しちゃいましょう。
Home IoT に向けて
マイコンに ESP32 を使った場合は、WIFI 接続することが出来ます。家庭内に Raspberry Pi サーバーを立てて連携することで、なんちゃって IoT家電に早変わりです。
家庭内 Raspberry Pi サーバーを ngrok と組み合わせることで、外出中のスマホやLINE 経由で家電制御が出来るようになります。本稿に引き続き、IoT化の道筋を別記事で紹介したいと思います。ご期待ください。
本稿は、その第一歩、赤外線リモコン信号の学習でした。気に入って頂けましたら、こちら(github) までスターをよろしくお願いいたします。