あああ

Dependencies:   HMC6352 Ping mbed

main.cpp

Committer:
ryuna
Date:
2015-02-25
Revision:
0:e742eb5a0f3e

File content as of revision 0:e742eb5a0f3e:

#include "mbed.h"
#include "HMC6352.h"
#include "Ping.h"
#include "common.h"

#define ALL_IR 11
#define BREAK_TIME_IR 833
#define ERROR_IR 0x9F6 //=2550
#define NOT_F 255
#define BUT_WAIT        0.3 //s
#define ENTER   0
#define EXIT    1
Serial sensor(p13,p14);
Serial pc(USBTX,USBRX);
HMC6352 compass(p9,p10);
Ping PING_F(p5);    /* 超音波距離センサのピンを設定 */
Ping PING_L(p6);
Ping PING_B(p7);
Ping PING_R(p8);
Timer timer_ir;
DigitalIn CalibEnterButton(p15);



DigitalIn ir[ALL_IR] = {p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p12};
DigitalOut myled[4] = {LED1,LED2,LED3,LED4};

extern void micon_tx();
uint8_t compass_data[2] = {0};
uint8_t ping_data[4] = {0};//DENGER: VALUE is N/A  end
uint8_t ir_min = NOT_F, ir_num = NOT_F;//data format
uint8_t ir_main = 0;
const uint8_t flag_case[ALL_IR] = {1,1,1,1,1,1,1,1,1,1,1};// use ir_flag

unsigned int moving_ave(uint8_t num, unsigned int data){
    static unsigned int sum[ALL_IR] = {0};
    static unsigned int temp[ALL_IR][10] = {0};
    
    sum[num] -= temp[num][9];
    sum[num] += data;
    temp[num][9] = temp[num][8];
    temp[num][8] = temp[num][7];
    temp[num][7] = temp[num][6];
    temp[num][6] = temp[num][5];
    temp[num][5] = temp[num][4];
    temp[num][4] = temp[num][3];
    temp[num][3] = temp[num][2];
    temp[num][2] = temp[num][1];
    temp[num][1] = temp[num][0];
    temp[num][0] = data;
    //sum[num]+=modulate[num];
    
    //return ir_data[num] = sum[num]/100;
    return sum[num]/10;//return ir_value
}

