BACK:[[VIR-USB 接続赤外線学習リモコン]] VIR: USB 接続赤外線学習リモコンユニットが入出力する赤外線信号のテキストフォーマットについての解説です *VIR: 赤外線学習リモコンユニットと V-IR コマンドの動作 [#a39f3bca] -学習 --VIR を USB 端子に接続し、"V-IR R" コマンドを実行すると学習モードに入ります。この状態で赤外線受信モジュールに向けて赤外線リモコンの信号を送信すると、信号の内容が標準出力に表示されます。 -送信 --出力された文字列をそのまま "V-IR S" コマンドの標準入力に与えると、全く同じ信号が送信できます ※ COLOR(RED){UNIX では root 権限が必要です}。 *デコード用 Perl スクリプト [#c2bd3231] 標準出力に出力される赤外線信号は、AVR マイコンの RAM を節約するために、1~2バイトの可変長の数値フォーマットで表現され、また圧縮されています。 圧縮された赤外線信号をデコードして通常の表現に戻すために、次の perl スクリプトを用意してあります。 ※ "V-IR -r R" のように -r オプションを付けて学習すれば、最初からデコード済みの無圧縮、2バイト固定長(以下の図3の (2) の形式の 2 バイト固定長)の赤外線信号データが標準出力に得られます。ただしその場合、エアコンのリモコンなどの長い信号は AVR の RAM に入りきらずに学習できないことがあります。 **decode.pl [#i40be636] -実行例 % decode.pl <irdata.txt >irdata.csv (実行結果) Remote controller IR DATA Decoder for VIR Header Text: # Command: 01H Frequency: D9, 217(38.02 kHz), 13.2 us (*):2byte value(>127), (-):repeated value(run-length compressed) 1,265,3498,us,(*) 0,130,1716,us,(*) 1,33,435.6,us 0,34,448.8,us 1,30,396,us 0,99,1306.8,us 1,33,435.6,us 0,34,448.8,us 1,30,396,us 0,32,422.4,us (中略) Original=198(byte), Compressed=44(byte), 22.2% -V-IR コマンドが出力したテキストデータをこのスクリプトに入力します -ヘッダ、コマンド、キャリア周波数を表示します -赤外線の ON/OFF 時間を次のフォーマットで1行ずつ表示します 赤外線のON/OFF(1がON,0がOFF),時間のデコード結果,時間,単位(μs), -圧縮率(デコード後のサイズとデコード前のサイズの比)を表示します **graph.pl [#r0c07012] -実行例 % graph.pl <irdata.txt >irgraph.csv (実行結果) us, data.txt 0.00,0 0.00,1 3485.15,1 3485.15,0 5194.85,0 5194.85,1 5628.85,1 5628.85,0 6076.00,0 6076.00,1 6470.55,1 6470.55,0 7772.55,0 7772.55,1 8206.55,1 (後略) &ref(graph1.png,zoom,400x300); LEFT:''Excel の散布図でグラフ化した例'' -V-IR コマンドが出力したテキストデータをこのスクリプトに入力します -赤外線の ON/OFF を Excel,GnuPlot 等の散布図作成機能でグラフ化しやすい形式で出力します *赤外線信号のテキストフォーマットの解説 [#p177510f] ''図1'' は VIR で Panasonic TV リモコンの「入力切替」ボタンの信号を学習したときの出力例です。 #ref(irdata1.png,zoom,600x200) LEFT:''図1: R コマンドによる赤外線データの取得結果(Panasonic TV リモコン「入力切替」ボタンの例)'' #br -① 開始マーク:文字 "#" がデータの開始を示します。"#" と次の "," の間には任意の文字列を追加できます。 -② コマンド:常に VIR に赤外線信号の送信を指示する "01" が入ります。 -③ キャリア周波数:デフォルトは D9H で、学習時に V-IR にコマンドラインオプションを指定することで手動で変更できます。AVR マイコンのクロック 16.5MHz を D9H で分周し、さらに 1/2 倍すると、キャリア周波数 38.02kHz が求められます。 -④ 赤外線信号本体:赤外線信号が ON の時間, OFF の時間, ON の時間... の順に記録されます。ただしこの値は次に説明するように 1~2バイトの可変長で表現され、またランレングス圧縮されています。 *テキストフォーマットの詳細(可変長表現とランレングス圧縮) [#o2d1cf58] ''図1''の「④赤外線信号本体」部分は1バイトまたは2バイトの可変長で表現されています。''図2''は''図1''の「④赤外線信号本体」の先頭部分のデコード結果です。(A) が''図1'' の生データで、(B) はこれを図3に従ってデコードした結果です。(C) が (B) に単位時間を乗じて求めた実際の時間です。 単位時間はキャリア周波数によって変わります。キャリア周波数を2倍して逆数を取ると単位時間が求められます。この例では単位時間は 13.2μs です。 #ref(irdata3.png,zoom,600x200) LEFT:''図2: 図1の ④赤外線信号本体 の先頭部分'' #BR #ref(irdata2.png,zoom,600x200) LEFT:''図3: デコードの方法'' #BR **可変長表現 [#i455874e] -127以下の値は 図3の(1) のように 1バイトで表現されます。図の A(7bit) が値の2進数表現です。 -128~16383 の値は 図3の(2)のように 2バイトで表現されます。図の B(14bit) が値の2進数表現です。14bit の正整数のため 16383 を超える値は表現できません。 **変形ランレングス圧縮 [#h6f1feeb] -図3の(3)のように 先頭の2ビットが 1 の値が出現した場合は、ランレングス圧縮されていますので、直前の値を C(1~63)回繰り返します。ただし、赤外線信号の特徴を利用するため「直前の値」は奇数個目と偶数個目の値で分けて考える、特殊なランレングス圧縮を用います。 -(変形ランレングス圧縮の例) 11,22,10,20,COLOR(RED){C5} の場合、COLOR(RED){C5} がランレングス圧縮されている部分です。COLOR(RED){C5} から見ると 10 が偶数番目(先頭を0番目とする)、20が奇数番目の直前の値です。繰返し回数は5回です。よって、このデータを展開すると 11,22,10,20,10,20,10,20,10 となります。 -④の赤外線信号本体の先頭16バイトに限って、圧縮できる場合でも圧縮しません。 #counter