// エアロソアラ用赤外線2ch送信機 //  26k0731tx2_earo_ab.c PIC12F683用 // A・Bバンド両用 //Aバンド:起動時スロットルフルハイ、断続音3回、機体ぴーぴー音、Bバンド:スロットルロー、断続音2回、機体ぴろぴろ音 #include<12f683.h> #DEVICE ADC=10 //ADコンバータを10bitで使用 #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000) //8MHz駆動 #byte GP=5 #bit IROUT=GP.2 #bit BUZ=GP.5 #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 long th_adc,al_adc,vdd_adc; int al_right,al_left,th_out,pbit; // 38kHz変調出力関数 // 13μS On、13μS OFFを38回繰り返して1msのONを作る void ir_on(){ //38KHzでONを1ms継続 long i; for(i=0;i<38;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } void ir_pbit(){ //38KHzでONを0.5ms継続 long i; for(i=0;i<19;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } //VR入力をADコンバータより読み出し、各変数にセットする。 void adc_in(void) { set_adc_channel(0); delay_us(20); th_adc=read_adc(); set_adc_channel(1); delay_us(20); al_adc=read_adc(); set_adc_channel(3); delay_us(20); vdd_adc=read_adc(); } //データ=1の変調 void ir1(){ ir_on(); delay_us(1500); } //デ−タ=0の変調 void ir0(){ ir_on(); delay_us(500); } //メインルーチン void main() { int i,stflag,stcount,band,bzcount; set_tris_a(0x1b); setup_adc_ports(sAN0 | sAN1 | sAN3 | VSS_VDD); //ADコンバータ使用宣言 setup_adc(ADC_CLOCK_DIV_32); //ADコンバータクロック BUZ=OFF; stflag=1;//音出しフラグ stcount=0;//音出しカウンタ adc_in();//Aバンド選択:スロットルフルハイ if(th_adc > 800){ band=0; bzcount=3; } else{//Bバンド選択 band=1; bzcount=2; } while(th_adc > 50){//スロットルローになるまで待つ adc_in(); } for(i=0;i 800){//フルハイ th_out=5; } else if(th_adc > 600){//ここの数値の変更でスロットルポイントが変更できます。 th_out=4; } else if(th_adc > 400){ th_out=3; } else if(th_adc > 250){ th_out=2; } else if(th_adc > 100){ th_out=1; } else{//最スロー th_out=0; } if(band==0){ if(stflag==1){//Aバンド:起動時のぴーぴー音 th_out=6; } } //エルロンの処理 al_right=0; al_left=0; if(al_adc > 612){//右 al_right=1; } else if( al_adc < 412){//左 al_left=1; } else{ al_right=0;//ニュートラル al_left=0; } if(band==1){ if(stflag==1){//Bバンド:起動時のぴろぴろろん音 al_right=1; al_left=1; } } //スタートビット3ms ir_on(); ir_on(); ir_on(); delay_ms(1); //第1ビット:Bチャンネル選択 if(band==1){ ir1(); pbit=pbit+1; } else if(band==0){ //Aチャンネルの場合 ir_on(); delay_us(500); } //エルロン if(al_right==1){//第2ビット:右 ir1(); pbit=pbit+1; } else{//OFF ir0(); } if(al_left==1){//第3ビット:左 ir1(); pbit=pbit+1; } else{//OFF ir0(); } //スロットル if(th_out==1 || th_out==3 || th_out==5){//第4ビット ir1(); pbit=pbit+1; } else{ ir0(); } if(th_out==2 || th_out==3 || th_out==6){//第5ビット ir1(); pbit=pbit+1; } else{ ir0(); } if(th_out==4 || th_out==5 || th_out==6){//第6ビット ir1(); pbit=pbit+1; } else{ ir0(); } pbit=pbit % 2;//第7ビット:パリティビット if(pbit==0){ ir_pbit(); } else{ ir_on(); } IROUT=OFF; // 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 if(vdd_adc < 750){ BUZ=ON; } delay_ms(80);//約100ms周期で送信する } }