tunninglf beta2

Dependencies:   ESC Motor PID PS_PAD hadah mbed

Fork of Ultimate_Hybrid by KRAI 2016

main.cpp

Committer:
Najib_irvani
Date:
2016-04-22
Revision:
3:5f9fbb53c8d5
Parent:
2:df6c49846367

File content as of revision 3:5f9fbb53c8d5:

/*********************************************************************************************/
/**     FILE HEADER                                                                         **/
/*********************************************************************************************/
#include "mbed.h"
#include "Motor.h"
#include "PS_PAD.h"
#include "PID.h"
#include "esc.h"
#include "Servo.h"

/*********************************************************************************************/
/**     DEKLARASI INPUT OUTPUT                                                              **/
/*********************************************************************************************/
//serial
Serial pc(USBTX,USBRX);     //debug
Serial com(PA_0,PA_1);      //sensor

//joystick PS2
PS_PAD ps2(PB_15,PB_14,PB_13, PC_4); //(mosi, miso, sck, ss) 

//motor (PWM, forward, reverse)
Motor motor1(PA_8, PB_0, PC_15);
Motor motor2(PA_11, PA_6, PA_5);
//Motor motor4(PB_6, PA_7, PB_12);
Motor motor3(PA_9, PC_2, PC_3);
Motor motorS(PB_7, PA_14, PA_15);
Motor motorC1(PB_9, PA_12, PC_5);
Motor motorC2(PB_8, PB_1, PA_13);
Motor motor4(PA_10, PB_5, PB_4);

/* coba coba
//motor (PWM, forward, reverse)
Motor motor1(PA_8, PB_0, PC_15);
Motor motorC1(PA_11, PA_6, PA_5);
//Motor motor3(PB_6, PA_7, PB_12);
Motor motorC2(PA_9, PC_2, PC_3);
Motor motor4(PB_7, PA_14, PA_15);
Motor motor2(PB_9, PA_12, PC_5);
Motor motor3(PB_8, PB_1, PA_13);
Motor motorS(PA_10, PB_5, PB_4);
*/

//pnuematik
DigitalOut pnuematik1(PC_11);
DigitalOut pnuematik2(PC_10);
DigitalOut pnuematik3(PD_2);
DigitalOut pnuematik4(PC_12);

//Limit Switch
DigitalIn limit1(PC_13 ,PullUp);
DigitalIn limit2(PC_14 ,PullUp);
DigitalIn limit3(PC_1 ,PullUp);
DigitalIn limit4(PC_0 ,PullUp);

//PID line follower(P, I, D, Time Sampling)
PID PID(0.32,0.000,0.1,0.001);

//servo(PWM)
Servo servoEDF(PC_8);

//EDF(PWM, timer)
ESC edf(PC_6,20);

//Timer Pnuematik
//Timer timer;



/*********************************************************************************************/
/**     DEKLARASI VARIABEL, PROSEDUR, DAN FUNGSI                                                       **/
/*********************************************************************************************/ 
const float gMax_speed = 0.8;
const float gMin_speed = 0.1;
/*const float tuning1 = 0.0;
const float tuning2 = 0.2;
const float tuning3 = 0.06;
const float tuning4 = 0.24;*/
const float v0 = 0.35;
const float ax = 0.0006;

const float tuning1 = 0.0;
const float tuning2 = 0.04;
const float tuning3 = 0.0;
const float tuning4 = 0.04;


float vcurr = v0;

// inisialisasi pwm awal servo
double pwm = 0.00;
 
// inisialisasi sudut awal
double sudut = -85;

// variabel kondisi pnuematik
int g = 1;

//slider auto
int c =0;  
int batas_delay = 270;

//data sensor garis dan line following
int datasensor[6];
int g_flag;

///////
void aktuator();
void edf_servo();
void init_sensor();
void line(float speed);

void majulf(float i, float j, float k, float l);
void kirilf(float e, float f, float g, float h);
void kananlf(float a, float b, float c, float d);

