第10章 PIC赤外線送信ボード・プログラミングを楽しみましょう
PIC赤外線送信ボードは無事に完成しましたか? これで赤外線送信・受信のプログラミングを楽しむ環境が整いました。
今回より、赤外線送信プログラミングを楽しみたいと思います。
赤外線受信ボードには第7章課題10、2チャンネル対応赤外線受信モニタのファームウエアを転送しておいてください。
■ 課題10-1
赤外線送信ボードのDOWNスイッチを押すと、受信ボードのDOWN_LEDが反応するプログラムを完成しましょう。
DOWNスイッチは3chスロットルをLOWにした場合と同じデータ=’0’を出力させます。
// ex1_tx.c PIC赤外線送信ボード // DOWNスイッチを押すと受信機のDOWN_LEDが反応する // PIC16F84A用
■ イニシャライズ
#include<16f84a.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20000000) #define ON 1 #define OFF 0#define TON 0
#define TOFF 1
タクト・スイッチはON/OFFが'0'/'1'に対応しています。私たちの感覚とは逆になるので、ここで再定義しています。
#byte RA=5 #bit DOWN_SW=RA.1 #bit RIGHT_SW=RA.0 #bit UP_SW=RA.2 #bit LEFT_SW=RA.3
UP・DOWN・RIGHT・LEFTの各スイッチの接続定義
#byte RB=6 #bit IROUT=RB.0
赤外線受光素子の定義
long th_adc,al_adc; th_adc・・UP,DOWNのデータが入ります al_adc・・RIGHT,LEFTのデータが入ります
通常の送信機の場合、スロットル・データとエルロン・データが入ります
■ 38kHz変調出力関数
赤外線受光素子は38kHzで変調された赤外線光に反応します。ir_mod()関数により、38kHzで変調を行います。
500μsの38kHz変調の赤外線光を送信後、pulseで与えられた時間になるようにOFFタイムを設定します。
//0・・1.000ms、512・・1.522ms、1024・・2.035ms
pulseの値と500μS+OFFタイムの長さは以上のように設定されています。この長さによりPPM送信を行います。
変調についてのい詳細は第8章をご覧ください。
// 38kHz変調出力関数
// 13μS On、13μS OFFを19回繰り返して500μSのONを作る
// その後、どのスイッチを押したかにより、OFFタイム設定する。
//0・・1.000ms、512・・1.522ms、1024・・2.035ms
void ir_mod(long pulse){
int dummy;
long i;
for(i=0;i<19;i++){//38kHz変調になるように調整済み
IROUT=ON;
delay_us(13);
IROUT=OFF;
delay_us(13);
}
ここまでで500μsの38kHz変調赤外線光を送信します。
IROUT=OFF;
赤外線送信をOFFにします。
delay_us(325);
時間調整です。
pulse=pulse/10;
分解能は100となります。
ここまでで約1000μs=1msです。
for(i=0;i<pulse;i++){ //1ループ10μsに調整済み
dummy=ON;
delay_us(8);
}
pulseの値によりOFFタイムの長さが変わります。今後製作予定の2ch赤外線
もし、512の場合は512/10=51となり、
5100μs=0.51ms1ms+0.51ms=1.51ms=1510μs:フタバ仕様のニュートラル
となります。
}
■ スイッチ入力
void sw_in(void)
{
if(DOWN_SW==TON){
★★★★=0;
}
else{
★★★★=512;
}
}
DOWNスイッチが押されたときの処理を行います。
ダウン・スイッチの場合、スロットルの場合は’0’と同じ意味をもちます。
押されない場合は、ニュートラルと考えて値を512とします。
■メイン関数
//メイン関数
main(){
set_tris_a(0x0f);
set_tris_b(0x00);
Aポートはすべて入力に設定。Bポートはすべて出力に設定。
IROUT=OFF;
th_adc=512;
al_adc=512;
while(1){
sw_in();
// 1ch(エルロン送信、この課題では未使用)
ir_mod(512);
// 2ch(エレベータ、未使用)
ir_mod(512);
// 3ch(スロットル)
ir_mod(th_adc);//スロットル・データ送信
// 4ch(ラダー)
ir_mod(512);
スロットル以外は512=ニュートラルに設定。
スロットルはsw()関数により設定。
// チャンネル・エンド
ir_mod(512);
ダミー・チャンネルを送信しないと受信機側が待機状態にならないために必須です。値は512でなくても可です。
delay_ms(10);送信間隔の設定です。
}}
■ 完成!
ソース・ファイルの入力後、コンパイルし、HEXファイルをPICに転送する手順は今までと同じです。プログラムを転送したPICを赤外線送信ボードに装着し、電源を入れてください。受信ボードの電源を入れることも忘れないでください。
受信ボードは電源をONにすると3回点滅し、起動します。信号を受信できない場合、LEDは何も光りませんが、ニュートラル信号を受信開始するとUP・DOWN,RIGHT・LEFTを一組として点滅を繰り返します。
何もスイッチを押していない場合、送信ボードはニュートラル信号を送信するので、送信ボードの電源を入れると受信ボードは点滅を開始します。もし、何も起きない場合は、受信ボードの向きを変えて赤外線を受信できるようにしてください。
ここまで確認できたら、DOWNスイッチを押します。受信ボードのDOWN_LEDが点灯すれば成功です。RGIHTとLEFTのLEDはそのまま点滅を繰り返します。
解答は次回に掲載します。

PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン