赤外線通信の実験パート1
(マイコン間のデータ通信を行う)

〔パート2〕 〔マイコンのトップに戻る〕


このページで赤外線通信に関する事を記載して行きます。
赤外線リモコンとの通信やリモコンを模しして機器(家電)を動かすなどはこのページでは行いません。
マイコン間のデータ通信として使用します。
(IrDAではなく、赤外線リモコンを真似たオリジナルな通信となります)
尚、赤外線リモコンの基本についてはこちらのFUTABA HOMEさんが詳しいいです、参照下さい。
また、「赤外線リモコンを送信器にして何か動かす」の記事はこちらを見て下さい。

赤外線通信のイメージ図
イメージ図

データを通信する場合は、送信器側で「送信データ」に通信先のデバイスNoと通知情報で送ります。
それを受けた受信器側は自分のデバイスNoなら通知情報を受取り、異なるなら捨てます。
また、受信器側はデバイスNo=255時は通知情報を受取ります、この機能で一斉に通知可能です。

送信データのフォーマット
フォーマット図1 フォーマット図2

フォーマット図3
赤外線LEDから送られる「送信データ」は、赤外線受信モジュールで
受取りますが、受信モジュールが出力するデータはON・OFFが
逆(反転)となっている事に注意です。


通知情報2は、通知情報1の反転ビットです、受信器側で2を反転させ1と2が同じデータかチェックしています。 なので、通知情報は8ビットで0〜255の値です。
また、このフォーマットは通常の赤外線リモコンフォーマットと異なっています。

実際に通信したロジック波形 *2)

赤色の波形は赤外線LEDとマイコン間の波形で、緑色の波形は受信モジュールの出力波形
送信側と受信側で反転しているのがわかると思います。
フォーマット図1

赤色の波形を拡大して見るとON部分が38KHzで送信されているのがわかるでしょう。
フォーマット図2


赤外線LEDと赤外線受信モジュールについて

赤外線LED
秋月通商のこちらで購入できます。
接続は通常のLEDと同じです、 ただ、この赤外線LEDは電流が50mA流せるようですが下回路の様にマイコンに直接接続する場合は20mAとして下さい。
50mA以上流したい場合は一旦トランジスターで受ける回路が必要です、こちらを参考にして下さい。
距離を得るには何個LEDを付けるとかぁどの程度電流を流すとかぁは実験していません、 部品購入して後日行いたいとは思っていますが......。
とりあえずぅ、100Ωの抵抗付けてぇ、室内で7m位までは確認していますがぁ......

赤外線受信モジュール
IR 秋月通商のこちらで購入できます。
低電圧で駆動したい場合はこちらあたりですかね。

下回路では取付けていませんが、実際に半田付けして回路を作る場合は
端子のGNDと5V間にCR回路(データシート参照)を取り付けて下さい。

《PICでの通信》

配線図1
 これが赤外線で送受信する場合のサンプル回路です、
 送信器の場合は、IRモジュール回路を外して下さい。
 受信器の場合は、赤外線LED回路を外して下さい。

 PICの5番ピン(RA2)をCCP1ピンとして赤外線LEDに接続しています。


プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。 *3)
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

 [送信器プロジェクトファイル]
 Send.c ・・・・・・・・・・・・送信本体のソースプログラム *3)
 skInfraredCOM.c ・・・・赤外線通信部分の関数を記述したソースプログラム *3)
 skInfraredCOM.h ・・・・ヘッダファイル
 [受信器プロジェクトファイル]
 Recive.c ・・・・・・・・・・・受信本体のソースプログラム *3)
 skInfraredCOM.c ・・・・赤外線通信部分の関数を記述したソースプログラム *3)
 skInfraredCOM.h ・・・・ヘッダファイル

Send.c

送信サンプルプログラムは、通信相手のデバイスNOは255の[一斉通知]で1秒毎にデータ(0x30〜0x7b)を繰返し送信するだけです。
また、CCP1(PWM)の機能を使用して37.9KHzの信号を作り出しています。
CCP1(PWM)の機能についてはこちらを参考にして下さい。

Recive.c

受信サンプルプログラムは、マイデバイスNoは10番としています、だからそれ以外のNoで来たらデータを捨てますが、 No=255[一斉通知]ならデータを受信します。

