この記事の赤外線パターン解説編?
変換用Webページ出来ました
多分使えます。
https://nec-ir-pattern-hex.netlify.app/
ソースコード(Kotlin/JS製Webアプリ
):https://github.com/takusan23/IRPatternHex
赤外線のパターンを16進数に変換する
スタートはこれ
そしてゴールはこれです。
0x41b67d82
調べていると赤外線のパターンではなく、データは 0x~ です!
みたいなのを見かけたので調査。
合っているかは知りません。
参考にしました:
http://shrkn65.nobody.jp/remocon/nec.html
http://elm-chan.org/docs/ir_format.html
https://qiita.com/katsumin/items/517cd9fbe66e26d72fa7
https://god-support.blogspot.com/2020/08/nec.html
やってること
- 赤外線パターンからどこのフォーマットを使っているかを調べる。
- フォーマットの仕様に沿って、データ部(後述)を0と1に変換
- 最後に16進数に変換
いくつかあるフォーマット(NEC / 家製協(AEHA) / SONY)の中から今回はNECフォーマットの解説を。
そもそも赤外線パターンの数値何?
赤外線LEDを8.925ミリ秒
ONにして、4.540ミリ秒
OFFにして、5.14ミリ秒
ONにする...って意味です。
この先出る T(変調単位) について
NECフォーマット
の場合はおおよそ562
が使われています。リモコンによってばらつきがあると思う。
ので、Tの1倍
って書いてあった場合は、T*1 = 562
、Tの3倍
って書いてあった場合はT*3 = 1686
ってことです
赤外線パターンの構造
+---------------------------------------------------------------------------------------------------
| リーダー部 2bit | データ部 32bit | トレーラー部 1bit |
+---------------------------------------------------------------------------------------------------
上記のアスキーアートのようになってます。良くわからんと思いますのでもう少し解説続けます。
リーダー部
最初のON、OFFのデータがリーダー部となっております。
NECフォーマットの場合おおよそ、ONは9ミリ秒(Tの16倍)
、OFFは4.5ミリ秒(Tの9倍)
に近い値になるみたいです。
実際のデータ(省略版)を見てもNECフォーマットっぽいです。(NECのシーリングライトなのでそれはそう)
データ部
3番目からデータになっています。ここで見てほしいのは右と左のペア(下のコードでは隣同士に整形しておいた)です。
実際のデータを見るとなんか近い値と明らかに2、3倍になってる数値が見えてくると思います。
NECフォーマットの仕様では、
ONが Tの1倍 -> Tの1倍
の順番になってて、データは0
OFFが Tの1倍 -> Tの3倍
の順番になっていて、データは1
になっているみたいです。?
実際のデータにコメントとして書き足すと
って感じになっています。514
->626
で正確に1倍にはなっていないのですが多分データ0で合ってます。
この0
と1
がNECフォーマットでは32個続きます(32bit
)
32bitのデータの中身
16bit
で区切ります。
区切って、前の16bit
がカスタマーコード、後ろの16bit
がデータです。
0100000110110110 0110010110011010
後ろの16bit
は、さらに8bit
に分けることが出来ます。
01100101 10011010
前の8bit
がデータ、後ろの8bit
は前の8bit
の反転になっていて、正しいデータか検証出来るようにしているそうです。(0なら1、1なら0)
トレーラー部
よくわからん。取得したデータの最後のTの1倍
の値がそうだと思う。
データ部を2進数に変換する
取得したデータの中から、まずリーダー部(最初の2個)とトレーラー部(最後の1個)を消します。
解説用に短くしています。
こんな感じ?
次に、[1,2]
、[3,4]
...のようにまとめていきます
その後、まとめた数値を比較して、最初の値を2倍してももう一方が大きい場合は1
、そうでない場合は0
を入れていきます
仕様ではTの3倍
です。がばらつきがあるのでしゃーない。
こんな風に
そしたらくっつけて完成です。お好みで16進数に変換してもいいと思う。
16進数(2進数)を赤外線パターンに変換する
この場合は、16進数(もしくは2進数)の赤外線のデータがどこのフォーマットのものなのかがわかっている必要があります。
16進数のデータにはリーダー部が含まれていないため分かりません。
今回はNECフォーマット
だとして、T
は562
という設定で行きます。
まず、配列を用意して、リーダー部を追加しておきます。
そしたら、16進数の場合は2進数に戻します。
戻したら、データ1
が[Tの1倍
,Tの3倍
]、0
が[Tの1倍
,Tの1倍
]であることがNECフォーマットの仕様に書いてあるので、そのとおり作ります。
最後にストップビットとして配列の最後にTの1倍
を入れれば終わり。
以下変換用のコード。Kotlin版
出力例です。
長くなるのでGitHubに置いておきますが、データ部とかも見れる完全版も置いておきます。
https://github.com/takusan23/IrPatternToBin