■ 課題9のC言語ソース・ファイル、HEXファイルはこちらです【LZH】
■ PIC赤外線受信ボード用2ch赤外線受信モニタ
課題9の赤外線リモコン受信プログラムはうまく動作しましたか? このプログラムが動作すれば、赤外線受光素子をはじめとしてPIC赤外線受信ボードはすべてのハードウェアが完全に動作しています。
課題10が、第7章最後のプログラムとなります。後日、PIC赤外線送信ボードを製作します。このボードの送信確認用をはじめとして後日製作予定の2ch赤外線送信機の受信確認用ハードウェアになる予定のプログラムです。
■ チャネルについて
ラジコンのサーボやモータを回す系統のことを"チャンネル(チャネル)"といいます。飛行機では3ch、ヘリコプタでは4chあればなんとか操縦することができます。このチャネルは操縦装置=プロポを発売しているメーカごとに構成が違っています。
この連載ではプロポ・メーカであるフタバ社のチャンネル構成を参考にプログラミングしています。独自のチャネル構成にしても特に問題はないのですが、プロポのチャネル構成と同じにしておくとなにかと便利です。
フタバ社のチャネル構成は以下の通りです。
1ch:エルロン
2ch:エレベータ
3ch:スロットル
4ch:ラダー
1chエルロン:
主翼の端にあり、機体の傾きを制御します。2chエレベータ:
水平尾翼の端にあり、機体の上下を制御します。3chスロットル:
モータやエンジンを制御します。4chラダー:
垂直尾翼に端にあり、機首の横方向の向きを制御します。
インドア・プレーンは屋内での飛行が前提となるので、エルロンとスロットルの2chあれば充分操縦することができます。
プログラミングではエルロンを制御する割り当てにしていますが、実際に動作するのはラダーです。これはラジコン飛行機の慣習に従っています。
■ 2チャネル対応赤外線受信モニタ
![]()
製作予定の赤外線2ch送信機・・・ジョイスティックの縦方向が3chスロットル、横方向が1chエルロンです。
このプログラムでは赤外線2ch送信機より送信される1chエルロンと3chスロットルの信号を受信し、LEDを点滅させることにより、送信機が正常に作動していることを確認します。
エルロン・スティック・ニュートラル:RIGHTとLEFT_LEDの点滅
エルロン・スティックを左右に操作:RIGHTまたはLEFT_LEDの点灯
スロットル・スティック・ニュートラル:UP/DOWN_LEDの点滅
スロットル・スティックそれ以外:UP/DOWN_LEDの点灯
■ ソース・リスト
// rx2_pic_rs_board.c
// PIC赤外線受信ボード用赤外線受信モニタ
// PIC16F84A用
#include<16f84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#byte RA=5
#byte RB=6
#bit IRSIG=RA.2
#bit DOWN_LED=RB.0
#bit UP_LED=RB.2
#bit RIGHT_LED=RB.1
#bit LEFT_LED=RB.3
//各チャネル・パルス・カウント関数
int gcount;
void ch_count()
{
gcount=0;
while(IRSIG==LOW){
delay_us(49);//1ループ50μsに調整済み
gcount++;
}
while(IRSIG==HI){
delay_us(49);
gcount++;
}
}
main(){
int i,pcount1,pcount3;
set_tris_a(0xff);
set_tris_b(0x00);
RB=0x00;
gcount=0;
for(i=0;i<3;i++){
RB=0x0f;
delay_ms(250);
RB=0x00;
delay_ms(250);
}
while(1){//ギャップ検出
gcount=0;
while(gcount < 30){
if(IRSIG==HI){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}
While(IRSIG==HI){
}
ch_count();
pcount1=gcount;
ch_count();
ch_count();
pcount3=gcount;
ch_count();
// 1ch(エルロン)
if (pcount1 < 28){
LEFT_LED=ON;//左LED点灯
}
else if(pcount1 >32){
RIGHT_LED=ON;//右LED点灯
}
else{
LEFT_LED=ON;RIGHT_LED=ON;
delay_ms(100);
LEFT_LED=OFF;RIGHT_LED=OFF;
delay_ms(100);
}
// 2ch(エレベータ))
// 3ch(スロットル)
if (pcount3 < 28){//ダウンLED点灯
DOWN_LED=ON;
}
else if(pcount3 >32){//アップLED点灯
UP_LED=ON;
}
else{
UP_LED=ON;DOWN_LED=ON;
delay_ms(100);
UP_LED=OFF;DOWN_LED=OFF;
delay_ms(100);
}
// 4ch(ラダー)
}
}
■ チャネル・カウント関数
void ch_count()
{
gcount=0;
while(IRSIG==LOW){
delay_us(49);//1ループ50μsに調整済み
gcount++;
}
while(IRSIG==HI){
delay_us(49);
gcount++;
}
}
送信されるパルスが”H”(Hi)の時間は一定なので、”L”(Low)の時間をカウントする関数です。ただし、受信時には”H”、”L”の関係は逆になります。
50μsのループをカウントすることにより、何msの”H”+”L”か?を計測します。”H”0.5ms+”L”0.5ms~1.5msが送信されてくるので、gcountは0~40の値になります。ニュートラルはgcount=30です。gcountの長さにより、モータとラダーを制御します。
ch_count();
pcount1=gcount;
ch_count();
ch_count();
pcount3=gcount;
ch_count();
ch_count()関数により得られた長さはpcount1・3の変数に入ります。
■ エルロンLED点滅
// 1ch(エルロン)
if (pcount1 < 28){
LEFT_LED=ON;//左LED点灯
}
else if(pcount1 >32){
RIGHT_LED=ON;//右LED点灯
}
else{
LEFT_LED=ON;RIGHT_LED=ON;
delay_ms(100);
LEFT_LED=OFF;RIGHT_LED=OFF;
delay_ms(100);
}
pcount1の長さにより、RIGHT/LEFT_LEDを点灯・点滅させます。この部分の変更により、LEDの点滅パターンを好きなように変更できます。
■ スロットルLEDの点滅
// 3ch(スロットル)
if (pcount3 < 28){//ダウンLED点灯
DOWN_LED=ON;
}
else if(pcount3 >32){//アップLED点灯
UP_LED=ON;
}
else{
UP_LED=ON;DOWN_LED=ON;
delay_ms(100);
UP_LED=OFF;DOWN_LED=OFF;
delay_ms(100);
}
エルロンLEDの点滅と同じです。pcount3の値によりUP/DOWN_LEDの点滅を行います。
以上のプログラミングにより、後日製作予定の赤外線送信対応のハードウェアのチェックができるようになります。
これで第7章PIC赤外線受信ボードに対応したプログラミングの課題は終わりにします。
第8章は赤外線送受信の基礎知識について説明します。
■ 課題10(この課題)のC言語ソース・ファイル、HEXファイルはこちらです【LZH】

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