a

Dependencies:   HMC6352 PID mbed

main.cpp

Committer:
akudohune
Date:
2013-04-19
Revision:
0:8215f0743d86

File content as of revision 0:8215f0743d86:

#include <math.h>
#include <sstream>
#include "mbed.h"
#include "HMC6352.h"
#include "PID.h"
#include "main.h"



void PidUpdata()
{    
    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());
    //pc.printf("compass.sample = %f\n",compass.sample() / 1.0);
    //pc.printf("%f\n",compassPID);
}

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] = motVal[i];
    }
    //pc.printf("%s",StringFIN.c_str());
}

/***********  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());
    //pc.printf("compass.sample = %f\n",compass.sample() / 1.0);
}
/*
void Rx_interrupt()
{
    if(driver.readable()){
        //pc.printf("%d\n",driver.getc());
    }
}*/


/***********  Serial interrupt end **********/


void init()
{
    uint8_t initFlag = 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);
    wait_ms(MOTDRIVER_WAIT);
    driver.printf("1F0002F0003F0004F000\r\n"); 
    device2.printf("START");
    
    device2.attach(&dev_rx,Serial::RxIrq);
    device2.attach(&dev_tx,Serial::TxIrq);
    
    led1 = ON;
    
    while(StartButton){
        if(!CalibEnterButton){
            led1 = OFF;
            led2 = ON;
            compass.setCalibrationMode(ENTER);
            while(CalibExitButton);
            compass.setCalibrationMode(EXIT);
            led2 = OFF;
            led3 = ON;
         }
         if(!EEPROMButton){
            led3 = OFF;
            led1 = OFF;
            led4 = ON;
            initFlag = 1;
            fp = fopen("/local/out.txt", "r");
            fscanf(fp, "%lf",&standard);
            fclose(fp);
         }
    }
    
    if(!initFlag){
        standard = compass.sample() / 10.0;
        fp = fopen("/local/out.txt", "w");
        fprintf(fp, "%f",standard);
        fclose(fp);
    }
    
    led1 = OFF;
    led3 = OFF;
    led4 = OFF;
    
    pid.setInputLimits(0.0, 360.0);
    pid.setOutputLimits(-OUT_LIMIT, OUT_LIMIT);
    pid.setBias(0.0);
    pid.setMode(AUTO_MODE);
    pid.setSetPoint(180.0);
    
    pidUpdata.attach(&PidUpdata, 0.06);
    wait_ms(500);       //danger
    driver.attach(&Tx_interrupt, Serial::TxIrq);
    //driver.attach(&Rx_interrupt, Serial::RxIrq);
    
    //timer1.start();
}

