// CCPハニービー・エアロソアラ共用赤外線2ch送信機 //  1013k26tx2_honey_earo.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; int th_out,rd_out; int stflag,stcount,band,bzcount,pbit; int temp,aero,honey; 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 set_adc_channel(1); delay_us(20); rd_adc=read_adc(); rd_out=rd_adc/16;// 8bit to 4 bit set_adc_channel(3); delay_us(20); vdd_adc=read_adc(); } // 38kHz変調出力関数 // 13μS On、13μS OFFを38回繰り返して1msのONを作る void ir1ms(){ //38KHzでONを1.1ms継続(Aero,Honey) int i; for(i=0;i<42;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } void ir05ms(){ //38KHzでONを0.55ms継続(Aero,Honey) int i; for(i=0;i<21;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } //送信データ=1の変調 void ir1a(){// for aero ir1ms(); delay_us(1500); } void ir1h(){// for honey bee ir1ms(); delay_us(600); } //送信デ−タ=0の変調 void ir0a(){// for aero ir1ms(); delay_us(500); } void ir0h(){// for honey ir05ms(); delay_us(600); } void vdd_check(){// 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 if(vdd_adc <220){// for AD converter 8bit BUZ=ON; } } /*ハニービーbit定義 ird[0 to 4:start];ird[5 to 6:band];ird[7 to 10:throttle];ird[11 to 14:trim] ird[15 to 17:rudder]:ird[18 to 19:parity];ird[20:end] GP 5 4 3 2 1 0 BZ VD SW L RD TH 0 1 1 0 1 1 =1b */ void go_honey(){//ハニービー実行ルーチン int i; ird[0]=1;ird[1]=0;ird[2]=0;ird[3]=1;ird[4]=1;//送信データ スタートビット初期化 ird[20]=0;//送信データエンドビット初期化 adc_in();//A/Dコンバータ読み込み IROUT=OFF; BUZ=OFF; if(band==1){//Aバンドの場合 ird[5]=0;ird[6]=0; } else if(band==0){//Bバンドの場合 ird[5]=0;ird[6]=1; } if(th_out==15){//15はスロットル範囲外 th_out=14; } for(i=0;i<4;i++){// スロットルデータ生成 ird[7 to 10] th_out=th_out & 0x0f;//上位4bitマスク temp=th_out; temp=temp & 0x01;//1bit取り出し if(temp==1){ ird[10-i]=1;//10bit目が下位のため } else{ ird[10-i]=0; } th_out=th_out >> 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; } for(i=0;i<21;i++){//赤外線送信 ird[0 to 20]送信 if (ird[i]==1){ ir1h(); } else{ ir0h(); } } IROUT=OFF; vdd_check();// 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 delay_ms(220);//周期 } 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){//Bバンド:起動時のぴーぴー音 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(); if(SW==1){//プッシュスイッチOFF=ハニービー honey=1; aero=0; } else{//プッシュスイッチON=エアロソアラ honey=0; aero=1; } if(th_adc > 12){//Bバンド選択:スロットルフルハイ band=0; bzcount=3; } else{//Aバンド選択:スロットル最スロー band=1; bzcount=2; } while(th_adc > 4){//スロットルローになるまで待つ adc_in(); } for(i=0;i