aa

Dependencies:   HMC6352 PID mbed

Revision:
0:bde8ed56b164
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Jun 19 08:42:55 2013 +0000
@@ -0,0 +1,564 @@
+#include <math.h>
+#include <sstream>
+#include "mbed.h"
+#include "HMC6352.h"
+#include "PID.h"
+#include "main.h"
+
+
+
+void PidUpdate()
+{   
+    static uint8_t Fflag = 0;
+    
+    pid.setSetPoint(((int)((REFERENCE + standTu) + 360) % 360) / 1.0); 
+    inputPID = (((int)(compass.sample() - (standard * 10.0) + 5400.0) % 3600) / 10.0);        
+    
+    //pc.printf("%f\n",timer1.read());
+    pid.setProcessValue(inputPID);
+    //timer1.reset();
+    
+    compassPID = -(pid.compute());
+    
+    if(!Fflag){
+        Fflag = 1;
+        compassPID = 0;
+    }
+    //pc.printf("%d\t%d\t%d\n",speed[0],speed[1],speed[2]);
+    //pc.printf("standard = \t\t%f\n",standard);
+    //pc.printf("%d\n",diff);
+    //pc.printf("compass.sample = \t%f\n",compass.sample() / 1.0);
+    //pc.printf("compassPID = \t\t%d\n",(int)compassPID);
+    //pc.printf("inputPID = \t\t%f\n\n",inputPID);
+    
+    //pc.printf("%d\t%d\n",Distance,direction);
+    //pc.printf("%d\t%d\t%d\t%d\n",ultrasonicVal[0],ultrasonicVal[1],ultrasonicVal[2],ultrasonicVal[3]);
+}
+
+void IrDistanceUpdate()
+{
+    for(uint8_t i = 0;i < 6;i++)
+    {
+        AnalogIn adcIn(adc_num[i]); /* 今回更新する赤外線の個体を呼び出す */
+        irDistance[i] = adcIn.read_u16() >> 4;
+        //pc.printf("%d\n",irDistance[0]);
+    }
+}
+
+
+void move(int vxx, int vyy, int vss)
+{
+    double motVal[MOT_NUM] = {0};
+    
+    motVal[0] = (double)(((0.5  * vxx) + ((sqrt(3.0) / 2.0) * vyy) + (Long * -vss)) * MOT1);
+    motVal[1] = (double)(((-0.5 * vxx) + ((sqrt(3.0) / 2.0) * vyy) + (Long *  vss)) * MOT2);
+    motVal[2] = (double)(((-0.5 * vxx) + ((sqrt(3.0) / 2.0) * vyy) + (Long * -vss)) * MOT3);
+    motVal[3] = (double)(((0.5  * vxx) + ((sqrt(3.0) / 2.0) * vyy) + (Long *  vss)) * MOT4);
+    
+    for(uint8_t i = 0 ; i < MOT_NUM ; i++){
+        if(motVal[i] > MAX_POW)motVal[i] = MAX_POW;
+        else if(motVal[i] < MIN_POW)motVal[i] = MIN_POW;
+        speed[i] = (int)motVal[i];
+    }
+}
+
+int vector(double Amp,double degree,int xy)
+{
+    double result; 
+
+    if(xy == X){
+        result = Amp * cos(degree * PI / 180.0);
+    }else if(xy == Y){
+        result = Amp * sin(degree * PI / 180.0) * (2.0 / sqrt(3.0));
+    }
+    
+    return (int)result;
+}
+
+/***********  Serial interrupt  ***********/
+
+void Tx_interrupt()
+{
+    array(speed[0],speed[1],speed[2],speed[3]);
+    driver.printf("%s",StringFIN.c_str());
+    //pc.printf("%s",StringFIN.c_str());
+}
+/*
+void Rx_interrupt()
+{
+    if(driver.readable()){
+        //pc.printf("%d\n",driver.getc());
+    }
+}*/
+
+
+/***********  Serial interrupt **********/
+
+
+void init()
+{
+    int scanfSuccess;
+    int printfSuccess;
+    int closeSuccess;
+    int close2Success;
+    uint8_t MissFlag = 0;
+    FILE *fp;
+    
+    compass.setOpMode(HMC6352_CONTINUOUS, 1, 20);
+    
+    StartButton.mode(PullUp);
+    CalibEnterButton.mode(PullUp);
+    CalibExitButton.mode(PullUp);
+    EEPROMButton.mode(PullUp);
+    
+    driver.baud(BAUD_RATE);
+    device2.baud(BAUD_RATE2);
+    wait_ms(MOTDRIVER_WAIT);
+    driver.printf("1F0002F0003F0004F000\r\n"); 
+    device2.printf("START");
+    
+    driver.attach(&Tx_interrupt, Serial::TxIrq);
+    //driver.attach(&Rx_interrupt, Serial::RxIrq);
+    device2.attach(&dev_rx,Serial::RxIrq);
+    device2.attach(&dev_tx,Serial::TxIrq);
+    
+    pid.setInputLimits(MINIMUM,MAXIMUM);
+    pid.setOutputLimits(-OUT_LIMIT, OUT_LIMIT);
+    pid.setBias(PID_BIAS);
+    pid.setMode(AUTO_MODE);
+    pid.setSetPoint(REFERENCE);
+    
+    irDistanceUpdata.attach(&IrDistanceUpdate, 0.1);
+    
+    Survtimer.start();
+    
+    mbedleds = 1;
+    
+    while(StartButton){
+        MissFlag = 0;
+        if(!CalibEnterButton){
+            mbedleds = 2;
+            compass.setCalibrationMode(ENTER);
+            while(CalibExitButton);
+            compass.setCalibrationMode(EXIT);
+            wait(BUT_WAIT);
+            mbedleds = 4;
+         }
+         
+         if(!EEPROMButton){
+            Survtimer.reset();
+            fp = fopen("/local/out.txt", "r");
+            if(fp == NULL){
+                wait(BUT_WAIT);
+                MissFlag = 1;
+            }else{
+                scanfSuccess = fscanf(fp, "%lf",&standard);
+                if(scanfSuccess == EOF){
+                    wait(BUT_WAIT);
+                    MissFlag = 1;
+                }else{
+                    closeSuccess = fclose(fp);
+                    if(closeSuccess == EOF){
+                        wait(BUT_WAIT);
+                        MissFlag = 1;
+                    }else{
+                        wait(BUT_WAIT);
+                    }
+                }
+            }
+            if((Survtimer.read() > (BUT_WAIT + 0.1)) || (MissFlag)){
+                for(uint8_t i = 0;i < 2;i++){
+                    mbedleds = 15;
+                    wait(0.1);
+                    mbedleds = 0;
+                    wait(0.1);
+                }
+                mbedleds = 15;
+            }else{
+                mbedleds = 8;
+            }
+         }
+         
+         if(!CalibExitButton){
+            Survtimer.reset();
+         
+            standard = compass.sample() / 10.0;
+            
+            fp = fopen("/local/out.txt", "w");
+            if(fp == NULL){
+                wait(BUT_WAIT);
+                MissFlag = 1;
+            }else{
+                printfSuccess = fprintf(fp, "%f",standard);
+                if(printfSuccess == EOF){
+                    wait(BUT_WAIT);
+                    MissFlag = 1;
+                }else{
+                    close2Success = fclose(fp);
+                    if(close2Success == EOF){
+                        wait(BUT_WAIT);
+                        MissFlag = 1;
+                    }else{
+                        wait(BUT_WAIT);
+                    }
+                }
+            }
+            if((Survtimer.read() > (BUT_WAIT + 0.2)) || (MissFlag)){
+                for(uint8_t i = 0;i < 4;i++){
+                    mbedleds = 15;
+                    wait(0.1);
+                    mbedleds = 0;
+                    wait(0.1);
+                }
+                mbedleds = 15;
+            }else{
+                mbedleds = 10;
+            }
+        }
+    }
+    
+    mbedleds = 0;
+    
+    Survtimer.stop();
+    
+    for(uint8_t i = 0;i < 6;i++)
+    {
+        stand[i] = irDistance[i];
+    }
+    irDistanceUpdata.detach();
+    
+    pidUpdata.attach(&PidUpdate, PID_CYCLE);
+    //irDistanceUpdata.attach(&IrDistanceUpdate, 0.1);
+    //timer1.start();
+}
+
+int main()
+{
+    int vx=0,vy=0,vs=0;
+    uint8_t whiteFlag = 0;
+    
+    init();
+           
+    while(1){
+        whiteFlag = 0;
+        hold_flag = 0;
+        vx = 0;
+        vy = 0;
+        vs = (int)compassPID;
+        //vs = 0;
+        
+        //move(vx,vy,vs);
+        
+        /*********************************************************************************************************
+        **********************************************************************************************************
+        ********************Change state *************************************************************************
+        **********************************************************************************************************
+        *********************************************************************************************************/
+        for(uint8_t i = 2;i < 6;i++)
+        {
+            AnalogIn adcIn(adc_num[i]); /* 今回更新する赤外線の個体を呼び出す */
+            irDistance[i] = ((adcIn.read_u16() >> 4) - stand[i]);
+            if(irDistance[i] >= 100)
+            {
+                whiteFlag = 1;
+            }
+            //pc.printf("%d\n",irDistance[0]);
+        }
+        
+        if(lineState == NORMAL){
+            if((LEFT_SONIC < 350) && (whiteFlag)){
+                lineState = LEFT_OUT;
+            }else if((RIGHT_SONIC < 350) && (whiteFlag)){    
+                lineState = RIGHT_OUT;         
+            }else if((FRONT_SONIC < 400) && (whiteFlag)){
+                lineState = FRONT_OUT;
+            }else if((BACK_SONIC < 400) && (whiteFlag)){
+                lineState = BACK_OUT;
+            }
+        }else if(lineState == LEFT_OUT){
+            if((LEFT_SONIC > 450) && (!whiteFlag)){
+                lineState = NORMAL;
+            }
+        }else if(lineState == RIGHT_OUT){
+            if((RIGHT_SONIC > 450) && (!whiteFlag)){
+                lineState = NORMAL;
+            }
+        }else if(lineState == FRONT_OUT){
+            if((FRONT_SONIC > 500) && (!whiteFlag)){
+                lineState = NORMAL;
+            }
+        }else if(lineState == BACK_OUT){
+            if((BACK_SONIC > 500) && (!whiteFlag)){
+                lineState = NORMAL;
+            }
+        }
+        
+        
+        if(state == HOLD){
+            if(FRONT_SONIC < 100)hold_flag = 1;
+            
+            if(Distance > 140){ //審判のボール持ち上げ判定
+                state = HOME_WAIT;
+            }else if(!((direction == 0) || (direction == 15) || (direction == 1) || (direction == 14) || (direction == 2))){//ボールを見失った
+                state = DIFFENCE;
+            }else if(!(Distance <= 40)){//ボールを見失った
+                state = DIFFENCE;
+            }
+        }else{
+            standTu = 0;
+            if(state == DIFFENCE){
+                if((direction == 0) && (Distance <= 20) && (IR_found) && (!xbee)){
+                    state = HOLD;
+                }else if((Distance < 180) && (IR_found) && (!xbee)){
+                    state = DIFFENCE;
+                }else{
+                    if((direction == 4) || (direction == 6) || (direction == 8) || (direction == 10)|| (direction == 12)){
+                        if((IR_found) && (!xbee)){
+                            state = DIFFENCE;
+                        }
+                    }else if((diff > 15) && (!xbee) && (IR_found)){
+                         state = DIFFENCE;
+                    }else{
+                        state = HOME_WAIT;
+                    }
+                }
+                
+            }else{  
+                if((direction == 0) && (Distance <= 30) && (IR_found) && (!xbee)){
+                    state = HOLD;
+                }else if((Distance <= 150) && (IR_found) && (!xbee)){
+                    state = DIFFENCE;
+                }else{
+                    if((direction == 4) || (direction == 6) || (direction == 8) || (direction == 10)|| (direction == 12)){
+                        if((IR_found) && (!xbee)){
+                            state = DIFFENCE;
+                        }       
+                    }else if((diff > 15) && (!xbee) && (IR_found)){
+                         state = DIFFENCE;
+                    }else{
+                        state = HOME_WAIT;
+                    }
+                }
+            }
+        }
+        /**/
+        /*********************************************************************************************************
+        **********************************************************************************************************
+        ********************Change state *************************************************************************
+        **********************************************************************************************************
+        *********************************************************************************************************/
+        
+        //state = HOME_WAIT;
+        if(state == HOME_WAIT){
+            mbedleds = 1;
+            /*
+            if(((RIGHT_SONIC + LEFT_SONIC) < 1100.0) && ((RIGHT_SONIC + LEFT_SONIC) > 850.0)){
+                if((LEFT_SONIC > 425.0) && (RIGHT_SONIC > 425.0)){
+                    vx = 0;
+                }else if(RIGHT_SONIC < 425.0){
+                    vx = (int)((RIGHT_SONIC - 425.0) * 0.02 - 10.0);
+                    if(vx < -15)vx = -15;
+                }else if(LEFT_SONIC < 425.0){
+                    vx = (int)((425.0 - LEFT_SONIC ) * 0.02 + 10.0);
+                    if(vx > 15)vx = 15;
+                }
+                
+                if((RIGHT_SONIC < 330.0) || (LEFT_SONIC < 330.0)){
+                    if((BACK_SONIC > 15.0) && (BACK_SONIC < 45.0)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 15.0) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (30.0 - BACK_SONIC) - 4);
+                        if(vy < -10)vy = -10;
+                    }
+                }else{
+                    if((BACK_SONIC > 95.0) && (BACK_SONIC < 125.0)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 95.0) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (110.0 - BACK_SONIC) - 4);
+                        if(vy < -10)vy = -10;
+                    }
+                }
+            }else if((RIGHT_SONIC + LEFT_SONIC) <= 850.0){
+                if(BACK_SONIC < 200.0){
+                    if(RIGHT_SONIC > LEFT_SONIC){
+                        vx = 15;
+                        vy = 5;
+                    }else{
+                        vx = -15;
+                        vy = 5;
+                    }
+                }else{
+                    vx = 0;
+                    vy = -10;
+                }
+            }else{
+                if(BACK_SONIC > 500.0){
+                    if(RIGHT_SONIC > LEFT_SONIC){
+                        vx = 10;
+                        vy = -10;
+                    }else{                    
+                        vx = -10;
+                        vy = -10;
+                    }
+                }
+            }
+            */
+        }else if(state == DIFFENCE){
+            mbedleds = 4;
+            if((direction == 6) || (direction == 4)){
+                vx = 20;
+            
+                if(LEFT_SONIC < 500){
+                    if((BACK_SONIC > 370) && (BACK_SONIC < 400)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 370) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (400.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }else if(RIGHT_SONIC < 500){
+                    vx = 15;
+                    vy = -10;
+                }else{
+                    if((BACK_SONIC > 70) && (BACK_SONIC < 100)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 70) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (100.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }
+            }else if((direction == 10) || (direction == 12)){
+                 vx = -20;
+            
+                if(RIGHT_SONIC < 500){
+                    if((BACK_SONIC > 370) && (BACK_SONIC < 400)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 370) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (400.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }else if(LEFT_SONIC < 500){
+                    vx = -15;
+                    vy = -10;
+                }else{
+                    if((BACK_SONIC > 70) && (BACK_SONIC < 100)){
+                        vy = 0;
+                    }else if((BACK_SONIC <= 70) || (BACK_SONIC == PING_ERROR)){
+                        vy = 5;
+                    }else{
+                        vy = (int)(0.015 * (100.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }
+                
+            }else if(direction == 8){
+            
+                if(LEFT_SONIC > RIGHT_SONIC){
+                    vx = -20;
+                }else{
+                    vx = 20;
+                }
+                if((RIGHT_SONIC < 500) || (LEFT_SONIC < 500)){
+                    if(BACK_SONIC < 500){
+                        vy = -4;
+                    }else{
+                        vy = (int)(0.015 * (500.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }else{
+                    if(BACK_SONIC < 200){
+                        vy = -4;
+                    }else{
+                        vy = (int)(0.015 * (200.0 - BACK_SONIC) - 4);
+                        if(vy < -15)vy = -15;
+                    }
+                }
+                
+            }else if(direction == 2){
+                
+                vx = 25;
+                vy = 0;     //0
+                
+            }else if(direction == 14){
+                
+                vx = -25;
+                vy = 0;    //-4 
+                
+            }else if(direction == 1){
+            
+                
+                vx = 20;
+                vy = 0;     //0
+                
+                
+            }else if(direction == 15){
+            
+                vx = -20;
+                vy = 0;    //-3
+               
+            }else if(direction == 0){
+            
+                vx = 0;
+                vy = 20;
+                
+            }else{//error
+            
+                vx = 0;
+                vy = 0;
+            
+            }
+        }else if(state == HOLD){
+            mbedleds = 15;
+            
+            vy = 20;
+            
+            if(((RIGHT_SONIC + LEFT_SONIC) < 1800.0) && ((RIGHT_SONIC + LEFT_SONIC) > 1400.0)){
+                standTu = (RIGHT_SONIC - LEFT_SONIC) / 25.0;
+            }
+        }
+        
+        if(lineState == NORMAL){
+            //mbedleds = 1;
+           
+        }else if(lineState == LEFT_OUT){
+            //mbedleds = 2;
+            
+            vx = 30;
+        }else if(lineState == RIGHT_OUT){
+            //mbedleds = 4;
+            
+            vx = -30;
+        }else if(lineState == FRONT_OUT){
+            //mbedleds = 8;
+            
+            vy = -40;
+        }else if(lineState == BACK_OUT){
+            //mbedleds = 12;
+            
+            vy = 40;
+        }
+        //vx = vector(10,45,X);
+        //vy = vector(10,45,Y);
+        //vx = 40;
+        //vy = 0;
+        //pc.printf("%d\t%d\n",vx,vy);
+        
+        //vy = -3;
+        //vs = 0;
+        //vx = 0; 
+        //vx = 10;
+        //vx = 25;
+        //vy = 0;
+        
+        move(vx,vy,vs);
+    }
+}
\ No newline at end of file