micropythonで赤外線リモコンの簡単制御 

# はじめに

Home IoTって響きカッコ良いですよね。家中の家電を IoT に繋げるのってロマンですよね。この記事は、Home IoT の第一歩として、まずは家電の自動制御についての紹介です。

家電を制御するには、以下のような手段が考えられます。

1. 赤外線リモコン (テレビやエアコンが代表例)
2. WIFI, Bluetooth搭載家電 (稀有ですね)
3. [switchbot](https://www.switchbot.jp/) の様な外付け制御装置
4. スマートプラグで、ACコンセントの断続を WIFI, Bluetooth などで制御

今回は、家電制御の主流である **1. 赤外線リモコン** に着目してみます。
マイコンと、簡単な外付け回路で、赤外線リモコンの信号データ収集と
送信を実現します。

:::note info
マイコンで赤外線リモコンの送受信制御が本稿のテーマ
:::

# micropython

本稿のこだわりは、[micropython](https://micropython.org/)。組込みマイコンにも python の波が押し寄せています。まだ一部のマイコンボード限定ですが、C/C++ アレルギーの方には朗報でしょう。これは使い倒す以外にありません。

* シンプルなプログラミング言語 python のサブセット
* 書いたコードが即座に動く REPL 環境
* [公式ドキュメント](https://micropython-docs-ja.readthedocs.io/ja/latest/) の充実
* 開発環境のセットアップが不要

とは言え、micropython にも欠点があります。リアルタイム性に弱く、処理スピードが (C/C++ に比べ) 遅くなっています。赤外線リモコンの送受信処理では、この欠点が致命傷になります。本稿で紹介する赤外線リモコンライブラリは、その欠点を巧みに回避し、安定した動作を実現しています。

:::note info
micropython は欠点を踏まえて使えば最強。
:::

# リモコン送受信ライブラリの決定版 RemotePy

Arduino版(C/C++) の赤外線リモコンライブラリと言えば、[IRremote](https://github.com/Arduino-IRremote/Arduino-IRremote) でしょう。リモコン信号解析などの機能も豊富で、かなり大がかりなライブラリです。

一方 micropython 版になると、あまり良い赤外線リモコンライブラリがありません。そこで、自作してしまいました。[github](https://github.com/meloncookie/RemotePy) で公開しています。「決定版」だなんて自画自賛も甚だしい限りです...

* 本家 [micropython](https://micropython.org/) 上で動作します。
* ESP32, RP2040 (Raspberry Pi Picoが代表例) の両マイコン限定です。
* 極めてシンプルな構成のライブラリで、理解・改変も容易でしょう。
* リモコン信号の取得に校正処理を掛けているため、極めて安定した動作をします。
* リモコンのメーカに依らず、家電の種類にも依りません。
* すぐ使えるように、PC側のGUIアプリケーションソフトも同梱しています。

:::note info
赤外線リモコンライブラリの (自称) 決定版 [RemotePy](https://github.com/meloncookie/RemotePy)
:::

# プログラム準備

対象となるマイコンは、ESP32 と RP2040(代表例 Raspberry Pi Pico) の2種類になります。

1. [本家micropython Download](https://micropython.org/download/) から、適切なファームウェアをダウンロードします。
2. マイコンに同ファームウェアを書込みます。
3. [github RemotePy](https://github.com/meloncookie/RemotePy) をダウンロードします。UpyIrTx.py, UpyIrRx.py 2つのファイルを、マイコンに書込みます。
4. 赤外線送信は UpyIrTx.py を、赤外線受信は UpyIrRx.py を用いて、メインプログラム main.py を記述します。main.py をマイコンに書込めばプログラム完成です。
5. マイコンボードとは別に、赤外線リモコン送受信する外付け基板を用意します。

# 外付け赤外線送受信回路

赤外線リモコン送受信するには、専用回路が必要になります。回路の代表例は
下回路図の通りです。専用の回路を起こすのが大変な場合、出来合いのモジュール製品([IR REMOTE UNIT](https://docs.m5stack.com/en/unit/ir)) を利用すると便利です。
送信側と、受信側の回路は独立しているため、どちらか一方しか使わないなら、他方は不要です。受信回路は、リモコン信号を学習する時にだけ、使われることが多いでしょう。

送信には、赤外線LED ( [部品例](https://akizukidenshi.com/catalog/g/gI-04779/) ) が必要です。
受信には、赤外線リモコン受信モジュール ( [部品例](https://akizukidenshi.com/catalog/g/gI-06487/) ) が必要です。稀に Vout にプルアップ抵抗が必要になるモジュールも存在します。その場合、RxPin にはプルアップ抵抗を挿入します。

![circuit](https://user-images.githubusercontent.com/70054769/173816889-b307c403-49af-4b75-9cd2-47b34d955423.png)

# プログラム事例

ライブラリ UpyIrTx.py , UpyIrRx.py のAPI仕様は、[ドキュメント](https://github.com/meloncookie/RemotePy/blob/main/README_jp.md) をご覧ください。使い方はとっても簡単です。受信ライブラリ UpyIrRx.py により、リモコン信号が数値リスト形式で取得出来ます。送信ライブラリ UpyIrTx.py により、得られた数値リストを指定すると、赤外線リモコン送信されます。

ESP32 内蔵の [M5Stack ATOM](https://docs.m5stack.com/en/core/atom_matrix) と、[IR REMOTE UNIT](https://docs.m5stack.com/en/unit/ir) を Grove コネクタで接続した場合のプログラム事例です。

```python
# 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)
...
```

![M5Stack](https://user-images.githubusercontent.com/70054769/170875733-371c58ea-0572-4239-bfab-3c58ea8ff3b9.jpg)

# デモプログラム

赤外線リモコン信号を学習 & ファイル保存し、送信テストも出来る GUI アプリケーションソフトも同梱されています。[M5Stack ATOM](https://docs.m5stack.com/en/core/atom_matrix) と、[IR REMOTE UNIT](https://docs.m5stack.com/en/unit/ir) を Grove コネクタで接続した実機で、すぐに試せます。

PC 側は、Windows, Ubuntu, Raspbian での動作を確認しています。この PC 側アプリケーションソフトは、M5Stack ATOM 以外のマイコンに対しても使えます。但し、一部モジュール communication.py を微修正する必要があります。詳しくは [マニュアル](https://github.com/meloncookie/RemotePy/blob/main/README_jp.md) をご覧ください。

1. [デモ用 main.py](https://github.com/meloncookie/RemotePy/blob/main/demo/micropython/main.py) と、[ライブラリ UpyIrTx.py , UpyIrRx.py](https://github.com/meloncookie/RemotePy/tree/main/micropython/ESP32/FromV1_17) をマイコンに書込みます。
2. M5Stack ATOM と PC 間を USBケーブルで接続します。
3. PC 側には python (可能ならAnaconda推奨) をインストールをします。
4. PC 側には、[pySerialライブラリ](https://pythonhosted.org/pyserial/) をインストールします。 `$ pip install pyserial`
5. [デモ用PCアプリ](https://github.com/meloncookie/RemotePy/tree/main/demo/GUI) を PC にコピーして、PC から main.py を起動します。

![gui](https://user-images.githubusercontent.com/70054769/172902379-3fce461f-63b1-4cf4-a9a1-cd01fe665a29.png)

既存又は新規ファイル名をオープンして、赤外線リモコン信号の学習 & 保存が出来ます。学習データの正当性を確認するために、送信を試すことも出来ます。赤外線リモコン信号は、json 形式のテキストファイルとして保存されます。詳細な使い方は、[マニュアル](https://github.com/meloncookie/RemotePy/blob/main/README_jp.md) を参照ください。

赤外線リモコン信号を学習した json ファイルを事前に用意しておけば、その記録信号を元に好きに送信することが出来ます。json ファイルは以下の様なフォーマットになっています。"signal" キーにある、数値リストで、赤外線リモコンの送信が出来るようになります。上記のプログラム事例での、`tx.send(数値リスト)` に相当します。

```json
{"リモコン信号キー名1(ex. CH1)"  : {"signal": [数値リスト...], "comment": "任意コメント1"},
 "リモコン信号キー名2(ex. VolUp)": {"signal": [数値リスト...], "comment": "任意コメント2"},
 ...}
```

:::note info
家じゅうにある赤外線リモコンをかき集めて、信号を片っ端から学習しちゃいましょう。
:::

# Home IoT に向けて

マイコンに ESP32 を使った場合は、WIFI 接続することが出来ます。家庭内に Raspberry Pi サーバーを立てて連携することで、なんちゃって IoT家電に早変わりです。

家庭内 Raspberry Pi サーバーを [ngrok](https://ngrok.com/) と組み合わせることで、外出中のスマホやLINE 経由で家電制御が出来るようになります。本稿に引き続き、IoT化の道筋を別記事で紹介したいと思います。ご期待ください。

本稿は、その第一歩、赤外線リモコン信号の学習でした。気に入って頂けましたら、[こちら(github)](https://github.com/meloncookie/RemotePy) までスターをよろしくお願いいたします。