VIR: USB 接続赤外線学習リモコンに関する技術の解説です。

**赤外線信号の送受信 [#q0efb0a5]
***VIR: 赤外線学習リモコンの基本的な使い方 [#a39f3bca]
VIR を USB 端子に接続し、"V-IR R" コマンドを実行すると学習モードに入ります。この状態で赤外線受信モジュールに向けて赤外線リモコンの信号を送信すると、信号の内容が標準出力に表示されます。この文字列をそのまま "V-IR S" コマンドの標準入力に与えると、全く同じ信号が送信できます(COLOR(RED){要 root 権限})。

***赤外線データのフォーマット [#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 の時間... の順に記録されます。ただし時間は次に説明するように可変長で表現され、ランレングス圧縮されています。

***デコード用 Perl スクリプト [#c2bd3231]
Decode.pl
Graph.pl

***赤外線信号本体のデコード(可変長表現と圧縮) [#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 となります。


**回路 [#q6ba721f]
***DigiSpark [#o87c95d2]
DigiSpark は AVR マイコン ATTiny85 を搭載した、USB 通信が可能な小型の Arduino 互換ボードです。専用の USB コントローラ IC は積んでいませんが、ソフトウェアによる USB 通信ライブラリ V-USB によって、PC から USB 経由でファームウェアを書き込むことができます。このキットは、DigiSpark に赤外線送受信回路を追加してファームウェアを書き込むことで、USB で制御する赤外線リモコンを実現しています。

***オリジナル赤外線送受信シールド [#zf625cfc]
Arduino に外部回路を追加するための拡張基板をシールドと呼びます。本家からも赤外線送受信用の [[Infrared Shield:https://digistump.com/wiki/digispark/tutorials/ir]] が発売されていますが、本家版の回路では赤外線 LED を ATTiny85 の出力ピンで直接駆動しているため、赤外線信号が遠くまで届きません。そこで、ATTiny85 の出力でトランジスタを駆動し、赤外線 LED を大電流で光らせる、赤外線送受信シールドを独自に開発しました。シールドのピン配列は本家版と互換になっていますので、そのまま差し替えて使うこともできます。基板上のジャンパパターンも本家版と互換で、組み立ての際は J1 と J4 をショートさせる必要があります。

本家版 Infrared Shield にはありませんが、手動での操作ができるように、シールド基板上にスイッチを1つ追加しました。ただ ATTiny85 の I/O ピンは PB0~PB5 の6ピンしかありませんが、PB3,PB4 は USB 用に占有されていて、PB1 には元々赤色 LED と電流制限抵抗(R5, 回路図には値がないですが、実測 700Ω 程度) が接続されていて、ピンに空きがありません。そこで表示用の赤色 LED が接続されている PB1 に、LED と並列にスイッチを入れて、PB1 を入出力共用にしています。PB1 は通常は出力ピンですが、時分割で短時間入力ピンとしても利用しています。スイッチを ON にしたときに出力がぶつかってショートしないように、スイッチには直列に200Ωの抵抗を入れています。スイッチを ON にすると、この200Ωの抵抗を通して赤色 LED が薄く点灯してしまいますが、ピンを入出力共用にしている都合上やむを得ません。

なお、本来の Digispark では PB5 が入出力ピンとして利用できますが、クローン品では PB5 がリセットのままになっているケースがあるため、どちらのボードでも使用できるように、今回は PB5 は使用していません。

今回の AVR のピンの用途は下記の表の通りです。
|Tiny85ピン番号|I/O|用途|
|1|PB5|リセット|
|2|PB3|USB-|
|3|PB4|USB+|
|4|GND|GND|
|5|PB0|赤外線LED|
|6|PB1|赤色LED/スイッチ|
|7|PB2|赤外線受信モジュール|
|8|VCC|VCC(5V)|

***赤外線 LED と受光モジュール [#afdbcce8]
赤外線 LED は、できるだけ赤外線が広角に照射されるという観点で [[TSAL4400:https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwiwuuLqzJnQAhUIyLwKHdKbDQkQFggdMAA&url=http%3A%2F%2Fwww.vishay.com%2Fdoc%3F81006&usg=AFQjCNHr5zJUm2Yr5NVkUkB230ekpCx8kA]] を選択しました。データシートでは指向角が±25度となっており、受光部を正確に狙わなくても動作します。

赤外線受光モジュールは同じようなスペックの製品でもノイズへの強さ、動作電圧や電圧変動への強さ、受信した信号を正確に再現するかなど、かなりの特性の差があります。今回は信号の再現性を重視して、TSOP38238 を選択しました。

今回使用した赤外線 LED, 受光モジュールは海外製品で、入手性があまりよくないのが難点です。

**マイコン側ファームウェア [#sf812602]
**PC側制御プログラム [#m259ee97]
**Pukiwiki プラグイン [#yce45d4c]



**回路図[#s898a180]
図をクリックすると拡大表示されます。左が DigiSpark の回路図、右が赤外線送受信シールドの回路図です

&ref(回路図1.png,zoom,400x300);
&ref(回路図2.png,zoom,400x300);

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS