赤外線通信の実験パート1
(マイコン間のデータ通信を行う)
〔パート2〕
〔マイコンのトップに戻る〕
このページで赤外線通信に関する事を記載して行きます。
赤外線リモコンとの通信やリモコンを模しして機器(家電)を動かすなどはこのページでは行いません。
マイコン間のデータ通信として使用します。
(IrDAではなく、赤外線リモコンを真似たオリジナルな通信となります)
尚、赤外線リモコンの基本についてはこちらのFUTABA HOMEさんが詳しいいです、参照下さい。
また、「赤外線リモコンを送信器にして何か動かす」の記事はこちらを見て下さい。
PS.
IrDA通信の記事は、こちらに追加しました。
赤外線通信のイメージ図
データを通信する場合は、送信器側で「送信データ」に通信先のデバイスNoと通知情報で送ります。
それを受けた受信器側は自分のデバイスNoなら通知情報を受取り、異なるなら捨てます。
また、受信器側はデバイスNo=255時は通知情報を受取ります、この機能で一斉に通知可能です。
送信データのフォーマット
赤外線LEDから送られる「送信データ」は、赤外線受信モジュールで
受取りますが、受信モジュールが出力するデータはON・OFFが
逆(反転)となっている事に注意です。
通知情報2は、通知情報1の反転ビットです、受信器側で2を反転させ1と2が同じデータかチェックしています。
なので、通知情報は8ビットで0〜255の値です。
また、このフォーマットは通常の赤外線リモコンフォーマットと異なっています。
実際に通信したロジック波形 *2)
赤色の波形は赤外線LEDとマイコン間の波形で、緑色の波形は受信モジュールの出力波形
送信側と受信側で反転しているのがわかると思います。
赤色の波形を拡大して見るとON部分が38KHzで送信されているのがわかるでしょう。
赤外線LEDと赤外線受信モジュールについて
赤外線LED
秋月通商のこちらで購入できます。
接続は通常のLEDと同じです、
ただ、この赤外線LEDは電流が50mA流せるようですが下回路の様にマイコンに直接接続する場合は20mAとして下さい。
50mA以上流したい場合は一旦トランジスターで受ける回路が必要です、こちらを参考にして下さい。
距離を得るには何個LEDを付けるとかぁどの程度電流を流すとかぁは実験していません、
部品購入して後日行いたいとは思っていますが......。
とりあえずぅ、100Ωの抵抗付けてぇ、室内で7m位までは確認していますがぁ......
赤外線受信モジュール
秋月通商のこちらで購入できます。
低電圧で駆動したい場合はこちらあたりですかね。
下回路では取付けていませんが、実際に半田付けして回路を作る場合は
端子のGNDと5V間にCR回路(データシート参照)を取り付けて下さい。
《PICでの通信》
これが赤外線で送受信する場合のサンプル回路です、
送信器の場合は、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を使ってデータ内容の表示を行う様に記事を追記します。
左図が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での通信》
プログラムソースをダウンロードします。
解凍すると下の様に展開されます。
[skInfraredCOM]─┬─[examples]────┬─[InfraredRecive]--- InfraredRecive.ino
├ skInfraredCOM.cpp └ [InfraredSend]----- InfraredSend.ino
├ skInfraredCOM.h
└ keywords.txt
ArduinoIDE0022がインストールされているフォルダー、インストール先を変更していないなら
[C:\Program Files\arduino-0022\libraries]です。
この場所に上記解凍ファイルを[skInfraredCOM]ディレクトリ丸ごと移動します。
また、こちらの[ライブラリ登録]を参考すればより理解が深まるかもぉ?いや、こんがらがるかもぉ。
InfraredRecive.ino ・・・・ 受信テストの本体スケッチ
InfraredSend.ino ・・・・・ 送信テストの本体スケッチ
skInfraredCOM.cpp ・・・・赤外線通信部分の関数を記述したライブラリソース
skInfraredCOM.h ・・・・・・ヘッダファイル
keywords.txt ・・・・・・・・ キーワードファイル
注意)
ArduinoIDE 1.0.1以降からArduinoライブラリ用インクルードファイル名が変更されています、
なのでこれ以降を利用している人は、skInfraredCOM.cpp と skInfraredCOM.h に
#include "WProgram.h" と記述しています、これを #include "arduino.h" に変更願います。 *1)
PS. 変更しました。 *5
InfraredRecive.ino
InfraredRecive.inoを開くには、
IDEを起動して、メニューバーの「File」→「Examples」→「skInfraredCOM」→[InfraredRecive]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
受信したデータはArduinoIDEのCOM画面に表示できる用にしています、シリアルモニタ画面を起動させて下さい。
InfraredSend.ino
InfraredSend.inoを開くには、
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>
を宣言します。
スケッチの拡張子を"pde"から"ino"に変更しました(*5) 2020/04/08
PIC受信をI2C-LCDに変更(*4) 2018/02/22
MPLAB X用に記事変更(*3) 2015/10/27
追記(*2) 2014/05/25
追記(*1) 2012/09/14
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.