LED回路工作部屋 > 赤外線リモコンの作り方 【掲載 : 2016/10/12】【更新 : 2019/12/12】
赤外線リモコンの作り方

 PICマイコンで赤外線リモコンの送信機とおよび受信機の作り方です。

■■■■■■ 赤外線リモコンの仕様  ■■■■■■

 下記は赤外線リモコンで使用する仕様です。他の仕様もありますが、ここでは割愛します。

 ・赤外線リモコンは自然界のノイズを避けるため 38KHz変調 をかけている。 ※赤外線LEDの発光を38KHzでオン・オフすることです
 ・ 38KHz変調 をかけないと赤外線リモコン受信モジュールの出力は反応しない。
 ・赤外線リモコンで使う信号は NECフォーマット を使用する。

■■■■■■ 38KHz変調 と 赤外線受信モジュール  ■■■■■■

 赤外線を使ったリモコンの受信部 (赤外線リモコン 受信モジュール) は、自然界の赤外線とリモコンの赤外線を区別するため 38KHz で変調(点滅) した赤外線しか受信しないような構造になっています。
 上記説明だけでは いまいち分かりにくいので下図 【図A1】 をもとに説明します。

 リモコンの受信部となる 赤外線リモコン 受信モジュール に DC5V の電源を接続すると OUTの出力は Highレベル ("1") になっています。
 この 赤外線リモコン 受信モジュール 38KHz で変調(点滅) した 赤外線LED を当てると、当ててる時間だけ 赤外線リモコン 受信モジュール の出力が Lowレベル ("0") になります。
 デジタル的に解説すると、 赤外線LED 【38KHz で変調(点滅)している時を "1" 】【消灯している時を "0(ゼロ)"】 とすと、 赤外線リモコン 受信モジュール との出力の関係は下記になります。
 赤外線LED = "1" → 受信モジュール = "0"
 赤外線LED = "0" → 受信モジュール = "1"
 このように 赤外線リモコン 受信モジュール 側では結果が反転します。




■■■■■■ 信号コードの説明  ■■■■■■

 赤外線リモコンは送信機から赤外線で 信号 を送り、受信機で受信した 信号 と一致する動作を行います。この 信号 とは何でしょうか?
 赤外線リモコンで使用している 信号 は主に NECフォーマット を使用しています。 【図B1】 が NECフォーマット の基本構造です。
この 信号 の 内容を変えることで、赤外線リモコンでいろいろな操作が行えます。
 その信号の構造が【図B1】です。信号(データ)の構造は リーダー部 と 4バイト(8ビットで1バイト) のデータでできています。
 4バイトのデータはそれぞれ [カスタムコード@] [カスタムコードA] [データコード] [データコード(反転)] といった内容です。
 リーダーコード や ビットの "1" "0" は、0.56ms を 1T として、 Highレベル ("1") Lowレベル ("0") の長さを変化させて識別しています。※下図参照



■■■■■■ PICで送信機を作る  ■■■■■■

 PIC16F688 を使った赤外線リモコンの送信機の例です。SW1しかないので1ch(チャンネル)送信になります。
 RC2 に赤外線LED、RA0 にSW1(タクトスイッチ)を接続しています。RA0 は PULL-UP にしています。
 SW1を押すと赤外線コードを送信します。

 では、送信機の回路は下の回路図になるので、PIC側のプログラムを作っていきます。



 【1μsのサイクル数を求める】
 PICの処理サイクルは使用クロックの1/4になるので、20MHzのクロックでは毎秒500万サイクルになる。1μsでは5サイクルになります。

 【38KHzの1周期のパルスを作る】
 38KHzの1周期は26.5μsです。ONになる時間を短くすると消費電流が少なくなるので、ONとOFFの長さはそれぞれ ON=8.5μs OFF=18μs にします。
 これをPICのサイクル数で表すと ON=42サイクル OFF=90サイクル にります。
 下図は 38KHz のパルス幅を示した図と PIC で38KHz1周期分の赤外線LEDを発光させるプログラムと、38KHz1周期分の赤外線LEDを発光させないプログラムです。  この2通りのプログラムで信号コードの尺の基準となる "T" を作ります。





 【"T" を作る】
 信号コードの基準となる "T" の ON("1")側とOFF("0")側 を作ります。1Tの幅は0.56ms(560μs)です。  なので、1Tの幅は38KHzでは約21パルス(周期)に相当します。


 


 【各コードを作る(リーダーコード、ビット0、ビット1)】
 上記で作った1Tを基に各コードを作ります。



 【1byte(バイト)のデータを送信するときに呼び出すプログラムを作る】
 1byte(バイト)のデータをWレジスタに読み込み、callでこのプログラムを呼び出すと規定のコードでデータを送信します。
 ここがキモで1byteのデータをbit単でbit0から順にbit7までそれぞれのbitが1 or 0 か btfss で確認しコード変換して送ります。



 【信号コードを送信する】
 SW1のボタンを押すと、この Main2 を実行します。リーダーコードと4byteのデータを送信します。  ここで送信プログラムが終了です。




