やりたいこと:WioTerminalには赤外線リモコン機能が付いており、WioTerminalから信号を送出して照明を操作したい
課題:Arduino版には赤外線リモコン用モジュールがあるようなのだが、そもそもリモコンがどんな信号を送ってるのか分からないので実装できない
取り組み:赤外線リモコン受信モジュール(GP1UXC41QS)を使って、リモコンから出ている赤外線の波形を読み取ってデータをエンコードする
結論:データのエンコードまではできて、メーカコード、コマンドまでは特定できた
詳細:
赤外線リモコンを自由に制御するネタはいろんな所で記事が出ていて既出なのだが、自宅の照明のリモコン信号をWioTerminalから送出して照明を制御したいので、自分でも調べてみる
まずは、赤外線リモコン受信モジュール(GP1UXC41QS)とオシロを接続。リモコンから出ている信号を受信パーツで受信して0/3.3Vに信号化したのをオシロで観測。以下はオシロでSYNCしてリモコン波形を取得したところ(モジュール出力はリモコンからの出力に対して反転されるので、分かりやすくするため、観測波形を表示上反転させています)。オシロの波形をよく見て0/1を手エンコードする。なお、自分の勘違いにより、0・1化は仕様に対して入れ替わっています(古典的な表現でテレコになっているというやつ)。
4bit単位で分割すると以下となる
ON送信: | header (16) | parity(4)| padd(4) | D0(8) | D1(8) 1100 1011 1011 0101 | 0110 | 1111 | 0101 0011 | 1100 ???? | (仕様誤解版) 0011 0100 0100 1010 | 1001 | 0000 | 1010 1100 | 0011 ???? | (仕様通り版)
他の方が書いている記事の信号が出ている所まで確認。
オシロの性能によるのか、送信される信号に対して到底全部は取り切れないので、赤外線受信モジュールの出力をマイコンのGPIOで読み取って、ソフトにより0/1エンコードさせてみる。適当なエンコードソフトを作っても同期ずれとかおきそうなので、ソフトでやるのは0/1の変換まででとどめて置き、最後のHEX化は手でやる。
赤外線リモコン受信モジュールの出力をESP32の23番Pinに接続、以下のようなへなちょこMicroPythonを作成、T=425usに対して、おおよそ2倍のサンプリング周波数で波形を取得
from machine import Pin import time p0 = Pin(23, Pin.IN) value = 0 prev_value = value def wait_sync(): while True: value = p0.value() if value == 1: pass else: print(value) return time.sleep_us(100) # wait 100us while True: print("wait sync") wait_sync() print("\n") for i in range(10 * 8 * 3): value = p0.value() if value == 1: print(0,end="") else: print(1,end="") time.sleep_us(200) # wait 200us print("end of data") print("drop..") for i in range(200): value = p0.value() if value == 1: print(0,end="") else: print(1,end="") time.sleep_us(200) # wait 200us print("done")
同期を無視してだいたい2倍サンプリングなので、Hも11で2回取っている(場合によっては一回)
1111110110110110000110000010011000011011011011000001001001000001101100001101100000100100110000110110110110110000010011000011011000011000001001001001101100001100001100000100000110110110000000
送信データの0は1100、送信データの1は、11000000になるので、よーく見たら、0/1が分かる(はず)
1101101100001100000 0011 # CustomerCode(0) 0x34 100110000110110 0100 # CustomerCode(1) 1101100000100100 0100 # CustomerCode(1) 0x4A 100000110110000110 1010 # CustomerCode(1) 1100000100100110000 1001 # Parity 0x9 (4bit) 110110110110 0000 # Padding 0x0 (4bit) 1100000100110000110 1010 # D0: 0xAC (command) 1100001100000100100 1100 100110110000110000 0011 # D1: 0x3C (parity) 1100000100000110110 1100 110000000 1000 # Trailer
OFF操作の時は以下となった
110110110000110000 0011 # CustomerCode(0) 0x34 1100100000100110 0100 # CustomerCode(0) 110110000110110 0100 # CustomerCode(1) 0x4A 1100000100110000110 1010 # CustomerCode(1) 1100001101101100000 1001 # Parity 0x9 (4bit) 100110110110 0000 # Padding 0x0 (4bit) 1100001100000100000100 1110 # D0: 0xEC (command) 110000110000110110 1100 1100100000100000110000 0111 # D1: 0x7C (parity) 1100001100000100100 1100 11000000000000000000 1000 # Trailer
■結論
送信されているデータ(パリティ除く)は以下の通り
- 家製協(AEHA)フォーマット
- CustomerCode: 0x344A (Panasonic) (parity:9)
- 点灯コマンド: 0xAC (prity:0x3C)
- サブモード:5(0b101)、ch:1(0b01)、モード:4(0b100)
- 消灯コマンド: 0xEC (prity: 0x7C)
- サブモード:7(0b111)、ch:1(0b01)、モード:4(0b100)
なお、chのフィールド(2bit)は0b01なのだが、スイッチのCHANNELは2になっている。だから、MSBが逆なのかもしれない。詳細不明
■関連URL
azure-data-tables · PyPI
M5Stackで赤外線リモコンを作る(送受信) - Qiita
ボクにもわかる地上デジタル - 地デジ方式編 - 赤外線リモコン方式と解析・回路図
赤外線リモコンの通信フォーマット
プログラミングな日々: パナソニックの照明を制御する
https://okamerin.com/nc/title/593.htm
AVRマイコンでTVリモコンを作成する | うしこlog
格安スマートリモコンの作り方 - Qiita
Arduinoで家にある赤外線リモコン全部解析 - Qiita
Infrared remote controller micropython - Google 検索
https://yuuyuublog.org/ai_cosplay/
https://prompthero.com/prompt/989136a13d5
https://prompthero.com/fune398
Overview | Seeed Studio Wiki
IRLib2/IRLib2 at master · cyborg5/IRLib2 · GitHub
GitHub - Seeed-Studio/Seeed_Arduino_IR: Library for receiving, decoding, and sending infrared signals using Arduino