ikko

Dependencies:   mbed

main.cpp

Committer:
yusuke_robocup
Date:
2013-03-14
Revision:
0:dddf16147ff2
Child:
1:d9b990411155

File content as of revision 0:dddf16147ff2:

#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個全ての赤外線センサをまわったら一番初めに戻る 
        }*/
    }
}