unsigned int ir_function (uint8_t num){
    uint8_t flag = 0;
    unsigned int memory = 0;
    unsigned int data = 0;
       
    flag = flag_case[num];
    timer_ir.start();
    if(ir[num]){
        while(ir[num]){
            if(timer_ir.read_us() >= BREAK_TIME_IR){
                flag = 0;
                break;
            }
        }
    }
    timer_ir.stop();
    timer_ir.reset();
    
    if(flag){
        timer_ir.start();
        while(!ir[num]){
            if(timer_ir.read_us() >= BREAK_TIME_IR){
                break;
            }
        }
        memory = timer_ir.read_us();
        while(1){
            if(!ir[num]){
                data = (timer_ir.read_us() - memory);
                timer_ir.stop();
                timer_ir.reset();
                //wait(0.01);
                return data;
            }
            if((timer_ir.read_us()-memory)>2550){
                break;
            }
        }
    }
    timer_ir.stop();
    timer_ir.reset();
    
    return ERROR_IR;
}
void ir_fun(unsigned int ir_data[]){
    uint8_t num;
    uint8_t i;//count
    unsigned int min;
    
    min = ERROR_IR;
    num = NOT_F;
    
    for (i = 3;i < (ALL_IR+2) ;i++){
        if(i ==10){
            if(min > ir_data[0]){
                min = ir_data[0];
                num = 0;
            }
        }else if(i == 11){
            if(min > ir_data[1]){
                min = ir_data[1];
                num = 1;
            }
        }else if(i == 12){
            if(min > ir_data[2]){
                min = ir_data[2];
                num = 2;
            }
        }else{
            if(min > ir_data[i]){
            min = ir_data[i];
            num = i;
            }
       }
    }
    if(num == 2){
        if(ir_data[5]<ir_data[1]) num = 3;
    }
    if(num == 4){
        if(ir_data[1]<ir_data[5]) num = 3;
    }
    
    ir_min = min/10;
    ir_num = num;


}
int main(void){
    
    int compassdef = 0,compass_A = 0;/*compass_A = original_value,used compass_data*/
    uint8_t i = 0;
    unsigned int ir_data[ALL_IR] = {0};  //DENGER: VALUE is N/A

    
    
    compass.setOpMode(HMC6352_CONTINUOUS, 1, 20);
    compassdef = (compass.sample() / 10);
    sensor.attach(&micon_tx,Serial::TxIrq);//送信空き割り込み設定
    sensor.putc(1);                         //送信開始+
    
    CalibEnterButton.mode(PullUp);
        
    if(!CalibEnterButton){
            myled[3] =1;
            compass.setCalibrationMode(ENTER);
            while(!CalibEnterButton);
            compass.setCalibrationMode(EXIT);
            wait(BUT_WAIT);
            myled[3] = 0;
         }
    while(1){
        compass_A = ((compass.sample() / 10) + 540 - compassdef) % 360;
        if(compass_A >255 ){
            compass_data[0] = 255;
            compass_data[1] = compass_A - 255 ;
        }else{
            compass_data[0] = compass_A;
            compass_data[1] = 0;
        }
         /* 超音波発射 */
        PING_F.Send();
        PING_L.Send();
        PING_B.Send();
        PING_R.Send();
 
        wait_ms(30);    // 待つ
 
        /* 結果から距離を算出 */
        ping_data[FRONT] = PING_F.Read_cm() / 2;  // FRONT距離を記録 [cm]
        ping_data[LEFT]  = PING_L.Read_cm() / 2;  // LEFT距離を記録 [cm]
        ping_data[BACK]  = PING_B.Read_cm() / 2;  // BACK距離を記録 [cm]
        ping_data[RIGHT] = PING_R.Read_cm() / 2;  // RIGHT距離を記録 [cm]
        
            // PING_F.Send();  wait_ms(30);  Ping_F=PING_F.Read_cm()/2;
            // PING_R.Send();  wait_ms(30);  Ping_R=PING_R.Read_cm()/2;
            // PING_B.Send();  wait_ms(30);  Ping_B=PING_B.Read_cm()/2;
            // PING_L.Send();  wait_ms(30);  Ping_L=PING_L.Read_cm()/2;
            /* アクセス可能になるまで待機してから、値を代入 */
            /*PING_slots.wait();
                Ping_data[0] = Ping_F;
                Ping_data[1] = Ping_R;
                Ping_data[2] = Ping_B;
                Ping_data[3] = Ping_L;
            PING_slots.release();
            */
            //wait(0.1);
        

        for( i = 0; i < ALL_IR; i++){/*赤外線データの読み取り*/
             ir_data[i] = moving_ave(i,ir_function(i));
        }
        
        ir_fun(ir_data);
        ir_main = ir_data[10]/10;
        //
        //pc.printf("%d\t%d\n",ir_function(8), (moving_ave(8,ir_function(8))));
        //pc.printf("%d\n",ir_data[8]);
        //pc.printf("compass: %d\n",compass_A);//check finish
        //pc.printf("ping0:%d\tping1:%d\tping2:%d\tping3:%d\n",ping_data[0],ping_data[1],ping_data[2],ping_data[3]);
        //pc.printf("ir_min:%d\tir_num:%d\n",ir_min,ir_num);
        //pc.printf("0:%d 1:%d 2:%d 3:%d 4:%d 5:%d 6:%d 7:%d 8:%d 9:%d \n",ir_data[0],ir_data[1],ir_data[2],ir_data[3],ir_data[4],ir_data[5],ir_data[6],ir_data[7],ir_data[8],ir_data[9]);

        
    }
    
    
    
}