yusuke takahashi
/
BallTest_one
ikko
Diff: main.cpp
- Revision:
- 0:dddf16147ff2
- Child:
- 1:d9b990411155
diff -r 000000000000 -r dddf16147ff2 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Mar 14 06:16:27 2013 +0000 @@ -0,0 +1,134 @@ +#include "mbed.h" + +#define IR_TIME_NOTFOUND 833 /* 見つけられなかったと判断するまでの時間(単位:us) */ +#define IR_COUNTMAX 487 /*最大パルス幅 パルスの存在しうる最大時間は487us*/ +#define ALL_IR 8 + +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] = { + p19, + p20, + p25, + p26, + p27, + p28 +}; + +DigitalIn sensor_ir(p19); + +unsigned int moving_ave(unsigned int data) +{ + static unsigned int tmp[14] = {0}; + static unsigned int sum = 0; + uint8_t i; + uint8_t count; + + sum -= tmp[13]; + sum += data; + tmp[13] = tmp[12]; + tmp[12] = tmp[11]; + tmp[11] = tmp[10]; + tmp[10] = tmp[9]; + tmp[9] = tmp[8]; + tmp[8] = tmp[7]; + tmp[7] = tmp[6]; + tmp[6] = tmp[5]; + tmp[5] = tmp[4]; + tmp[4] = tmp[3]; + tmp[3] = tmp[2]; + tmp[2] = tmp[1]; + tmp[1] = tmp[0]; + tmp[0] = data; + + return sum/10; +} + +int main () { + unsigned int active_ir = 0; /* 今回更新する赤外線の番号 */ + unsigned int memory_ir = 0; /*赤外線時間カウンタ*/ + unsigned int flag_ir = 0; + + for(;;){ + 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){ + break; /* 立ち上がっている時間が指定時間越えたらブレイク */ + } + } + + memory_ir = timer_ir.read_us(); + + while(1){ + + unsigned int counter_noise; + + if(!(sensor_ir)){ + myleds = moving_ave( (timer_ir.read_us()-memory_ir)/10 ); /* パルス幅を記録 */ + //ir_width[active_ir] = timer_ir.read_us()-memory_ir; /* パルス幅を記録 */ + //myleds = (timer_ir.read_us()-memory_ir)/10; + + myleds = 0xFF; + + pc.printf("%d\n",moving_ave( (timer_ir.read_us()-memory_ir)/10 )); + + wait(0.01); + break; + }else{ + /*ノイズ対策(ノイズで一瞬だけ立ち上がる可能性があるから)*/ + //counter_noise = timer_ir.read_us(); /* 経過時間を保存 */ + //while(timer_ir.read_us()-counter_noise <= 6){}; /* 6us間待つ */ + //if(!(sensor_ir)){ /* もし立ち下がっていたら */ + // flag_ir = 0; //iminasi + + // timer_ir.stop(); /* タイマー停止 */ + // timer_ir.reset(); /* タイマーリセット */ + + // break; + //} + } + } + }else{ + /*ボールが見つかっていない場合*/ + //ir_width[active_ir] = 0; + myleds = 0x00; /* パルス幅を記録 */ + } + timer_ir.stop(); /* タイマー停止 */ + timer_ir.reset(); /* タイマーリセット */ + + memory_ir = 0; + + /*active_ir++; 次の赤外線センサへ(読み取る赤外線センサを順番に回す) + if( active_ir >= NUM_IR ){ + active_ir = 0; 6個全ての赤外線センサをまわったら一番初めに戻る + }*/ + } +}