Nature Remo - リモコンの信号解析方法

Nature remoで取得したリモコンの赤外線信号を解析して
行きたいと思います。 

m-yasumura.hatenablog.com

f:id:m_yasumura:20200911004247j:plain

目次

 

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. 今後

 自宅で使用中の各リモコンについて分析進め、
 一覧表を作成したいと思います。