Nature remoで取得したリモコンの赤外線信号を解析して
行きたいと思います。
m-yasumura.hatenablog.com
目次
1. リモコン信号のフォーマットについて
以下のフォーマットが存在しています。
①NECフォーマット
②家電製品協会フォーマット
③SONYフォーマット
各信号は、「リーダーコード」「カスタムコード」、「データコード」で
構成されています。
詳細は他のHPで紹介されている内容がわかりやすいため、
内容の説明は割愛します。
「赤外線リモコン」「フォーマット」というキーワードで
検索してみて下さい。
2. リモコンの赤外線信号を解析 - 手動で解析
REGZAの電源ON・OFFボタンの信号データは以下でした。
この数値が何を示しているかを解析して行きます。
$ cat power.json
{"format":"us","freq":38,"data":[8926,4537,495,636,531,596,495,634,498,635,494,630,505,625,497,1733,496,634,493,1738,492,1740,496,1734,501,1730,499,1731,497,1737,496,634,501,1728,503,629,501,1728,494,633,505,624,497,1735,503,629,492,635,502,629,492,1736,495,633,496,1735,496,1735,503,630,499,1729,498,1733,498,1734,533,39754,8921,2314,495]}
①リーダーコード
先頭の「8926,4537」がリーダーコードです。
{"format":"us","freq":38,"data":[8926,4537,495,636,531,596,495,634,498,635,494,630,505,625,497,1733,496,634,493,1738,492,1740,496,1734,501,1730,499,1731,497,1737,496,634,501,1728,503,629,501,1728,494,633,505,624,497,1735,503,629,492,635,502,629,492,1736,495,633,496,1735,496,1735,503,630,499,1729,498,1733,498,1734,533,39754,8921,2314,495]}
しかしこれだけでは、NECフォーマット(16T,8T)なのか?
家電製品協会フォーマット(8T,4T)なのか? いずれであるか
判断できません。
そこで、まず1Tの値を見つけます。
カスタムコードやデータコードは、1Tか3Tで表現されます。
ということは、得られているデータを眺めると、1Tと3Tは
以下の数値であると予想できます。
1T:「495,636,531,596,495,634,498,635,・・・」
3T:「1733,1738,1740,1734,1730,1731,1737,・・・」
※3Tは1Tの3倍の数値、または1Tは3Tの1/3
「495,636,531,596,495,634,498,635,・・・」の平均値を
算出すると、1T ≒ 565だと分かります。
ということは、リーダーコードの「8926,4537」はそれぞれ、
8926 / 565 = 15.79・・・ ≒ 16 = 16T
4537 / 565 = 8.03・・・ ≒ 8 = 8T
以上より、リーダーコードは「16T, 8T」だということが分かり、
すなわち、NECフォーマットだと分かりました。
②カスタムコード、データコード
リーダーコードの後に続くデータがそれぞれのコードです。
カスタムコード:「495,636,・・・501,1728」
データコード :「503,629,・・・498,1734」
{"format":"us","freq":38,"data":[8926,4537,495,636,531,596,495,634,498,635,494,630,505,625,497,1733,496,634,493,1738,492,1740,496,1734,501,1730,499,1731,497,1737,496,634,501,1728,503,629,501,1728,494,633,505,624,497,1735,503,629,492,635,502,629,492,1736,495,633,496,1735,496,1735,503,630,499,1729,498,1733,498,1734,533,39754,8921,2314,495]}
上記の数値を1T、3Tに置き換えると以下のようになります。
1T,1T,1T,1T,1T,1T,1T,1T,1T,1T,1T,1T,1T,3T,1T,1T,1T,3T,1T,3T,1T,3T,1T,3T,1T,3T,1T,3T,1T,1T,1T,3T,1T,1T,1T,3T,1T,1T,1T,1T,1T,3T,1T,1T,1T,1T,1T,1T,1T,3T,1T,1T,1T,3T,1T,3T,1T,1T,1T,3T,1T,3T,1T,3T
更に、1Tと1Tの組合せを0、1Tと3Tの組合せを0に置き換えると
以下になります。
0,0,0,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,1
カンマを削除すると、「00000010111111010100100010110111」
すなわち、2進数に変換出来ました。
これを16進数へ変換すると、カスタムコードとデータコードは
以下であることが分かります。
02h FDh 48h B7h
3. リモコンの赤外線信号を解析 - プログラムで解析
前項2では、手動で1つ1つ解析をしました。
どのようにすれば良いかを理解することが出来たと思います。
リモコンのボタンを全て解析するため、以下の簡易的なプログラムで
解析する手順を以下に記します。
①Pythonで以下のプログラムを作成する。
$ cat decode.py
import sys
import json
obj_txt = sys.stdin.read()
obj = json.loads(obj_txt)
code = obj['data']
data = ""
t = int(((code[0]+code[1])/24)-90)
data = [ [ code[i], code[i+1] ] for i in range( 2, len(code)-1,2) ]
data = [ [ round(code[i]/t), round(code[i+1]/t) ] for i in range( 2, len(code)-1,2) ]
data = [ "1" if e == [1,3] else "0" for e in data ]
data = [ "".join(data[i:i+4]) for i in range(0,len(data)-3,4) ]
data = [ int(e,2) for e in data ]
data = [ format(e , 'x') for e in data ]
data = "".join(data)
print (data)
②前回取得した信号は、「power.json」に保存してあります。
$ cat power.json
{"format":"us","freq":38,"data":[8926,4537,495,636,531,596,495,634,498,635,494,630,505,625,497,1733,496,634,493,1738,492,1740,496,1734,501,1730,499,1731,497,1737,496,634,501,1728,503,629,501,1728,494,633,505,624,497,1735,503,629,492,635,502,629,492,1736,495,633,496,1735,496,1735,503,630,499,1729,498,1733,498,1734,533,39754,8921,2314,495]}
③ターミナルに以下のコマンドを入力し、プログラムを
実行します。
$ cat power.json | python decode.py
02fd48b700
前項2と同様、「02FD48B7」を求めることが出来ました。
4. 解析した信号情報をNature remoから発信してみる
前項3で解析した「02FD48B7」を、ターミナルから実行して
Nature remoから発信することで、機器を操作してみたいと
思います。
①Pythonで以下のプログラムを作成する。
$ cat encode.py
import sys
import json
byte_array = [int(x, 16) for x in sys.stdin.read().split(' ')]
data = [8926,4537]
for x in byte_array:
for i in range(8):
b = (x>>(7-i))&1
if b == 1:
data += [492, 1750]
else:
data += [492, 636]
data += [496]
obj = {
'format': 'us',
'freq': 37,
'data': data,
}
obj_txt = json.dumps(obj)
sys.stdout.write(obj_txt)
②MacをNature remoと同じネットワークに接続する。
③ターミナルに以下のコマンドを入力し、プログラムを
実行します。
環境に合わせ、IPアドレスを変更して下さい。
また、先ほど解析した16進数のデータを以下のように入力します。
$ echo "02 FD 48 B7" | python encode.py | curl -X POST 'http://192.168.3.200/messages' -H 'X-Requested-With: curl' -d @-
④③のコマンドを実行後、Nature remoが青く点滅すると
同時に赤外線信号が発信します。
テレビがON、又はOFFすれば成功です。
5. 今後
自宅で使用中の各リモコンについて分析進め、
一覧表を作成したいと思います。