ikko

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }