yusuke takahashi
/
Ball_fanction
IRIR
main.cpp
- Committer:
- yusuke_robocup
- Date:
- 2013-03-08
- Revision:
- 2:22b099fbdd14
- Parent:
- 1:d6c8be12a3de
File content as of revision 2:22b099fbdd14:
#include "mbed.h" #define IR_TIME_NOTFOUND 833 /* 見つけられなかったと判断するまでの時間(単位:us) */ #define IR_COUNTMAX 487 /*最大パルス幅 パルスの存在しうる最大時間は487us*/ #define ALL_IR 9 #define DIREC_IR 8 #define DIRECTION 16 #define TERM 0 #define DELTA -2 #define SWAP(type,a,b) { type temp = a; a = b; b = temp; } Serial pc(USBTX, USBRX); // tx, rx Timer timer_ir; /* 赤外線用タイマー */ BusOut myleds(p18, p17, p16, p15, p14, p13, p12, p11); //出力用ポート BusOut mbedleds(LED4,LED3,LED2,LED1); /* 赤外線センサに使うpinを配列に格納 */ PinName ir_num[ALL_IR] = { p13, p14, p15, p16, p17, p18, p19, p20, p30 }; int Convert_Direction[DIRECTION] = { 90, 67, 45, 22, 0, 337, 315, 292, 270, 247, 225, 202, 180, 157, 135, 112 }; int moving_ave(int data,int active_ir) { static int tmp[12][ALL_IR]= {{0,0}}; static int sum[ALL_IR] = {0}; int count = 0; sum[active_ir] -= tmp[11][active_ir]; sum[active_ir] += data; //tmp[13][active_ir] = tmp[12][active_ir]; //tmp[12][active_ir] = tmp[11][active_ir]; tmp[11][active_ir] = tmp[10][active_ir]; tmp[10][active_ir] = tmp[9][active_ir]; tmp[9][active_ir] = tmp[8][active_ir]; tmp[8][active_ir] = tmp[7][active_ir]; tmp[7][active_ir] = tmp[6][active_ir]; tmp[6][active_ir] = tmp[5][active_ir]; tmp[5][active_ir] = tmp[4][active_ir]; tmp[4][active_ir] = tmp[3][active_ir]; tmp[3][active_ir] = tmp[2][active_ir]; tmp[2][active_ir] = tmp[1][active_ir]; tmp[1][active_ir] = tmp[0][active_ir]; tmp[0][active_ir] = data; for(int i=0;i<12;i++){ if(tmp[i][active_ir])count++; } return sum[active_ir]/count; } void IR_Position(int* direction,int* distance){ int ir_value[ALL_IR+100] = {0}; int active_ir = 0; /* 今回更新する赤外線の番号 */ int memory_ir = 0; /*赤外線時間カウンタ*/ int flag_ir = 0; int value = 0; for(int i=0; i<ALL_IR; i++) { flag_ir = 1; DigitalIn sensor_ir(ir_num[active_ir]); /* 今回更新する赤外線の個体を呼び出す */ timer_ir.start(); /* タイマー起動 */ if(sensor_ir) { /* もし立ち上がっていたら */ while(sensor_ir) { /* 立ち下がるまで待つ */ if(timer_ir.read_us() >= IR_TIME_NOTFOUND) { flag_ir = 0; break; /* 立ち上がっている時間が指定時間越えたらブレイク */ } } } timer_ir.stop(); /* タイマー停止 */ timer_ir.reset(); /* タイマーリセット */ if(flag_ir) { timer_ir.start(); /* タイマー起動 */ while(!(sensor_ir)) { /* 立ち上がるまで待つ */ if(timer_ir.read_us() >= IR_TIME_NOTFOUND) { flag_ir = 0; break; /* 立ち上がっている時間が指定時間越えたらブレイク */ } } } /*ボールが指定時間内に見つかっていたら*/ if(flag_ir) { memory_ir = timer_ir.read_us(); while(1) { if((timer_ir.read_us()-memory_ir)>=IR_TIME_NOTFOUND)break; if(!(sensor_ir)) { //value = moving_ave( (timer_ir.read_us()-memory_ir)/10 , active_ir ); value = (timer_ir.read_us()-memory_ir)/10; break; } } } else { /*ボールが見つかっていない場合*/ value = 0; } timer_ir.stop(); /* タイマー停止 */ timer_ir.reset(); /* タイマーリセット */ memory_ir = 0; ir_value[active_ir] = value; //direction array active_ir++; if( active_ir >= ALL_IR) { active_ir = 0; /***********direction***********/ int min = 100,youso_min = 100; for(int i = 0; i<DIREC_IR; i++) { if((ir_value[i]<min)&&(ir_value[i])) { min = ir_value[i]; youso_min = i; } } double hiritu = 0; int direc = 0; if(youso_min == 0) { hiritu = (double)ir_value[7]/(double)ir_value[1]; } else if(youso_min ==7) { hiritu = (double)ir_value[6]/(double)ir_value[0]; } else { hiritu = (double)ir_value[youso_min-1]/(double)ir_value[youso_min+1]; } if((hiritu <= 0.85)&&(youso_min != 0)) { direc = youso_min*2-1; }else if((hiritu <= 0.85)&&(youso_min == 0)){ direc = 15; }else if(hiritu >= 1.15) { direc = youso_min*2+1; } else { direc = youso_min*2; } /*if(youso_min == 0){ direc = 0; }*/ /******* direction end *******/ /******* distance *******/ int dista; if((ir_value[youso_min]<=28 + TERM)) { dista = 30; } else if((ir_value[youso_min]>28 + TERM)&&(ir_value[youso_min]<=35 + TERM)) { dista = 90; } else if((ir_value[youso_min]>35 + TERM)&&(ir_value[youso_min]<=40 + TERM)) { dista = 120; } else if( ir_value[youso_min]>40 + TERM) { dista = 180; } else { dista = 0; } int count_ir = 0,total_ir = 0; for(int i=0; i<DIREC_IR; i++){ if(ir_value[i]){ total_ir += ir_value[i]; count_ir++; } } double hihhihi = 0; hihhihi = (double)ir_value[youso_min]/(double)ir_value[8]; if((direc == 0)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 1)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 2)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 3)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 4)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 5)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 6)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 7)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 8)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 9)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 10)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 11)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 12)&&(hihhihi >= 0.80)){ dista = 10; }else if((direc == 13)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 14)&&(hihhihi >= 0.65)){ dista = 10; }else if((direc == 15)&&(hihhihi >= 0.80)){ dista = 10; } /******** distance end *******/ *direction = Convert_Direction[direc]; *distance = dista; } } } int main () { pc.baud(9600); int derection = 0; int distance = 0; for(;;){ IR_Position(&derection,&distance); pc.printf("derection:%d distance:%d\n",derection,distance); } }