chakokuのブログ(rev4)

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

WioTerminalのIRエミッタからリモコン相当の信号を送出してみる

Wio TerminalはIRリモコンとして使えるように、IR送信デバイスがあるので、それを使ってリモコン相当の信号を送ってみる。
ArduinoのIRコントローラ用ライブラリがあるのだが、Panasonic用ライブラリはOLDと書かれていて、どうもAV機器用に作られているようである。確実に動かすため、RAWモードで、波形の0/1を直接指定する方法で送信してみる。
波形の0/1は配列にして、H/Lのそれぞれの時間をusecで指定するようである。そこで、前回解析したデータをフォーマットに整えて、H/Lのタイミングに変換する
冒頭の3400,1700はLeader部と呼ばれる同期化用のヘッダと思われ、425から続く部分がH/Lのタイミングとなる。仕様より、TはTypical 425usecらしいので、それに合わせてタイミングを指定する
送信したいデータ LはLeader, T はTrailer
344Aはメーカコード、90はParityとパディング、ACがch2を使った点灯コマンド、3Cはパリティ、Tは終了を表すTrailer

"L 34 4A 90 AC 3C T" 

これをH/Lの波形とするために、usecでどれぐらいの時間H/Lを出すのかを指定する形式に変換(変換ソフトは後半に記載)

# [3400, 1700, 425, 425, 425, 425, 425, 1275, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 1275, 425, 1275, 425, 1275, 425, 425, 425, 425, 425, 8000]

消灯コマンドは以下 ("L 34 4A 90 EC 7C T" )

[3400, 1700, 425, 425, 425, 425, 425, 1275, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 1275, 425, 1275, 425, 425, 425, 1275, 425, 1275, 425, 425, 425, 425, 425, 425, 425, 1275, 425, 1275, 425, 1275, 425, 1275, 425, 1275, 425, 425, 425, 425, 425, 8000]
#!/usr/bin/python3
#
#
# Wave Pattern Generator for IR Controller
#
#

DULATION_T = 425  # T = 425us

WAVE_LEADER = [DULATION_T * 8,  DULATION_T * 4]
WAVE_TRAILER = [DULATION_T ,  8000]
WAVE_ONE = [DULATION_T, DULATION_T * 3]
WAVE_ZERO = [DULATION_T, DULATION_T]

# IR command for turn on Room Light 
CMD_CTRL_ON = "L 34 4A 90 AC 3C T"      #L:Leader , T:Trailer



# notation of wave
# T.... H     425us
# t.... L     425us

def int2wave(nibble):
    wave_timing = []
    for _ in range(4):
        mask = 0b1000
        if nibble & mask:
            wave_timing.extend(WAVE_ONE)
        else:
            wave_timing.extend(WAVE_ZERO)
        nibble <<= 1
    return wave_timing


def encoder(cmd):
   wave_timing = []
   for chr in cmd:
       if chr == ' ':   # space
          pass
       elif chr == 'L':   # Leader
          wave_timing.extend(WAVE_LEADER)
       elif chr == 'T':  # Trailer
          wave_timing.extend(WAVE_TRAILER)
       else:
          #print(f"chr: {chr}")
          nibble = int(chr,16)
          print(f"nibble: {nibble}")
          wave_timing.extend(int2wave(nibble))
   return wave_timing


value = encoder(CMD_CTRL_ON)

print(value)
#value = wave2wait(value)
#print(value)