VIR: USB 接続赤外線学習リモコンユニットが入出力する赤外線信号のテキストフォーマットについての解説です *VIR: 赤外線学習リモコンの使い方 [#a39f3bca] VIR を USB 端子に接続し、"V-IR R" コマンドを実行すると学習モードに入ります。この状態で赤外線受信モジュールに向けて赤外線リモコンの信号を送信すると、信号の内容が標準出力に表示されます。この文字列をそのまま "V-IR S" コマンドの標準入力に与えると、全く同じ信号が送信できます(COLOR(RED){要 root 権限})。 *デコード用 Perl スクリプト [#c2bd3231] 赤外線信号は AVR マイコンのメモリを節約するために、可変長の数値フォーマットで表現され、また圧縮されています。これをデコードして通常の表現に戻すために、次の perl スクリプトを用意してあります。 **decode.pl [#i40be636] % decode.pl <irdata.txt >irdata.csv -VIR の出力したテキストデータをデコードして CSV 形式で出力します -ヘッダ、コマンド、キャリア周波数を表示します -赤外線の ON/OFF 時間を μs 単位で表示します -圧縮率(元のデータサイズとデコード後のサイズの比)を表示します **graph.pl [#r0c07012] % graph.pl <irdata.txt >irgraph.csv -赤外線の 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 の時間... の順に記録されます。ただし時間は次に説明するように可変長で表現され、ランレングス圧縮されています。 *赤外線信号本体のデコード(可変長表現と圧縮) [#o2d1cf58] 赤外線信号は AVR マイコンの RAM に納まるサイズにするために、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 -デコードの方法 --127以下の値は 図3の(1) のように 1バイトで表現されています。図の A(7bit) が値を示します。 --128~16383 の値は 図3の(2)のように 2バイトで表現されています。図の B(14bit) が値を示します。16383 を超える値は表現できません。 *ランレングス圧縮 [#h6f1feeb] 図3の(3)のように 先頭が 11 で始まる値が出現した場合は、ランレングス圧縮されていますので、直前の値を C(6bit,1~63)回繰り返します。ただし、赤外線信号の特徴を利用するため「直前の値」は奇数個目と偶数個目の値で分けて考える、特殊なランレングス圧縮を用います。 -(ランレングス圧縮の例) 11,22,10,20,C3(=11000011B=3) の場合 10 が偶数番目、20が奇数番目の直前の値です。これを展開すると 11,22,10,20,10,20,10,20,10,20 となります。