yusuke takahashi
/
BallTest_one
ikko
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 00003 #define IR_TIME_NOTFOUND 833 /* 見つけられなかったと判断するまでの時間(単位:us) */ 00004 #define IR_COUNTMAX 487 /*最大パルス幅 パルスの存在しうる最大時間は487us*/ 00005 #define ALL_IR 8 00006 00007 Serial pc(USBTX, USBRX); // tx, rx 00008 00009 Timer timer_ir; /* 赤外線用タイマー */ 00010 00011 BusOut myleds(p18, p17, p16, p15, p14, p13, p12, p11); //出力用ポート 00012 00013 BusOut mbedleds(LED4,LED3,LED2,LED1); 00014 00015 /* 赤外線センサに使うpinを配列に格納 */ 00016 PinName ir_num[ALL_IR] = { 00017 p19, 00018 p20, 00019 p25, 00020 p26, 00021 p27, 00022 p28 00023 }; 00024 00025 DigitalIn sensor_ir(p30); 00026 00027 unsigned int moving_ave(unsigned int data) 00028 { 00029 static unsigned int tmp[14] = {0}; 00030 static unsigned int sum = 0; 00031 uint8_t i; 00032 uint8_t count; 00033 00034 sum -= tmp[13]; 00035 sum += data; 00036 tmp[13] = tmp[12]; 00037 tmp[12] = tmp[11]; 00038 tmp[11] = tmp[10]; 00039 tmp[10] = tmp[9]; 00040 tmp[9] = tmp[8]; 00041 tmp[8] = tmp[7]; 00042 tmp[7] = tmp[6]; 00043 tmp[6] = tmp[5]; 00044 tmp[5] = tmp[4]; 00045 tmp[4] = tmp[3]; 00046 tmp[3] = tmp[2]; 00047 tmp[2] = tmp[1]; 00048 tmp[1] = tmp[0]; 00049 tmp[0] = data; 00050 00051 return sum/10; 00052 } 00053 00054 int main () { 00055 unsigned int active_ir = 0; /* 今回更新する赤外線の番号 */ 00056 unsigned int memory_ir = 0; /*赤外線時間カウンタ*/ 00057 unsigned int flag_ir = 0; 00058 00059 for(;;){ 00060 flag_ir = 1; 00061 00062 //DigitalIn sensor_ir(ir_num[active_ir]); /* 今回更新する赤外線の個体を呼び出す */ 00063 00064 timer_ir.start(); /* タイマー起動 */ 00065 00066 if(sensor_ir){ /* もし立ち上がっていたら */ 00067 while(sensor_ir){ /* 立ち下がるまで待つ */ 00068 if(timer_ir.read_us() >= IR_TIME_NOTFOUND){ 00069 flag_ir = 0; 00070 break; /* 立ち上がっている時間が指定時間越えたらブレイク */ 00071 } 00072 } 00073 } 00074 00075 timer_ir.stop(); /* タイマー停止 */ 00076 timer_ir.reset(); /* タイマーリセット */ 00077 00078 /*ボールが指定時間内に見つかっていたら*/ 00079 if(flag_ir){ 00080 timer_ir.start(); /* タイマー起動 */ 00081 00082 while(!(sensor_ir)){ /* 立ち上がるまで待つ */ 00083 if(timer_ir.read_us() >= IR_TIME_NOTFOUND){ 00084 break; /* 立ち上がっている時間が指定時間越えたらブレイク */ 00085 } 00086 } 00087 00088 memory_ir = timer_ir.read_us(); 00089 00090 while(1){ 00091 00092 unsigned int counter_noise; 00093 00094 if(!(sensor_ir)){ 00095 myleds = moving_ave( (timer_ir.read_us()-memory_ir)/10 ); /* パルス幅を記録 */ 00096 //ir_width[active_ir] = timer_ir.read_us()-memory_ir; /* パルス幅を記録 */ 00097 //myleds = (timer_ir.read_us()-memory_ir)/10; 00098 00099 myleds = 0xFF; 00100 00101 pc.printf("%d\n",moving_ave( (timer_ir.read_us()-memory_ir)/10 )); 00102 00103 wait(0.01); 00104 break; 00105 }else{ 00106 /*ノイズ対策(ノイズで一瞬だけ立ち上がる可能性があるから)*/ 00107 //counter_noise = timer_ir.read_us(); /* 経過時間を保存 */ 00108 //while(timer_ir.read_us()-counter_noise <= 6){}; /* 6us間待つ */ 00109 //if(!(sensor_ir)){ /* もし立ち下がっていたら */ 00110 // flag_ir = 0; //iminasi 00111 00112 // timer_ir.stop(); /* タイマー停止 */ 00113 // timer_ir.reset(); /* タイマーリセット */ 00114 00115 // break; 00116 //} 00117 } 00118 } 00119 }else{ 00120 /*ボールが見つかっていない場合*/ 00121 //ir_width[active_ir] = 0; 00122 myleds = 0x00; /* パルス幅を記録 */ 00123 } 00124 timer_ir.stop(); /* タイマー停止 */ 00125 timer_ir.reset(); /* タイマーリセット */ 00126 00127 memory_ir = 0; 00128 00129 /*active_ir++; 次の赤外線センサへ(読み取る赤外線センサを順番に回す) 00130 if( active_ir >= NUM_IR ){ 00131 active_ir = 0; 6個全ての赤外線センサをまわったら一番初めに戻る 00132 }*/ 00133 } 00134 }
Generated on Tue Jul 12 2022 20:13:48 by 1.7.2