■ 赤外線2ch受信機 RX2-Tの仕様
信号形式:38kHz変調赤外線
受信チャネル:4ch(使用チャネル2ch)
使用チャネル:1chエルロン、3chスロットル
エルロン制御方式:ソフトウェアPWM
スロットル制御方式:ハードウェアPWM
電源:3.7V(リポ1セル推奨)
スロットル接続可能モータ:オレンジ・モータまたはLED
エルロン接続可能コイル:100ΩコイルまたはLED
オレンジ・モータ MK07-3.3 (φ7mmx17mm 3.3Ω Orange)
■ 空欄または省略された部分を埋めてプログラムを完成してください。
// 赤外線2ch受信機 RX2&RX2-T対応
// ex10_rx2.c
// モータ:PWM機能使用(0~10の11段階)
// エルロン:ソフトウェアPWM制御(0~9の10段階)
// 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
#bit rcoil1=GP.0
#bit rcoil2=GP.1
#bit lcoil1=GP.4
#bit lcoil2=GP.5
#define ON 1
#define OFF 0
#define HI 1
#define LOW 0
#define rcoil 0x03
#define lcoil 0x30
long duty;//PWMデューティ
signed long th_count,al_count;//パルス・カウント用
int on_coil,cycl_count,coil_duty;
#int_rtcc
void coil_pwm()
{
set_timer0(6);
if(coil_duty==0){
GP=OFF;
}
else if( (その1) ){
//coil_duty=9でduty=100%
GP=on_coil;//選択されたcoil=ONにする
}
else{
GP=OFF;
}
cycl_count= (その2) ;
cycl_count= (その3) ;//0~9の10段階
}
//メイン・ルーチン
main(){
int gcount;
setup_comparator(NC_NC); //ディジタル入力切り替え
setup_ccp1(CCP_PWM); //PWMモード使用宣言
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);
// マグネット・アクチュエータ周期
//内部2MHz=0.5μs動作、
//(256-6)*8*0.5^-6=1ms、1ms*9=9ms:PWM周期=111Hz
setup_timer_2(T2_DIV_BY_4,255,1); //CCP1 PWMモード・セット
//PWM周期=(255+1)*4*(1/8E6)*4=0.512ms=1.95kHz
enable_interrupts(INT_RTCC); //timer0割り込み許可
enable_interrupts(GLOBAL); //割り込み全体許可
set_timer0(6);
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
cycl_count=coil_duty=0;
duty=0;
th_count=0;
while(1){//ギャップ検出ルーチン
gcount=0;
while(gcount < 30){
if( (その4) ){
delay_us(100);
gcount++;
}
else{
gcount=0;
}
}
While(IRSIG==HI){
}
// 1ch(エルロン)
disable_interrupts(INT_RTCC); //timer0割り込み禁止
al_count=0;
while(IRSIG==LOW){//Low、Hiループは1回10μsに調整済み
delay_us(6);
(その5) ;
}
while(IRSIG==HI){
delay_us(6);
al_count=al_count+1;
}
// 2ch(エレベータ):未使用
enable_interrupts(INT_RTCC);//timer0割り込み許可
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
// 3ch(スロットル)
disable_interrupts(INT_RTCC);//timer0割り込み禁止
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);
(その6) ;
}
enable_interrupts(INT_RTCC);//timer0割り込み許可
// 4ch(ラダー):未使用
while(IRSIG==LOW){
}
while(IRSIG==HI){
}
//エルロンの処理
if(al_count<107){//パルス下限1070μs(1520-450=1070)
al_count=107;
}
if(al_count>197){//パルス上限1970μs(1520+450=1970)
al_count=197;
}
al_count=al_count-100;//パルス幅:7~97に変換
if(al_count<47){ //左スティック
(その7) ;//左コイル・セット
al_count=-(al_count-52)/5; //エルロン分解能9段階
}
else if(al_count>57){//エルロン右
(その8) ;//右コイル・セット
al_count=(al_count-52)/5;//エルロン分解能右9段階
//エルロン右:58~97 => 1~9
}
else{//ニュートラル:47<= 52 <=57
al_count=0;
}
(その9) ;//コイルPWMデューティ・セット
//スロットルの処理
if(th_count<110){//最スロー
(その10) ;
}
else if(th_count>190){//フルスロットル
th_count=1023;
}
else{
(その11) ;//PWM9段階
//th_count=110=>100,th_count=190=>900,step 10
}
(その12) ;//PWMデューティ・セット
//最スロー+フルスロットル+PWM9段階=11段階
}//while
}//main
■実行
(1) 赤外線2ch受信機TX2-006pの電源スイッチをONにします。
(2) RX2-Tにバッテリを接続してONにします。
(3) 起動時はすべてのLEDが消えています。
(4) TX2-006pのジョイスティックをスロットルHi方向に徐々に倒すとモータLEDが比例して点灯します。
(5) エルロン方向に左右に倒すと比例してエルロンLEDが点灯します。
(6) スロットル最スロー、エルロン・ニュートラルでLEDはすべて消灯します。
(7) RX2-TをOFFにします。
(8) TX2をOFFにします。
以上の動作が確認できれば、RX2-Tのプログラミングは成功です。また、ハードウェアも正常に動作しています。完成したプログラムは赤外線2ch受信機RX2のファームウエアとして搭載します。
■ダウンロード
この課題のC言語ソース・ファイルおよびHEXファイルは【ex10_rx2.lzh】よりダウンロードできます。
■解答
(その1)cycl_count <= coil_duty (その2)cycl_count+1 (その3)cycl_count % 10
(その4)IRSIG==HI (その5)al_count=al_count+1
(その10)th_count=0 (その11)th_count=(th_count-100)*10 (その12)set_pwm1_duty(th_count)
以上で赤外線2ch受信機RX2-Tのプログラミングをすべて終わります。お疲れ様でした。
長野県飯田工業高校 竹内浩一

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