int main()
{
    int vx=0,vy=0,vs=0;
    uint8_t flag = 0;
    uint8_t comp_flag6 = 0;
    uint8_t comp_flag10 = 0;
    
    init();
           
    while(1){
        //pc.printf("compass.sample = %f\n",compass.sample() / 1.0);
        //wait(0.1);
        //pc.printf("%d\t,%d\n",direction,Distance);
        
        //pc.printf("%d\n",distance);
        
        vx = 0;
        vy = 0;
        vs = compassPID;
        
        /*************** Change state **************************/
        
        if((Distance <= 30) && (IR_found) && (!flag)){
            state = DIFFENCE;
        }else{
            if((direction == 4) || (direction == 6)|| (direction == 8) || (direction == 10)|| (direction == 12)){
                state = DIFFENCE;       
            }else if((Distance <= 120) && (IR_found) && (!flag)){
                state = WARNING;
            }else{
                state = HOME_WAIT;
            }
        }
        
        if((IR_found) && (!flag)){
            state = WARNING;
        }else{
            state = HOME_WAIT;
        }
            
        /*************** Change state **************************/
        
        
        if(state == HOME_WAIT){
            comp_flag6 = 0;
            comp_flag10 = 0;
            if(((RIGHT_SONIC + LEFT_SONIC) < 1050.0) && ((RIGHT_SONIC + LEFT_SONIC) > 600.0)){
                if((BACK_SONIC > 115.0) && (BACK_SONIC < 125.0)){
                    vy = 0;
                    flag = 0;
                }else if(BACK_SONIC <= 115.0){
                    vy = 3;
                }else if(BACK_SONIC == PING_ERROR){
                    vy = 5;
                }else{
                    vy = (int)(0.05 * (120.0 - BACK_SONIC) - 4);
                    if(vy < -30)vy = -30;
                }
                
                if((LEFT_SONIC > 450.0) && (RIGHT_SONIC > 450.0)){
                    vx = 0;
                }else if(RIGHT_SONIC < 450.0){
                    vx = (int)((RIGHT_SONIC - 450.0) / 15.0 - 10.0);
                    if(vx < -30)vx = -30;
                }else if(LEFT_SONIC < 450.0){
                    vx = (int)((450.0 - LEFT_SONIC ) / 15.0 + 10.0);
                    if(vx > 30)vx = 30;
                }
            }else if((RIGHT_SONIC + LEFT_SONIC) <= 600.0){
                if(BACK_SONIC < 100.0){
                    if(RIGHT_SONIC > LEFT_SONIC){
                        vx = 5;
                        vy = 10;
                    }else{
                        vx = -5;
                        vy = 10;
                    }
                }else if(BACK_SONIC < 200.0){
                     if(RIGHT_SONIC > LEFT_SONIC){
                        vx = 20;
                        vy = 0;
                    }else{
                        vx = -20;
                        vy = 0;
                    }
                }
            }else{
                if(BACK_SONIC > 500.0){
                    if(RIGHT_SONIC > LEFT_SONIC){
                        vx = 25;
                        vy = -10;
                    }else{                    
                        vx = -25;
                        vy = -10;
                    }
                }
            }
        }else if(state == DIFFENCE){
            if(direction == 6){
                comp_flag10 = 0;
                if(comp_flag6){
                    if(BACK_SONIC == PING_ERROR){
                        
                    }else if(BACK_SONIC > 50.0){
                        vy = -10;
                    }else{
                        
                    }
                    
                    if(LEFT_SONIC < 500.0){
                        vy = -20;
                    }else if(LEFT_SONIC == PING_ERROR){
                        vx = 20;
                    }else{
                        vx = 20;
                        vy = -20;
                    }
                }else{
                    if(BACK_SONIC < 110.0){
                        vy = 5;
                    }else  if(BACK_SONIC > 500.0){
                        vy = -20;
                    }else if(BACK_SONIC > 300.0){
                        vy = -10;
                    }else if(BACK_SONIC > 140.0){
                        vy = -5;
                    }else{
                        vy = 0;
                    }
                     
                    if(LEFT_SONIC < 700.0){
                        vx = 20;
                    }else{
                        if((RIGHT_SONIC < 150.0) || (RIGHT_SONIC == PING_ERROR)){
                            comp_flag6 = 1;
                        }else{
                            vx = 5;
                            vy = -15;
                        }
                    }
                }
            }else if(direction == 10){
                comp_flag6 = 0;
                if(comp_flag10){
                    if(BACK_SONIC == PING_ERROR){
                        
                    }else if(BACK_SONIC > 50.0){
                        vy = -10;
                    }else{
                        
                    }
                    
                    if(RIGHT_SONIC < 500.0){
                        vy = -20;
                    }else if(RIGHT_SONIC == PING_ERROR){
                        vx = -20;
                    }else{
                        vx = -20;
                        vy = -20;
                    }
                }else{
                
                    if(BACK_SONIC < 110.0){
                        vy = 5;
                    }else  if(BACK_SONIC > 500.0){
                        vy = -20;
                    }else if(BACK_SONIC > 300.0){
                        vy = -10;
                    }else if(BACK_SONIC > 140.0){
                        vy = -5;
                    }else{
                        vy = 0;
                    }
                     
                    if(RIGHT_SONIC < 700.0){
                        vx = -20;
                    }else{
                        if((LEFT_SONIC < 150.0) || (LEFT_SONIC == PING_ERROR)){
                            comp_flag10 = 1;
                        }else{
                            vx = -5;
                            vy = -15;
                        }
                    }
                }  
                
            }else if(direction == 4){
                comp_flag10 = 0;
                if(comp_flag6){
                    if(BACK_SONIC == PING_ERROR){
                        
                    }else if(BACK_SONIC > 50.0){
                        vy = -10;
                    }else{
                        
                    }
                
                    if(LEFT_SONIC < 500.0){
                        vy = -20;
                    }else if(LEFT_SONIC == PING_ERROR){
                        vx = 20;
                    }else{
                        vx = 20;
                        vy = -20;
                    }
                }else{
                    if(BACK_SONIC < 110.0){
                        vy = 5;
                    }else  if(BACK_SONIC > 500.0){
                        vy = -20;
                    }else if(BACK_SONIC > 300.0){
                        vy = -10;
                    }else if(BACK_SONIC > 140.0){
                        vy = -5;
                    }else{
                        vy = 0;
                    }
                     
                    if(LEFT_SONIC < 700.0){
                        vx = 20;
                    }else{
                        if((RIGHT_SONIC < 150.0) || (RIGHT_SONIC == PING_ERROR)){
                            comp_flag6 = 1;
                        }else{
                            vx = 5;
                            vy = -15;
                        }
                    }
                }
            }else if(direction == 12){
                comp_flag6 = 0;
                if(comp_flag10){
                    if(BACK_SONIC == PING_ERROR){
                        
                    }else if(BACK_SONIC > 50.0){
                        vy = -10;
                    }else{
                        
                    }
                    
                    if(RIGHT_SONIC < 500.0){
                        vy = -20;
                    }else if(RIGHT_SONIC == PING_ERROR){
                        vx = -20;
                    }else{
                        vx = -20;
                        vy = -20;
                    }
                }else{
                    if(BACK_SONIC < 110.0){
                        vy = 5;
                    }else  if(BACK_SONIC > 500.0){
                        vy = -20;
                    }else if(BACK_SONIC > 300.0){
                        vy = -10;
                    }else if(BACK_SONIC > 140.0){
                        vy = -5;
                    }else{
                        vy = 0;
                    }
                     
                    if(RIGHT_SONIC < 700.0){
                        vx = -20;
                    }else{
                        if((LEFT_SONIC < 150.0) || (LEFT_SONIC == PING_ERROR)){
                            comp_flag10 = 1;
                        }else{
                            vx = -5;
                            vy = -15;
                        }
                    }
                }
            }else if(direction == 8){
                if(comp_flag6){
                    vx = -15;
                    vy = -20;
                }else if(comp_flag10){
                    vx = 15;
                    vy = -20;
                }else{
                    if(LEFT_SONIC > RIGHT_SONIC){
                        vx = -15;
                        vy = -20;
                    }else{
                        vx = 15;
                        vy = -20;
                    }
                }
            }else if((direction == 2) || (direction == 1)){
                comp_flag6 = 0;
                comp_flag10 = 0;
                if((RIGHT_SONIC > 700.0) && (!(RIGHT_SONIC == PING_ERROR))){
                    vx = 30;
                }else{
                    vx = 20;
                }       
                if(BACK_SONIC > 140.0){
                    vy = -10;
                }else if(BACK_SONIC < 110.0){
                    vy = 5;
                }
            }else if((direction == 14) || (direction == 15)){
                comp_flag6 = 0;
                comp_flag10 = 0;
                if((LEFT_SONIC > 700.0) && (!(LEFT_SONIC == PING_ERROR))){
                    vx = -30;
                }else{
                    vx = -20;
                }       
                if(BACK_SONIC > 140.0){
                    vy = -10;
                }else if(BACK_SONIC < 110.0){
                    vy = 5;
                }
            }else if(direction == 0){
                comp_flag6 = 0;
                comp_flag10 = 0;
                vx = 0;
                vy = 20;
            }else{
                comp_flag6 = 0;
                comp_flag10 = 0;
                vx = 0;
                vy = 0;
            }
        }else if(state == WARNING){
            comp_flag6 = 0;
            comp_flag10 = 0;
            if(direction == 0){
                vx = 0;
            }else if(direction == 1){
                vx = 15;
            }else if(direction == 2){
                vx = 20;
            }else if(direction == 14){
                vx = -20;
            }else if(direction == 15){
                vx = -15;
            }
            
            if((LEFT_SONIC > 320) && (RIGHT_SONIC > 320)){
                if(BACK_SONIC > 150.0){
                    vy = -5;
                }else if(BACK_SONIC < 110.0){
                    vy = 5;
                }else{
                    vy = 0;
                }
            }else{
                if(BACK_SONIC > 110.0){
                    vy = -5;
                }else if(BACK_SONIC < 70.0){
                    vy = 5;
                }else{
                    vy = 0;
                }
            }
        }
        move(vx,vy,vs);
        
    }
}