このサンプルプログラムでは、受信したデータは「別途作成のデバッグモニタ」で内容を
表示させていましたが。
「skMonitorLCD.c」は送信データをTimer2のタイミングで送る様に変更しました、その為に、
「skInfraredCOM.c」のPWM出力とダブるので、「別途作成のデバッグモニタ」は使用出来ません。
ですので、こちらのI2C接続LCD等を利用する必要が有ります。m(_ _)m 
(プログラムはI2C接続LCDを利用する様には変更していません、元ままです)
 *3)

I2C接続LCDを利用する様に記事を下記に追記しました。*4)

後は、
受信したデータ内容によってLEDを点灯させたり、モータを回したり自由にアレンジしてみて下さい。

skInfraredCOM.c

skInfraredCOM.cの関数説明

InitCCP()
 CCP(PWM)機能の設定と初期化をする処理(InfraredSendを使用する時必要です)
 システムクロック周波数は32MHzを設定する事で、PWMの周期37.950Hzを発生させます。
 TMR2プリスケーラ値は1倍で設定、PWMの周期PR2=210で設定されています。
 ※ システムクロック周波数を変更する場合は、この設定値を変更する必要が有ります。

InfraredSend(toDeviceNo,KeyCode)
 赤外線LEDにデータを送信する処理
 toDeviceNo:送信相手のデバイスコードNO(1-250:251-255は予約)
         255は[一斉通知]として、受信した相手は無条件でデータを受け入れます。
 KeyCode  :送信する通知情報のデータ(1-255)
 例)InfraredSend(10,100) ;  や InfraredSend(255,7) ;

ans = InfraredRecive(MyDeviceNo)
 赤外線受信モジュールよりデータを受信する処理
 MyDeviceNo:自分のデバイス番号(1-250)
 ans      :受信データが自分へのデータなら受信した通知情報のデータ(1-255)を返す
          自分の番号と異なる番号のデータ受信時は、ans=0をかえします
          また、受信番号が255時はデータを受け入れます(一斉受信機能)。
 例)
 ans = InfraredRecive(10) ;
 if (ans != 0) {
      if (ans == 1) LED1 = 1 ;
      if (ans == 2) LED2 = 1 ;
      if (ans == 3) {
           LED1 = 0 ;
           LED2 = 0 ;
      }
 }
skInfraredCOM.h

システムクロックの周波数や赤外線受信モジュールの接続ピンの場所を変更する場合は下の2行を
変えます。
#define _XTAL_FREQ 32000000	// delay用に必要(クロック32MHzを指定)
#define IRpin      RA4		// 赤外線受信モジュールの接続ピンをここで指定する

《PIC受信側をI2C接続LCDで表示させる》 *4)

上記のPIC受信時にデータ表示を行う際、「別途作成のデバッグモニタ」を利用する様にしていたのですが
上記理由で利用出来ないのでI2C接続LCDを使ってデータ内容の表示を行う様に記事を追記します。

PIC受信でI2C接続LCDを使った配線図  左図がI2Cで接続を行うLCD表示器の
 実態配線図です。
 このLCD関連説明は、こちらを見ましょう。
 又、I2C接続にはプルアップ抵抗が必要ですが
 ここではPIC内部プルアップを利用しました。


↓ここからサンプルプログラムをダウンロードして下さい。
Recive2.zip

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 Recive2.c ・・・・・・・・・・受信本体のソースプログラム(I2C接続LCDに表示させる)
 skInfraredCOM.c・・・・赤外線通信部分の関数を記述したソースプログラム
 skInfraredCOM.h ・・・赤外線通信部分関連ヘッダファイル
 skI2CLCDlib.c ・・・・・・I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h ・・・・・・I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c ・・・・・・・・・・I2C通信を行う関数ソースファイル
 skI2Clib.h ・・・・・・・・・・I2C通信を行う関数のヘッダファイル

 尚、CPUのクロックは32MHzを想定しています。

Recive2.c

起動させるとLCDの1行目に"IR Reciver Test "を表示させ、送信側からのデータ待ちを行います。
データを受信したら、0x??:?とデータの内容を表示させます。

skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.h
skI2Clib.c

このプログラムはLCDに表示を行う為の物とI2C関連の物です、詳しくはこちらの説明を参照下さい。

《Arduinoでの通信》

配線図2

