スマートリモコンで取得した赤外線信号を分析
この記事は2022/04/04に作成されました。

Designed by Freepik - Freepik.com / Freepik
スマートリモコンで赤外線信号を取得できるようなので、取得してみたところ…
8966,4543,
537,584,515,1726,550,570,553,570,
521,608,515,606,515,610,513,1729,
515,1727,515,610,515,1727,515,1732,
512,608,516,1726,548,1693,521,606,……
このような謎な数字の羅列が返ってきました。
調査してみると、どうやら赤外線の点灯時間と消灯時間を交互に羅列しているようです。(マイクロ秒)
これはいったい何なんでしょう?
赤外線信号について
まず、赤外線リモコンはどのように通信を行っているのか?
赤外線の点滅を認識して電化製品に伝えられます。
その点滅を認識して製品をONにするのかOFFにするのか判定しているようです。
こちらによるとPPM信号という点滅の仕方のようです。
参考:http://www.256byte.com/remocon.htm
引用すると、
❞------------------------------
点灯・消灯の1セットで1ビットを表し、点灯時間・消灯時間の長さの組み合わせによって0か1を判定する方式をPPM方式
❞------------------------------
そんな信号はないと思いますが、
点灯1秒、消灯2秒の時に0
点灯1秒、消灯4秒の時に1
と判定されると考えてみます。
※点灯消灯時間の組み合わせを()内に記述しています
(点灯1秒,消灯2秒)を(1,2)と表し、
(1,2)(1,2)(1,4)(1,2) → 0010
と表現することができます。
次に通信のフォーマットについてです。
参考:http://elm-chan.org/docs/ir_format.html
こちらによると、日本ではおよそ3種類のフォーマット。
NEC・家製協・SONYが使われているようです。
なので、まずは信号のフォーマットが何かを判定していく必要がありそうです。
では、冒頭のスマートリモコンで取得した信号を解析していきます。
解析をしてみる
参考:http://elm-chan.org/docs/ir_format.html
参考:http://www.asahi-net.or.jp/~gt3n-tnk/IR_TX1.html
こちらのフォーマットを参考にさせていただきます。
信号内容
8966,4543,//リーダー
537,584,515,1726,550,570,553,570,
521,608,515,606,515,610,513,1729,
515,1727,515,610,515,1727,515,1732,
512,608,516,1726,548,1693,521,606,
517,608,513,1729,515,610,513,1729,
513,1729,515,1727,517,609,512,1729,
515,1727,517,608,513,1729,515,610,
513,608,514,612,511,1730,515,610,
513,41162,//ストップ
※赤外線はマイクロ秒単位の短い時間の振動で判定されることや、受信時の環境によってまったく同じ信号が送られてくることはないので注意です。
信号のフォーマットを判定するには、リーダーと呼ばれる信号の開始を示すON,OFFのパターンを見れば良い様です。
今回の信号のリーダーは
8966,4543
どうやら振れ幅はありますが、
各フォーマットで定義されているリーダーのON(今回の場合は8966)は
SONY(2400μs)
家製協(2800~4000μs)
NEC(9000μs)
なので、恐らくNECフォーマットであると分かります。
NECフォーマットですでに定義されている値を記述しておきます。
単位時間
T=562μs
リーダー
16T,8T
(16×562=8992),(8×562=4496)
次にメーカーと機器を識別するカスタマーコードが来ます。
先ほど解説したPPM方式の
16bitが送信されます。
537,584,515,1726,550,570,553,570,
521,608,515,606,515,610,513,1729,
515,1727,515,610,515,1727,515,1732,
512,608,516,1726,548,1693,521,606,
NECフォーマットは0と1を
0:(1T,1T)
1:(1T,3T)
の点灯時間、消灯時間で定義されています。
なので
537,584,515,1726,550,570,553,570,521,608,515,606,515,610,513,1729,
515,1727,515,610,515,1727,515,1732,512,608,516,1726,548,1693,521,606,
↓2進数に変換
0100000110110110
このように表現されます。
次にデータコードと呼ばれるどんなアクションをさせるのか判定するコードが送られます。
PPM方式の8bit+反転8bitのデータがきます。
ここでいう反転とは、0と1の値が反転されるということです。
受信側で反転されたデータを反転、データコードと比較して同じ値であることを確認してから受け取るようです。
//データコード
517,608,513,1729,515,610,513,1729,513,1729,515,1727,517,609,512,1729
↓2進数に変換
01011101
//データコードの反転
515,1727,517,608,513,1729,515,610,513,608,514,612,511,1730,515,610
↓2進数に変換
10100010
最後にストップコードと呼ばれる受信終了を判定するコードが送られます。
513,41162
16進数のデータを変換する
ここまでを理解できたら16進数で表されたデータをスマートリモコンで送れる信号に変換することが可能です。
参考:http://www.256byte.com/remocon/iremo_db.php?mode=view&id=286
例としてこちらのNEC照明を全光にさせる16進数のデータを変換します。
❞------------------------------
ヘッダー:(9000,45000)
※サイト内ではヘッダーとあるが、リーダーのこと
データ:0x41B6F807(32bit)
0:(550,550)
1:(550,1700)
ストップ:(600,40000)
❞------------------------------
データを2進数に変換
0x41B6F807(32bit) → 01000001101101101111100000000111
カスタマーコードを2進数に変換
01000001 → 550,550,550,1700,550,550,550,550550,550,550,550,550,550,550,1700
10110110 → 550,1700,550,550,550,1700,550,1700550,550,550,1700,550,1700,550,550
データコードを2進数に変換
11111000 → 550,1700,550,1700,550,1700,550,1700,550,1700,550,550,550,550,550,550
00000111 → 550,550,550,550,550,550,550,550,550,550,550,1700,550,1700,550,1700
このデータをリーダーとストップで囲んであげればスマートリモコンで送れる信号の完成です。
完成形(NEC照明の全光)
9000,45000
550,550,550,1700,550,550,550,550550,550,550,550,550,550,550,1700
550,1700,550,550,550,1700,550,1700550,550,550,1700,550,1700,550,550
550,1700,550,1700,550,1700,550,1700,550,1700,550,550,550,550,550,550
550,550,550,550,550,550,550,550,550,550,550,1700,550,1700,550,1700
600,40000
まとめ
いままで何気なく使っていた赤外線リモコンですが、このような技術を使っていたのですね。
Web以外の知識も新鮮でした。
フォーマットを判定するときの値は振れ幅があるので、しきい値の調整が課題かもしれません。
以上になります。
ありがとうございました。
プログラマー/K.D