chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

WioTerminalの赤外線リモコン機能を使いたいので、照明用リモコンの送信データを解析

やりたいこと: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