課題6より、赤外線送信機TX2-006Pの赤外線信号を受信して動作するプログラミングに挑戦しましょう。
TX2-006Pから送信される赤外線信号は、PPM方式です。PPM方式ではパルス幅を変えて送信することにより、サーボの位置などを制御します。PPM方式についてはコラムを参照してください。
このRX2-TもPPM方式の赤外線信号を受信し、動作します。パルス幅を計測する部分に最初はなじめないかもしれませんが、ぜひ、赤外線プログラミングをお楽しみください。
■チャネルについて
本書では、フタバ社のチャネル(チャンネル)構成を参考にしています。
1ch:エルロン(ラダー)
2ch:空き
3ch:スロットル(モータ制御)
4ch:空き
課題6はスロットル信号を利用するので、3ch目の信号を使うことになります。
■送受信波形
TX2-006pより赤外線変調されて送信されるPPM信号は正論理となっています。
正論理・・・0V=OFF、5V=ON
負論理・・・0V=ON、5V=OFF
RX2-Tの赤外線受光素子で受信すると負論理となって出力されます。信号を受信していないときはHiとなっていることに注目してください。
■ギャップの検出
TX2-006Pより送信される赤外線信号は、約20msの周期で送信されます。
赤外線受光素子からの出力は、
信号を受信したとき:"L"
無信号のとき:"H"
信号は"L"と"H"が入り乱れて受信されます。"H"が長く続く(3ms以上)と無信号であるとして、"H"の間待機します。
100μs×30=3000μs=3ms
この長い"H"をギャップと呼びます。ギャップを見つけるループが"ギャップ検出ルーチン"です。ギャップが見つかると"L"になるまで待機します。
th_count=0;
while(1){//ギャップ検出ルーチン
gcount=0;
while(gcount < 30){
if(IRSIG==HI){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}
While(IRSIG==HI){
}
■チャネル・カウント
ギャップが見つかると、"Hi"のまま待機します。
次の"Low"が1chエルロン信号です。課題6ではエルロンは使わないので、"Low"→"Hi"に変化するまで待機します。
// 1ch(エルロン):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
2chはエレベータです。ここも使わないので、読み飛ばします。
// 2ch(エレベータ):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
4chのラダーも同様に読み飛ばします。
最後のエンド・チャネルはLowを見つけるためだけに送信されています。とくに処理を入れる必要はありません。
■スロットル・パルス幅のカウント
3chスロットルは、パルスの幅をカウントします。
最初に"Hi"、続けて"Low"の長さをカウントし、th_countに格納します。th_countには"Hi+Low"の長さ合計が格納されています。このプログラムではカウント用ループ1回を10μsとしたので、
th_count×10μS=パルス幅(μs)
と計算することができます。
// 3ch(スロットル)
th_count=0;
while(IRSIG==LOW){
//Low、Hiループは1回10μsに調整済み
delay_us(6);
th_count=th_count+1;
}
while(IRSIG==HI){
delay_us(6);
th_count=th_count+1;
}
■ フルHiと最スローの処理
パルス幅は1.0ms~2.0msが有効範囲です。フタバ社のパルスを参考にして、1520μs=1.52msをニュートラルとし、±450μsをパル幅としています。
1520-450=1070μs ~ 1520μs ~ 1520+450=1970μs
スロットルとエルロンなどほかのチャンネルではパルス幅による呼び方が異なっています。ラジコン飛行機では次の呼び方が一般的です。
| チャネル | パルス幅(μs) | 1070 | 1520 | 1970 |
| 1ch | エルロン | Left | ニュートラル | Right |
| 2ch | エレベータ | Down | ニュートラル | Up |
| 3ch | スロットル | 最スロー | スロットル・ハーフ | フルHi |
| 4ch | ラダー | Left | ニュートラル | RIght |
この条件に当てはまるようにth_countの値を加工します。この課題ではニュートラルだけを検出すればよいのですが、今後の課題も考慮して、最初にフルHiと最スローの処理をします。
110×10μs=1.1ms < :最スロー
190×10μs=1.9ms > :フルHi
//スロットルの処理
if(th_count<110){//最スロー
th_count=0;
}
else if(th_count>190){//フルスロットル
th_count=1023;
}
■ スロットルの9段階処理
RX2-TではモータはPIC12F683に装備されているハードウェアPWMを用いて可変します。
10ビットでPWMを使う場合、2^10種類なので、
0 ~ 2^10-1=0 ~ 1023
の値をが有効です。この課題でもその条件に合わせて、スロットルを9段階としています。
th_count:110~190 → 100~900 の9段階(Step100)
先に処理したフルHiと最スローの処理を加えるて、スロットルは11段階となります。th_countは最終的に次の値になります。
th_count:0~1023 → 0 、 100~900(Step100) 、 1023
else{
th_count=(th_count-100)*10;//スロットル9段階
//th_count=110=>100,th_count=190=>900,step 100
}
■ モータLEDの点灯
以上の処理が終わったth_countが520より大きい場合、スロットル・スティック・ハーフより上と判断して、モータLED点灯します。それ以外の場合は消灯すればプログラムは完成です。
if(th_count> 520){//ニュートラル以上
GP=motor;
}
else{
GP=OFF;
}
■空欄を埋めてプログラムを完成してください。
// 赤外線2ch受信機 RX2&RX2-T対応
// ex6_rx2.c
// 赤外線受信TX2-006Pのスロットル・スティック・ハーフ以上でモータLED ON
// for PIC12F683
#include<12f683.h>
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT
//ウオッチドック・タイマなし、パワーアップ・タイマ使用
//プロテクトなし、MCLRなし
#use delay(CLOCK=8000000) //8MHz駆動
#byte GP=5
#bit IRSIG=GP.3
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#define rcoil 0x03
#define lcoil 0x30
#define motor 0x04
signed long th_count;//パルス・カウント用
//メイン・ルーチン
main(){
int gcount;
setup_comparator(NC_NC); //ディジタル入力切り替え
setup_oscillator(OSC_8MHz);
set_tris_a(0x08);//GP3入力、ほかは出力
//GP 5 4 3 2 1 0
// lc2 lc1 ir mt rc2 rc1
// 0 0 1 0 0 0 :0x08
th_count=0;
while(1){//ギャップ検出ルーチン
gcount= (その1) ;
while(gcount < 30){
if(IRSIG== (その2) ){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}
While( (その3) ){
}
// 1ch(エルロン):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
// 2ch(エレベータ):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
// 3ch(スロットル)
th_count=0;
while( (その4) ){
//Low、Hiループは1回10μSに調整済み
delay_us(6);
th_count= (その5) ;
}
while( (その6) ){
delay_us(6);
th_count= (その7) ;
}
// 4ch(ラダー):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
//スロットルの処理
if(th_count<110){//最スロー
th_count= (その8) ;
}
else if(th_count>190){//フルスロットル
th_count= (その9) ;
}
else{
th_count=(th_count-100)*10;//スロットル9段階
//th_count=110=>100,th_count=190=>900,step 10
}
if(th_count> (その10) ){//ハーフ以上
(その11) ;
}
else{
(その12) ;
}
}
}
■実行
赤外線2ch送信機TX2-006pの電源を先にONにします。続けてRX2-Tの電源をONにします。TX2-006pのスロットル・スティックを半分以上に上げたところでLEDが点灯すれば成功です。
■ダウンロード
この課題のC言語ソース・ファイルおよびHEXファイルは【ex6_rx2.lzh】よりダウンロードできます。
■解答
(その1)0 (その2)HI (その3)IRSIG==HI (その4)IRSIG==LOW (その5)th_count+1 (その6)IRSIG==HI (その7)th_count+1 (その8)0 (その9)1023 (その10)520 (その11)GP=motor (その12)GP=OFF
次回は、モータをPWM制御により回転します。
長野県飯田工業高校 竹内浩一

インドアプレーンで学ぶマイコンのハードとソフト
赤外線制御で学ぶPICとC言語
PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン