赤外線リモコンデータの変換
こちらで紹介されている格安スマートリモコンを作ってみた。半田付けに手こずったが、久々の電子工作はとても楽しかった。
肝心の使い勝手だが、なぜか照明はダメだったが、テレビやエアコンはうまく学習、制御することができた。
この学習がなかなか面倒。コンソールから学習のコマンドを実行後、格安スマートリモコンに向けて、学習したいリモコンの登録したいボタンをプッシュ、という作業を行うわけだが、例えばテレビのリモコンを登録しようとすると、ボタンの数だけ、何十回もこの作業を繰り返すことになる。
どうにか一括して登録作業を行うことができないものかと、ネットを検索していると、以下のビットトレードワンのサイトで、自社の学習リモコンADRSIR向けとして、22社、265の機器のリモコンのコードが記されたCSVファイルが公開されているのを見つけた。
ラッキー!これを登録すればいいじゃん!と喜んだのもつかの間、CSVファイルの内容は見たことがないものだった。
同じ東芝のテレビのリモコンのコードで、両者を比較してみる。
格安スマートリモコンで用いているpigpioのサイトで公開されている、リモコンコードの学習・再生プログラムirrp.pyで保存されるのは以下のようなもの。
"tv:on": [8950, 4440, 585, 529, 585, 529, 585, 529, 585, 529, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 1636, 585, 529, 705, 1636, 585, 1636, 585, 1636, 585, 39828, 8950, 2210, 585, 95511, 8950, 2210, 585],
これに対して、ビットトレードワンで公開されているCSVファイルの内容は以下のようなもの。
"東芝","デジタルテレビ1","電源","5601A900180015001800140018001400190013001900140019001400170040001700150018003F0019003E0018003E0019003F0019003E00170040001800140019003E001800150018003F00180014001800140019003F0018001400170016001700150018003F001800140018003F0018003F001800140019003F0018003F0018003E0019004F03"
なにこれ!全然違う!
上記CSVファイルと同じビットトレードワンのサイトで公開されている、ADRSIR用のソフトウェアをいじくっていて、どうやら両者は以下のようなものであることに気づいた。
- irrp.pyは、ONとOFFの期間の時間(μs)
- 「"tv:on": [8950, 4440, 585, 529,...」の場合、最初の「8950」は「ONが8950μS(約9ms)」、次の「4440」は「OFFが4440μS(約4.4ms)」という意味。これは、東芝のテレビが用いている赤外線リモコンのフォーマットであるNEC方式のリーダーコード、ONが9ms、OFFが4.5msにほぼ合致する。
- CSVファイルは、ONとOFFの期間のパルスの数
- 「5601 A900 1800 1500 ...」の場合、最初の「5601」は「0156h」、十進数で「342」で「ONが342」、次の「A900」は「00A9h」、十進数で「169」で「OFFが169」という意味。多くのリモコンの赤外線信号は38kHzで変調されているため、1つのパルスの時間は1/38000=0.000026315秒、約26μsになる。これに最初の値「342」をかけると、342x26=8892、となり、これは、irrp.pyの例の最初の値「8950」とほぼ同じになる。同様に、次の値「169」に26をかけると、169x26=4394、となり、これもirrp.pyの例の二番目の値「4440」とほぼ同じ。
そこで、ビットワントレードのADRSIR用ソフトを元に、CSVファイルのデータ(パルス数)を、irrp.py用のデータ(時間)に変換するプログラムを作ってみた。と言っても、バイトオーダーを変えて、26をかけているだけ。
#!/usr/bin/python3 #coding: utf-8 #convIrData.py import sys import json def conv_command(command, block): str_tmp = "" int_tmp = [] for i in range(int(len(block)/2)): str_tmp = block[i*2] + block[i*2+1] int_tmp.append( int(str_tmp, 16)) list = [] ir_data = {} data_numH = 0; data_numL = 0; for i in range(int(len(int_tmp)/4)): data_numH = (int_tmp[i*4+1] * 256 + int_tmp[i*4+0]) * 26 data_numL = (int_tmp[i*4+3] * 256 + int_tmp[i*4+2]) * 26 list.append(data_numH) list.append(data_numL) ir_data[command] = list return ir_data while True: argvc = sys.argv argc = len(argvc) if (argc == 2): filename = sys.argv[1] f = open(filename, 'r', encoding='utf-8') ir_data = {} for line in f: [command, block] = line.replace("\"","").split(",") ir_data.update(conv_command(command, block)) print(json.dumps(ir_data,sort_keys=True).replace("],","],\n")) break if (argc == 3): command = sys.argv[1] block = sys.argv[2] ir_data = conv_command(command, block) print(json.dumps(ir_data)) break print("Usage:") print(" python3 convIrData.py filename") print(" python3 convIrData.py command \"5B0018002E001800...\"") break
使い方は「./convIrData.py filename」とファイル名を与える。ファイルの中身は以下のようにする。
"tv:on","5B0018002E001800..." "tv:off","5C0017002F001700..."
もしくは「./convIrData.py tv:on 5B0018002E001800...」という風に、コマンド名とCSVファイル記載のバイト列を与える。
変換後のデータで、テレビやエアコンの制御ができることを確認した。
東芝のテレビのデータの一括登録に成功し、格安スマートリモコンが快適に使えるようになった。
エアコンについては、残念ながらCSVファイルに使い勝手のいいコマンドがないため、登録していない。