プログラムソースをダウンロードします。 解凍すると下の様に展開されます。
[skInfraredCOM]─┬─[examples]────┬─[InfraredRecive]--- InfraredRecive.pde
         ├ skInfraredCOM.cpp └ [InfraredSend]----- InfraredSend.pde
         ├ skInfraredCOM.h 
         └ keywords.txt
ArduinoIDE0022がインストールされているフォルダー、インストール先を変更していないなら
[C:\Program Files\arduino-0022\libraries]です。
この場所に上記解凍ファイルを[skInfraredCOM]ディレクトリ丸ごと移動します。
また、こちらの[ライブラリ登録]を参考すればより理解が深まるかもぉ?いや、こんがらがるかもぉ。

InfraredRecive.pde ・・・・ 受信テストの本体スケッチ
InfraredSend.pde ・・・・・ 送信テストの本体スケッチ
skInfraredCOM.cpp ・・・・赤外線通信部分の関数を記述したライブラリソース
skInfraredCOM.h ・・・・・・ヘッダファイル
keywords.txt ・・・・・・・・・ キーワードファイル

注意)
ArduinoIDE 1.0.1以降からArduinoライブラリ用インクルードファイル名が変更されています、
なのでこれ以降を利用している人は、skInfraredCOM.cpp と skInfraredCOM.h に
#include "WProgram.h" と記述しています、これを #include "arduino.h" に変更願います。 *1)

InfraredRecive.pde

InfraredRecive.pdeを開くには、
IDEを起動して、メニューバーの「File」→「Examples」→「skInfraredCOM」→[InfraredRecive]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

受信したデータはArduinoIDEのCOM画面に表示できる用にしています、シリアルモニタ画面を起動させて下さい。

InfraredSend.pde

InfraredSend.pdeを開くには、
IDEを起動して、メニューバーの「File」→「Examples」→「skInfraredCOM」→[InfraredSend]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

tone()関数を利用して37.9KHzの信号を作り出しています、tone()関数については、arduino日本語リファレンスを見て下さい。

skInfraredCOM.cpp

skInfrredCOM
 赤外線関連ライブラリを使用する為に必要な宣言を行います。
 skInfrredCOM Infrred(snd_pin_no,rcv_pin_no) ;
  snd_pin_no:赤外線送信用の赤外線LEDが接続されているピン番号を指定
  rcv_pin_no:赤外線受信用の受信モジュールが接続されているピン番号を指定
         使用しない機能のピンは−1を指定する事。
 Infrredの名前は任意に変更可能です。
 例) skInfrredCOM Infrred(3,-1) ; // 赤外線関連ライブラリを生成する(3番ピンから出力)

 skInfrredCOM Infrred(3,-1) ; 以下はこの宣言例で記述します。

Infrared.Send(toDeviceNo,KeyCode)
 赤外線LEDにデータを送信する処理
 toDeviceNo:送信相手のデバイスコードNO(1-250:251-255は予約)
         255は[一斉通知]として、受信した相手は無条件でデータを受け入れます。
 KeyCode  :送信する通知情報のデータ(1-255)
 例)Infrared.Send(10,100) ;  や Infrared.Send(255,7) ;

ans = Infrared.Recive(MyDeviceNo)
 赤外線受信モジュールよりデータを受信する処理
 MyDeviceNo:自分のデバイス番号(1-250)
 ans      :受信データが自分へのデータなら受信した通知情報のデータ(1-255)を返す
          自分の番号と異なる番号のデータ受信時は、ans=0をかえします
          また、受信番号が255時はデータを受け入れます(一斉受信機能)。
 例)
 ans = Infrared.Recive(10) ;
 if (ans != 0) {
      if (ans == 1) LED1 = 1 ;
      if (ans == 2) LED2 = 1 ;
      if (ans == 3) {
           LED1 = 0 ;
           LED2 = 0 ;
      }
 }
skInfraredCOM.h

インクルードファイル
skInfraredCOM.cpp (赤外線通信部分の関数) の機能を使用する場合に、本体スケッチにて
#include <skInfrredCOM.h>
を宣言します。




PIC受信をI2C-LCDに変更(*4) 2018/02/22
MPLAB X用に記事変更(*3) 2015/10/27
追記(*2) 2014/05/25
追記(*1) 2012/09/14


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.