v1

Dependencies:   ISR_Mini-explorer mbed ISR_Pixy_explorer

main.cpp

Committer:
Bisca
Date:
2017-07-05
Revision:
2:0dd04ad0ce1b
Parent:
1:a88edf25d893

File content as of revision 2:0dd04ad0ce1b:

#include "mbed.h"
#include "robot.h" // Inicializa o robô. Este include deverá ser usado em todos os main.cpp!
#include "Pixy.h"

Pixy pixy(Pixy::I2C,PTC11,PTC10);
Timer t;

int main() {
    initRobot();
    pixy.setAddress(0x21); //Camera Address 0x10
    
    
    int Speed = 0;
    int aux_Speed = 0;
    int Coef = 0;
    int aux_Coef = 0;
    int left_speed = 0;
    int left_Dir = 1;
    int right_speed = 0;
    int right_Dir = 1;
    
    int period = 20; //each loop takes 20ms
    //////////width PI controller
    int w_setpoint = 150;
    float w_Kp = 15;
    float w_Ki = 0.05; 
    int w_e = 0;
    int w_e2 = 0;
    int w_e_threshold = 25;
    int max_speed = 1000;
    
        //////////x PI controller
    int x_setpoint = 160;
    float x_Kp = 3;
    float x_Ki = 0.02; 
    int x_e = 0;
    int x_e2 = 0;
    int x_e_threshold = 30;
    int max_speed_rotation = 2000;

        //////////servo PI controller
    int y_control=0;
    int y_setpoint = 100;
    float y_Kp = 2;
    float y_Ki = 0.02; 
    int y_e = 0;
    int y_e2 = 0;
    int y_e_threshold = 10;
    int y_max = 2000;
        
        
    q_led_red_fro = 1;  //Led Red Front
    

    uint16_t Block_width = 0, Block_x = 0, Block_y = 0;
    uint16_t blocks;

    t.start();
    while(1) {        
        if(q_led_red_fro == 1){
            q_led_red_fro = 0;
        }else{
            q_led_red_fro = 1;
        }
                
        blocks = 0;
        blocks = (uint16_t) pixy.getBlocks();
        
        if (blocks > 0){
            Block_width = pixy.blocks[0].width;
            Block_x = pixy.blocks[0].x;
            Block_y = pixy.blocks[0].y;
        
            //Distance/Speed Control
            w_e2 = (w_setpoint - Block_width) - w_e;
            w_e = w_setpoint - Block_width;
            Speed = Speed+ int(w_Kp*w_e2) + int ((w_Ki*w_e*period));
            aux_Speed = Speed;
            if (abs(Speed) >max_speed)
            { 
                Speed = (int) max_speed *Speed/abs(Speed) ;
            }else if (abs(w_e) <w_e_threshold)
            {
                Speed = 0;
            }
            
            //x Control
            x_e2 = (x_setpoint - Block_x) - x_e;
            x_e = x_setpoint - Block_x;
            Coef = Coef+ int(x_Kp*x_e2) + int ((x_Ki*x_e*period));
            aux_Coef = Coef;
            if (abs(Coef) >max_speed_rotation)
            { 
                Coef =(int) max_speed_rotation*Coef/abs(Coef);
            }
            else if (abs(x_e) < x_e_threshold )
            {
                Coef = 0;
            }
            
            left_speed = Speed - Coef;
            if (abs(left_speed) >max_speed)
            { 
                left_speed =(int) max_speed*left_speed/abs(left_speed);
            }
            if (left_speed >0)
            {
                left_Dir=1;
                left_speed = abs(left_speed);
            }else{
                left_Dir=0;
                left_speed = abs(left_speed);
            }
            
            right_speed = Speed + Coef;        
                    if (abs(right_speed) >max_speed)
            { 
                right_speed =(int) max_speed*right_speed/abs(right_speed);
            }
            if (right_speed >0)
            {
                right_Dir=1;
                right_speed = abs(right_speed);
            }else{
                right_Dir=0;
                right_speed = abs(right_speed);
            }
            
            
            //y Control
            y_e2 = (y_setpoint - Block_y) - y_e;
            y_e = y_setpoint - Block_y;
            y_control = y_control+ int(y_Kp*y_e2) + int ((y_Ki*y_e*period));
            if (abs(y_control) >y_max)
            { 
                y_control =(int) y_max*y_control/abs(y_control);
            }
            
            pixy.setServos(0,500+y_control);

        
        }else{ //If no block received
            //Reset all linear speed variables
            w_e2 = 0;
            w_e = 0;
            Speed = 0;
            aux_Speed = 0;
            //Reset all angular speed variables
            x_e2 = 0;
            x_e = 0;
            Coef = 0;
            aux_Coef = 0;
            //Reset all servo speed variables
            y_e2 = 0;
            y_e = 0;

            
            
            left_Dir=0;
            left_speed = max_speed;
            right_Dir =1;
            right_speed = max_speed;
        }
        
        leftMotor(left_Dir,left_speed);
        rightMotor(right_Dir,right_speed);  
        
        while (t.read_ms () < period )
        { 
            //waste time
        }
        //pc.printf("Speed=%d , width=%d , w_e2=%d, w_e=%d \n",Speed , Block_width , w_e2 , w_e  );
        //pc.printf("Coef=%d , x=%d, x_e2=%d, x_e=%d  \n",Coef, Block_x , x_e2 , x_e );
        pc.printf("Coef=%d , x=%d, x_e2=%d, x_e=%d :: Speed=%d ,leftMotor=%d , rightMotor=%d \n",Coef, Block_x , x_e2 , x_e , Speed , left_speed , right_speed);

    
        t.reset();
    }
}