aaaa

Dependencies:   ColorSensor1 Servo mbed

main.cpp

Committer:
OGA
Date:
2013-10-19
Revision:
0:4c7c138f3891

File content as of revision 0:4c7c138f3891:

//カラーセンサ6つ同時に動かすプログラム
//大会用ロボ
//ジャンプのプログラムも入ってる
//10月17日に使う
#include "mbed.h"
#include "ColorSensor.h"
#include "Servo.h"

#include "main.h"




int cAve,roboF, jumI;

void tic_sensor()
{
    colorUpdate(1);
    roboF = robotFront();
    jumI = jumpInstruction(roboF);
    //pc.printf("R:%d G:%d B:%d\n", redp[0], greenp[0], bluep[0]);
    /*lcd.cls();
    lcd.locate(0,0);
    lcd.printf("R:%d G:%d B:%d\n", redp[0], greenp[0], bluep[0]);
    */
}



////////////////////////////////////////カラーセンサの////////////////////////////////////////
////////////////////////////////////////更新と補正プログラム///////////////////////////////////
/*void rivisedate()
{
    unsigned long red = 0,green = 0,blue =0;
    static unsigned R[COLOR_NUM], G[COLOR_NUM], B[COLOR_NUM];
    
    //最初の20回だけ平均を取る
    for (int i=0;i<=20;i++){
         color0.getRGB(R[0],G[0],B[0]);
         red       += R[0] ;
         green     += G[0] ;
         blue      += B[0] ;
         //pc.printf(" %d  %d\n",ptm(sum),sum);
    }
    
    rir = (double)green/ red ;
    rib = (double)green/ blue ;
}*/

void colorUpdate(uint8_t mode)
{
    double colorSum[COLOR_NUM];
    unsigned R[COLOR_NUM], G[COLOR_NUM], B[COLOR_NUM];


    for (int i=0; i<COLOR_NUM; i++){
        R[i] = 0;
        G[i] = 0;
        B[i] = 0;
        redp[i]   = 0;
        greenp[i] = 0;
        bluep[i]  = 0;
    }
    
    //カラーセンサの切り替え    
    if(mode == 1){
        color0.getRGB(R[0],G[0],B[0]);
        color1.getRGB(R[1],G[1],B[1]);
        color2.getRGB(R[2],G[2],B[2]);
    
        color3.getRGB(R[3],G[3],B[3]);
        color4.getRGB(R[4],G[4],B[4]);
        color5.getRGB(R[5],G[5],B[5]);
    }
    
    /*for (int i=0; i<COLOR_NUM; i++){
        colorSum[i] = R[i]*rir + G[i] + B[i]*rib ;
        redp[i]   = R[i]* rir * 100 / colorSum[i];
        greenp[i] = G[i]      * 100 / colorSum[i];
        bluep[i]  = B[i]* rib * 100 / colorSum[i];
    }*/ 
 
    for (int i=0; i<COLOR_NUM; i++){
        colorSum[i] = R[i]*0.65 + G[i] + B[i] *1.3;
        redp[i]   = R[i]*0.65 * 100 / colorSum[i];
        greenp[i] = G[i]      * 100 / colorSum[i];
        bluep[i]  = B[i]*1.3 * 100 / colorSum[i];
    }
}


uint16_t moving_ave(uint8_t num, uint16_t data)//移動平均的な
{
    uint8_t threshold = 0;
    static uint16_t tmp[COLOR_NUM][10] = {{0}};
    //static uint32_t sum[COLOR_NUM] = {0};
    
    //sum[num] -= tmp[num][9];
    //sum[num] += data;
    
    for(uint8_t i=9; i>=1; i--){
        tmp[num][i] = tmp[num][i-1];
    }
    tmp[num][0] = data;
    
    for(uint8_t i=0; i<=9; i++){
        if(tmp[num][i] >= B_THR){
            threshold++;
        }
    }
    
    return threshold;
}

////////////////////////////////////////ロボの状態///////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
uint8_t robotFront()//縄回しロボの正面にいるか
{
    uint8_t threshold = 0;
    
    for(int i=0; i<COLOR_NUM; i++){
        if(moving_ave(i, bluep[i]) >= 8) threshold++;
    }
    
    
    /*for(int i=0; i<COLOR_NUM; i++){
        cAve = moving_ave(i, bluep[i]);
        if(cAve >= 8) threshold++;
    }*/

    if(threshold >= 1){
        return 1;
    }else{
        return 0;
    }
}

uint8_t jumpInstruction(uint8_t front)//ジャンプ命令
{
    uint8_t threshold = 0;
    
    if(front == 1){
        for(int i=0; i<COLOR_NUM; i++){
            if(redp[i] >= R_THR) threshold++;
        }
    }
    
    if(threshold >= 1){
        return 1;
    }else{
        return 0;
    }
}


uint8_t robotoStop()
{
    uint8_t threshold = 0;

    for(int i=0; i<COLOR_NUM; i++){
        if(bluep[i] >= B_THR) threshold++;
    }
    
    if(threshold >= 1){
        return 1;
    }else{
        return 0;
    }
}


////////////////////////////////////////ジャンププログラム////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
/*
void jumping(uint8_t threshold)
{
    //超音波でジャンプのタイミング合わせる
    if(threshold >= 1){
            jump_t.reset();
            jump_t.start();
            while(ultrasonicVal[0] < 1700){
                led[0] = 1; led[1] = 1; led[2] = 0; led[3] = 0;
                air[0] = 1;  air[1] = 0;
                
                if(jump_t.read_ms() > 1000)break;
            }
            led[0] = 0; led[1] = 0; led[2] = 1; led[3] = 1;
            air[0] = 0;  air[1] = 1;
            wait(0.5);
    }else{
            led[0] = 0; led[1] = 0; led[2] = 0; led[3] = 0;
    }
}*/

/*void jumpAction(uint8_t threshold)
{
    if(sw1){//フォトインタラプタがオフ
        myservo1 = 0.3; led[0] = 0;led[1] = 1; led[2] = 0; led[3] = 0;
    }else{//フォトインタラプタがオン
        myservo1 = 0.5; led[0] = 1;led[1] = 0; led[2] = 0; led[3] = 0;
    }
        
    if(threshold){
        led[0] = 1; led[1] = 1; led[2] = 1; led[3] = 1;
        myservo1 = 0.3;
        wait(0.2);
    }else{
        //led[0] = 0; led[1] = 0; led[2] = 0; led[3] = 0;
    }
    
}*/






#define SEND_DATA_NUM       7
#define RECEIVE_DATA_NUM    7

#define KEYCODE             120

Serial device(p28,p27);

static uint8_t SendData0[SEND_DATA_NUM];

void dev_tx()
{
    static uint8_t count = 0;
    
    SendData0[0] = KEYCODE;

    device.putc(SendData0[count]);
     
    count++;
    
    if(count > SEND_DATA_NUM){
        count = 0;
    }
    
    led[4] = 1;
}





int main() {
    //init

    /*device.baud(9600);
    device.printf("START");
    device.attach(&dev_tx,Serial::TxIrq);*/

    //rivisedate();
    wait(3);

    interrupt0.attach(&tic_sensor, 0.1/*sec*/);//0.04sec以上じゃないとmain動かない?
    //sw1.mode(PullUp);
    //init end

    while(1) {
        SendData0[1] = jumI;    
        
        pc.printf("R:%d G:%d B:%d %t moving_ave():%d %t robotFront():%d %t jumpInstruction():%d\n", redp[2], greenp[2], bluep[2], cAve, roboF, jumI);
        
        //jumpAction(jumI);
    }
}