/*********************************************************************************************/
/*********************************************************************************************/
/**     PROGRAM UTAMA                                                                       **/
/*********************************************************************************************/
/*********************************************************************************************/ 
int main() {
    //inisiasi serial
    pc.baud(115200);
    com.baud(115200);
    
    //inisiasi joystick
    ps2.init();
    
    //set inisiasi servo pada posisi 0 
    servoEDF.position(sudut);

    //set edf pada posisi bukan kalibrasi, yaitu set edf 0
    edf.setThrottle(0);
    edf.pulse();
    
    //inisiasi pnuematik
    pnuematik1 = 1;
    pnuematik2 = 1;
    pnuematik3 = 1;
    pnuematik4 = 1;
    
    //inisiasi PID sensor    
    PID.setInputLimits(-15,15);
    PID.setOutputLimits(-1.0,1.0);
    PID.setMode(1.0);
    PID.setBias(0.0);
    PID.reset();
    
    //inisisasi TIMER
    //timer.start();
    
    //kondisi robot
    bool manual=true; 
    
    while(1)
    {
        ps2.poll();
        init_sensor();
        
        if(ps2.read(PS_PAD::PAD_X)==1){    
            line(0.35);
        }
        else{
            motor1.brake(1);
            motor2.brake(1);
            motor3.brake(1);
            motor4.brake(1);
            
            //v =0.1;
        }
            for(int i=0; i<6; i++){
                pc.printf("%d  ",datasensor[i]);
            }
            pc.printf("\n");

    }
    
    while(manual){
        
        ps2.poll();
        
        aktuator();
        edf_servo();
        
        if(limit3==0)    manual = false;
        
    }
    /*
    while(1){
        kananlf(0.1,0.1,0.1,0.1);
        wait_ms(3000);
        motor1.brake(1);
        motor2.brake(1);
        motor3.brake(1);
        motor4.brake(1);
        wait_ms(3000);
        kirilf(0.1,0.1,0.1,0.1);
        wait_ms(3000);
        motor1.brake(1);
        motor2.brake(1);
        motor3.brake(1);
        motor4.brake(1);
        wait_ms(3000);
        majulf(0.1,0.1,0.1,0.1);
        wait_ms(3000);   
        motor1.brake(1);
        motor2.brake(1);
        motor3.brake(1);
        motor4.brake(1);
        wait_ms(3000);
    }*/
    
    //bool lf = true;
    //int v_sensor;
    
    
    motor1.brake(1);
    motor2.brake(1);
    motor3.brake(1);
    motor4.brake(1);
    
    pnuematik1=0;
    wait_ms(1500);
    
    while(limit4!=0){
        motorC1.speed(1);
        motorC2.speed(-1);
    }
    
    motorC1.brake(1);
    motorC2.brake(1);
    
    pnuematik3 = 0;
    wait_ms(1500);
    pnuematik2 = 1;
    wait_ms(500);
    pnuematik3 = 1;
    
    return 0;
}

/*********************************************************************************************/
/**     ALGORITMA PROSEDUR DAN FUNGSI                                                       **/
/*********************************************************************************************/ 

