// ハニービー・ノーマル・エアロソアラ共用赤外線2ch送信機 //  1115k26tx2honey_norma_aero.c PIC12F683用 #include<12f683.h> #DEVICE ADC=8 //ADコンバータを8bitで使用 #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000)//8MHz駆動 #byte GP=5 #bit IROUT=GP.2 //赤外線LEDドライブ #bit BUZ=GP.5 //電圧監視用ブザー #bit SW=GP.3 //ジョイスティック内蔵プッシュスイッチ #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 long th_adc,rd_adc,vdd_adc,al_adc; int th_out,rd_out; int stflag,stcount,band,bzcount,pbit; int temp,aero,honey,normal; int ird[21]; //VR入力をADコンバータより読み出し、各変数にセットする。 void adc_in(void) { set_adc_channel(0); delay_us(20); th_adc=read_adc(); th_out=th_adc/16;// 8bit to 4bit th_adc=th_adc*4; set_adc_channel(1); delay_us(20); rd_adc=read_adc(); rd_out=rd_adc/16;// 8bit to 4 bit al_adc=rd_adc*4; set_adc_channel(3); delay_us(20); vdd_adc=read_adc(); } // 38kHz変調出力関数 // 13μS On、13μS OFFを19回繰り返して500μSのONを作る // その後、VRのADコンバータの値により、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(6); } IROUT=OFF; delay_us(325); pulse=pulse/10; for(i=0;i> 1;//右1bitシフト } //ラダートリムデータ生成 ird(11 to 14) if(SW==1){ for(i=11;i<=14;i++){//ノートリム ird[i]=0; } } else{//スイッチが押された場合 if(rd_out <=5){//左トリム for(i=11;i<=14;i++){ ird[i]=1; BUZ=ON; } } else if(rd_out >=10){//右トリム for(i=11;i<=13;i++){ ird[i]=0; BUZ=ON; } ird[14]=1; } } //ラダースティック位置:(0 1) (2 3) (4 5) (6 7 8 9) (10 11) (12 13) (14 15) //ラダー送信データ:   101 110  111 ニュートラル  001   010   010 if(rd_out <=6){//ラダー送信データ生成 ird[15]=1;//左 if(rd_out <=2){ ird[16]=0;ird[17]=1;//最左 } else if(rd_out <=4){//中 ird[16]=1;ird[17]=0; } else if(rd_out <=6){//小 ird[16]=1;ird[17]=1; } } else{ ird[15]=0;//右・センター if(rd_out <=8){ ird[16]=0;ird[17]=0;//ニュートラル } else if(rd_out <=10){//小 ird[16]=0;ird[17]=1; } else if(rd_out <=12){//中 ird[16]=1;ird[17]=0; } else{ ird[16]=1;ird[17]=1;//最右 } } pbit=0;//送信データよりパリティカウント計算 for(i=3;i<=15;i=i+2){ pbit=pbit+ird[i]*2;//2bit目 pbit=pbit+ird[i+1];//1bit目 } if(ird[17]==1){ pbit=pbit+ird[17]*2;//ラダーは3bitのため4bitと考える } pbit=pbit & 0x03;//下位3bit有効 if(pbit==0){//送信用パリティデータ生成 ird[18]=1;ird[19]=1;//00--11 } else if(pbit==1){//01--01 ird[18]=0;ird[19]=1; } else if(pbit==2){//10--10 ird[18]=1;ird[19]=0; } else if(pbit==3){//11--00 ird[18]=0;ird[19]=0; } ir1ms(); ir05ms(); for(i=1;i<21;i++){//赤外線送信 ird[0 to 20]送信 if (ird[i]==1){ ir1h(); } else{ ir0h(); } } IROUT=OFF; vdd_check();// 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 delay_ms(200);//周期 } void go_aero(){//エアロソアラ実行ルーチン int i; adc_in();// A/Dコンバータ読み込み IROUT=OFF; BUZ=OFF; if(stflag==1){//起動時機体より音を出すためのカウント処理 stcount=stcount+1; if(stcount==3){ stflag=0; } } if(band==1){//最スロー:Aバンド ird[1]=0; } else{ ird[1]=1;//フルハイ:Bバンド } //ラダーの処理 // ird[2],ird[3] if(rd_out <=7){//左 ird[2]=0; ird[3]=1; } else if(rd_out >=11){//右 ird[2]=1; ird[3]=0; } else{ ird[2]=0;//ニュートラル ird[3]=0; } if(band==0){ if(stflag==1){//Bバンド:起動時のぴろぴろ音 ird[2]=1;ird[3]=1; } } // スロットルの処理 // ird[4〜6]は以下のようにbitのMSBとLSBが通常と逆になります。 // 0:000,1:100,2:010,3:110,4:001,5:101 // th_out=th_out/3;//4bitを0〜5へ変換 th_out=th_out & 0x07; for(i=4;i<=6;i++){ temp=th_out; temp=temp & 0x01; if(temp==1){ ird[i]=1; } else{ ird[i]=0; } th_out=th_out >> 1; } if(band==1){//Aバンド:起動時のぴーぴー音 if(stflag==1){ ird[4]=0;ird[5]=1;ird[6]=1; } } pbit=0;//パリティ計算 for(i=1;i<=6;i++){ pbit=pbit+ird[i]; } pbit=pbit % 2; if(pbit==0){//偶数の場合 ird[7]=0; } else{ ird[7]=1;//奇数の場合 } //赤外線送信 for(i=0;i<3;i++){//start bit 1ms*3=3ms ir1ms(); } delay_ms(1); for(i=1;i<=6;i++){//ird[1 to 6] if(ird[i]==1){ ir1a(); } else{ ir0a(); } } if(ird[7]==0){//パリティ送信 ir05ms(); } else{ ir1ms(); } IROUT=OFF; vdd_check(); delay_ms(60);//Bバンド約80ms周期で送信する if(band==1){//Aバンド:約100ms周期で送信する delay_ms(20); } } //メインルーチン void main() { int i; set_tris_a(0x1b); setup_adc_ports(sAN0 | sAN1 | sAN3 | VSS_VDD); //ADコンバータ使用宣言 setup_adc(ADC_CLOCK_DIV_32); //ADコンバータクロック setup_oscillator(OSC_8MHz); BUZ=OFF; adc_in(); stflag=1;//エアロソアラ用音出しフラグ stcount=0;//音出しカウンタ if(SW==1){//プッシュスイッチOFF=ハニービー honey=1; normal=0; } else{//プッシュスイッチON=ノーマル honey=0; normal=1; } if(rd_out > 12){ honey=0; normal=0; aero=1; band=1;//aero A band bzcount=4; } else if(rd_out < 4){ honey=0; normal=0; aero=1; band=0;//aero A band bzcount=5; } else if(th_out > 12){//Bバンド選択:スロットルフルハイ、ノーマルには無効 band=0; bzcount=3; } else{//Aバンド選択:スロットル最スロー band=1; bzcount=2; } while(th_out > 4){//スロットルローになるまで待つ adc_in(); } while(rd_out < 5 || rd_out > 9){ adc_in(); } for(i=0;i