■■■■■■ PICで受信機を作る  ■■■■■■





 【実験用 受信基板の仕様】
 赤外線受信モジュールの信号出力(OUT)は、送信側の入力と逆に(通常は"High"のまま)出てくるので、リーダー部の信号は "Low" 待ちになります。
 LED1 は SW4(送信基板) を押すと点灯・消灯を繰り返します。
 LED2 は SW3(送信基板) を押すと点灯・消灯を繰り返します。
 LED3 は SW2(送信基板) を押すと点灯・消灯を繰り返します。

 【コードの受信と処理】
 コードを受信、データ格納、データ照合までの参考例です。詳細なところまでは記述していません。



■■■■■■ リモコンコード解析ソフト  ■■■■■■
 リモコンコードの内容を確認するためのソフトです。また自作リモコンの不具合箇所を確認するためにも使用します。リモコンコードを受信する基板 および コード内容を変換するソフトで構成しています(【図@】参照)。
 基板から 0.1msごとに取得した "0"または"1" のデータがソフトに届くので、"0"または"1" の長さを解析して結果を16進または2進で表示します。 NECフォーマット、家電協フォーマット、その他 リーダーコード、データコードの構成がおおまか同じなら、受信データ変換して 16進数、2進数、バイト数を表示します。
 変換できないコードは "C 0.1ms単位 受信データ" に生データをそのまま表示するので、0.1ms単位のデータ内容を確認できます。

■ テスト基板
 赤外線モジュールの出力が High → Low に変化したら、0.1msごとに 2000bit (200ms) の出力値を取得し、解析ソフトへデータを送る基板です。PIC16F688 で制御しています。
 動作内容は、赤外線モジュールの出力を接続している RC3ピン を btfsc でループさせ、High → Low に変化(リーダーコードの先頭が来たことを意味する)したら、0.1msごとに出力の状態を取得した値を反転(Low = 1、High = 0)し、変数の0bit目に "1" または "0" を格納、rlf で 1bit左へ移動させ、計8bit(1byte)埋まったら 1byte分を順次送信します。
 PICのクロックは内部発振の8MHzを使用しているので、"0.1msごとに出力の状態を取得" の部分は 200サイクル(0.1ms)ごとに割り込みを発生させ、 割り込み内で格納、8bit格納完了する 1.6ms ごとに送信を行います。 1.6msごとに1byte送信しないといけないので、通信速度は19600bpsで行います。 データは計250byte(2000bit)を送信します。

■ リモコンコード解析ソフト
VB2008で作ったソフトです。通信速度はPIC側と同じ19600bpsです。
PICから1byteのデータを受け取ると、"C 0.1ms単位 受信データ" に 1byte=8bit を 見やすく 10bit単位で 50bit x 40行 = 2000bit = 200ms分の生データを表示します。
 また、別途 "C 0.1ms単位 受信データ" をもとに、連続する "0" または "1" の数をカウントして データコードとしての "0" または "1" に 置き換え、順次 1byte ごとに変換し、"B 2進数" "A 16進数" へ追記表示していきます。 データコードの変換完了は、 "C 0.1ms単位 受信データ" を見るとわかりますが、データ送信が終わると "0" が続く区間があるので、 そこでデータ変換完了とし、"@ バイト数" へ受信バイト数を表示します。
 以下、リピートコードがあるか、また 次(2回目)の確認用データコードが続くかは "C 0.1ms単位 受信データ" で確認することになります。

■ リモコンコード解析ソフトの構成


■ 日立製テレビに付属リモコンの電源ボタンを押した際のリモコンコード解析結果


■ DENON製CDプレーヤーに付属リモコンの電源ボタンを押した際のリモコンコード解析結果