void aktuator(){
    float speed = vcurr;
    
    if(vcurr >= gMax_speed)    vcurr = gMax_speed;
    
        if((ps2.read(PS_PAD::PAD_L1)==1) && (ps2.read(PS_PAD::PAD_R1)==0)){
            //pivot kiri                      
            motor2.speed((float)0.5*(speed-tuning2));
            motor4.speed((float)-0.5*(speed-tuning4));
            motor1.speed((float)0.5*(speed-tuning1));
            motor3.speed((float)-0.5*(speed-tuning3));
            pc.printf("pivot kiri \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_R1)==1) && (ps2.read(PS_PAD::PAD_L1)==0)){
            //pivot kanan                      
            motor2.speed((float)-0.5*(speed-tuning2));
            motor4.speed((float)0.5*(speed-tuning4));
            motor1.speed((float)-0.5*(speed-tuning1));
            motor3.speed((float)0.5*(speed-tuning3));
            pc.printf("pivot kanan \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_TOP)==1)){
            //serong atas kanan                      
            motor2.speed(speed-tuning2);
            motor4.brake(1);
            motor1.brake(1);
            motor3.speed(speed-tuning3);
            pc.printf("serong atas kanan \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_LEFT)==1)){
            //serong atas kiri                       
            motor2.brake(1);
            motor4.speed(-(speed-tuning4));
            motor1.speed(-(speed-tuning1));
            motor3.brake(1);
            pc.printf("serong atas kiri \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_LEFT)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==1)){
            //serong bawah kiri                     
            motor2.speed(-(speed-tuning2));
            motor4.brake(1);
            motor1.brake(1);
            motor3.speed(-(speed-tuning3));
            pc.printf("serong bawah kiri \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_RIGHT)==1)){
            //serong bawah kanan                     
            motor2.brake(1);
            motor4.speed(speed-tuning4);
            motor1.speed(speed-tuning1);
            motor3.brake(1);
            pc.printf("serong bawah kanan \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_TOP)==1) && (ps2.read(PS_PAD::PAD_BOTTOM)==0)){
            //maju
            motor1.speed(-(speed-tuning1));
            motor3.speed(speed-tuning3);
            motor2.speed(speed-tuning2);
            motor4.speed(-(speed-tuning4));
            pc.printf("maju \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_BOTTOM)==1) && (ps2.read(PS_PAD::PAD_TOP)==0)){
            //mundur     
            motor1.speed(speed-tuning1);
            motor3.speed(-(speed-tuning3));
            motor2.speed(-(speed-tuning2));
            motor4.speed(speed-tuning4);
            pc.printf("mundur \n");
            
            vcurr += ax;
        } 
        else if((ps2.read(PS_PAD::PAD_RIGHT)==1) && (ps2.read(PS_PAD::PAD_LEFT)==0)){
            //kanan                     
            motor2.speed(speed-tuning2);
            motor4.speed(speed-tuning4);
            motor1.speed(speed-tuning1);
            motor3.speed(speed-tuning3);
            pc.printf("kanan \n");
            
            vcurr += ax;
        }
        else if((ps2.read(PS_PAD::PAD_RIGHT)==0) && (ps2.read(PS_PAD::PAD_LEFT)==1)){
            //kiri                       
            motor2.speed(-(speed-tuning2));
            motor4.speed(-(speed-tuning4));
            motor1.speed(-(speed-tuning1));
            motor3.speed(-(speed-tuning3));
            pc.printf("kiri \n");
            
            vcurr += ax;
        }
        else{
            motor1.brake(1);
            motor3.brake(1);
            motor2.brake(1);
            motor4.brake(1);
            pc.printf("diam \n");
            
            vcurr = v0;
        }
        
        if((ps2.read(PS_PAD::PAD_CIRCLE)==0) && (ps2.read(PS_PAD::PAD_TRIANGLE)==1)){
            //POWER WINDOW ATAS
            motorS.speed(1);
            
            if (limit1 == 0){
                motorS.brake(1);
            }
            
            
            pc.printf("up \n");
            c++;
        }
        else if((ps2.read(PS_PAD::PAD_CIRCLE)==1) && (ps2.read(PS_PAD::PAD_TRIANGLE)==0)){
            //POWER WINDOW BAWAH        
            motorS.speed(-0.5);
            
            if (limit2 ==0){
                motorS.brake(1);
            }
            
            pc.printf("down \n");
            c--;        
        }
        else{
            motorS.brake(1);
            if ((c <= batas_delay) && (c>=-batas_delay)){
                c=0;
            }
            
            pc.printf("diam \n");
        }           
        if((c > batas_delay) && (limit1 == 0)){
            c = 0;
            motorS.brake(1);
        }
        else if((c < -batas_delay) && (limit2 == 0)){
            c = 0;
            motorS.brake(1);
        }
        else if( (c > batas_delay) && (limit1 != 0)){
            motorS.speed(1);
        }
        else if ((c<-batas_delay) && (limit2 != 0)){
            motorS.speed(-0.7);
        }
        
        
        if ((ps2.read(PS_PAD::PAD_SELECT)==1))
        {
            //mekanisme ambil gripper
            pc.printf("mekanisme gripper");
            if (g==1){
                pc.printf("ambil 1");
                pnuematik2 = 0;
                g=2;
                wait_ms(400);
            }
            else
            {
                pnuematik2 = 1;
                wait_ms(400);
                g=1;
            }
        }
}


void edf_servo(){
        if(ps2.read(PS_PAD::PAD_X)==1){
            //PWM ++
            pwm += 0.0007;
            if( pwm > 0.7)  pwm = 0.8;
            pc.printf("gaspol \n");
        }
        else if(ps2.read(PS_PAD::PAD_SQUARE)==1){
            //PWM--
            pwm -= 0.0007;
            
            if(pwm < 0)    pwm = 0.0;
            pc.printf("rem ndeng \n");
        }
        
        if(ps2.read(PS_PAD::PAD_R2)==1){
            //SERVO --
            sudut += 0.5;
            
            if(sudut > 90)  sudut = 90;
            pc.printf("servo max \n");
        }
        else if(ps2.read(PS_PAD::PAD_L2)==1){
            //SERVO ++
            sudut -= 0.5;
            
            if(sudut < -90) sudut = -90;
            pc.printf("servo min \n");
        }
        
        if(ps2.read(PS_PAD::PAD_START)==1){
            
            sudut = 0;
            pwm = 0.25;
        }
    
        servoEDF.position((float)sudut);
        edf.setThrottle((float)pwm);
        edf.pulse();
}

void init_sensor(){
    char data;
    if(com.readable()){  
        data = com.getc();
        
        for(int i=0; i<6; i++){
           datasensor[i] = (data >> i) & 1;
       }
    }
}

void line(float speed){    
    int pv;  
    float speed1,speed2,speed3,speed4;
         
        //////////////////logic dari PV (present Value)/////////////////////////
        if(datasensor[0]){
            pv = -5;
            over=1;
        }
        else if(datasensor[5]){
            pv = 5;
            over=2;
        }
        else if(datasensor[0] && datasensor[1]){
            pv = -3.5;
        }
        else if(datasensor[4] && datasensor[5]){
            pv = 3.5;
        }
        else if(datasensor[1]){
            pv = -2;
        }
        else if(datasensor[4]){
            pv = 2;
        }
        else if(datasensor[1] && datasensor[2]){
            pv = -1;
        }
        else if(datasensor[3] && datasensor[4]){
            pv = 1;
        }
        else if(datasensor[2]){
            pv = -0.5;
        }
        else if(datasensor[3]){
            pv = 0.5;
        }
        else if(datasensor[2] && datasensor[3]){
            pv = 0;
        }
        else
        {
            ///////////////// robot bergerak keluar dari sensor/////////////////////
            if(over==1){
                
                //motor1.brake(1);
                //motor4.brake(1);
                //wait_ms(100);
                
            }
            else if(over==2){
                
                //motor3.brake(1);
                //motor2.brake(1);
                //wait_ms(100);
            }
        } 
        /*
        if(pv > 1){
            //kanan
            speed1 = -(0.4-tuning1);
            speed2 = 0;
            speed3 = 0;
            speed4 = -(0.5-tuning4);   
            motor3.brake(1);
            motor2.brake(1);  
            motor1.speed(speed1);
            motor4.speed(speed4);  
        }
        else if(pv < -1){
            //kiri
            speed1 = 0;
            speed2 = -(0.4-tuning2);
            speed3 = -(0.4-tuning3);
            speed4 = 0;
            
            motor3.brake(1);
            motor2.speed(speed2);  
            motor1.speed(speed1);
            motor4.brake(1);
        }
        else{
            //gaspoll
            speed1 = -(0.7-tuning1);
            speed2 = -(0.7-tuning2);
            speed3 = -(0.7-tuning3);
            speed4 = -(0.7-tuning4);
            
            motor3.speed(speed3);
            motor2.speed(speed2);  
            motor1.speed(speed1);
            motor4.speed(speed4);
        } */
        PID.setProcessValue(pv);
        PID.setSetPoint(0);
        
        // memulai perhitungan PID
        //speed1 = speed - tuning1 + PID.compute();
        //speed2 = speed - tuning2 - PID.compute();
        //speed3 = speed - tuning3 - PID.compute();
        //speed4 = speed - tuning4 + PID.compute();
        
        speed1 = -0.74;
        speed2 = -0.74;
        speed3 = -0.8;
        speed4 = -0.8;

        /*if(speed1 > speed)      speed1 = speed;
        else if(speed1 < gMin_speed)    speed1 = gMin_speed;
        
        if(speed2 > speed)     speed2 = speed;
        else if(speed2 < gMin_speed)    speed2 = gMin_speed;
        
        if(speed3 > speed)      speed3 = speed;
        else if(speed3 < gMin_speed)    speed3 = gMin_speed;
        
        if(speed4 > speed)      speed4 = speed;
        else if(speed4 < gMin_speed)    speed4 = gMin_speed;
        */
        
        //motor3.speed(-speed3);
        //motor2.speed(-speed2);  
        //motor1.speed(-speed1);
        //motor4.speed(-speed4);
        
        motor3.speed(speed3);
        motor2.speed(speed2);  
        motor1.speed(speed1);
        motor4.speed(speed4);
}