paling baru

Dependencies:   DigitDisplay Motor PID Ping mbed millis

Fork of MainProgram_BaseBaru_fix_omni_11April by KRAI 2017

main.cpp

Committer:
Sufa
Date:
2017-02-12
Revision:
29:7b372b0aaa61
Parent:
28:2d0746dc2d7d
Child:
30:d69cc27ac644

File content as of revision 29:7b372b0aaa61:

/****************************************************************************/
/*                  PROGRAM UNTUK PID CLOSED LOOP                           */
/*                                                                          */
/*  - Digunakan encoder autonics                                            */
/*  - Konfigurasi Motor dan Encoder sbb :                                   */
/*                      ______________________                              */
/*                     /                      \    Rode Depan Belakang:     */
/*                    /      2 (Belakang)      \   Omniwheel                */
/*                   |                          |                           */
/*                   | 3 (Encoder)            4 |  Roda Kiri Kanan:         */
/*                   |                          |  Fixed Wheel              */
/*                    \       1 (Depan)        /                            */
/*                     \______________________/    Putaran berlawanan arah  */
/*                                                 jarum jam positif        */
/*   SETTINGS (WAJIB!) :                                                    */
/*   1. Settings Pin Encoder, Resolusi, dan Tipe encoding di omniPos.h      */
/*   2. Deklarasi penggunaan library omniPos pada bagian deklarasi encoder  */
/*                                                                          */
/****************************************************************************/
/*                                                                          */
/*  Joystick                                                                */
/*  Kanan => Posisi target x ditambah 'perpindahan'                         */
/*  Kiri  => Posisi target x dikurang 'perpindahan'                         */
/*                                                                          */
/*  Tombol silang   => Kembali keposisi Awal                                */
/*  Tombol segitiga => Aktif motor Launcher                                 */
/*  Tombol lingkaran=> Aktif servo Launcher                                 */
/*  Tombol L1       => Pivot Kiri                                           */
/*  Tombol R1       => Pivot Kanan                                          */
/*  Tombol L3       => PWM Motor Belakang Dikurangi                         */
/*  Tombol R3       => PWM Motor Belakang Ditambah                          */
/*  Tombol L2       => PWM Motor Depan Dikurangi                            */
/*  Tombol R2       => PWM Motor Depan Ditambah                             */
/*                                                                          */
/*  Bismillahirahmanirrahim                                                 */
/*  Jagalah Kebersihan Kodingan                                             */
/****************************************************************************/

#include "mbed.h"
#include "JoystickPS3.h"
#include "Motor.h"
#include "Servo.h"
#include "encoderKRAI.h"
#include "millis.h"

/***********************************************/
/*          Konstanta dan Variabel             */
/***********************************************/
#define PI 3.14159265
#define D_ENCODER 10        // Diameter Roda Encoder
#define D_ROBOT 80          // Diameter Roda Robot
#define VMAX 0.3            // Kiri Kanan
#define PIVOT 0.4           // Pivka, Pivki
#define PERPINDAHAN 1       // Perpindahan ke kanan dan kiri

// Variable Atas
double speed,speed2, maxSpeed = 0.8, minSpeed = 0;
double kpA=0.6757, kdA=0.6757, kiA=0.00006757;
double p,i,d;
double p2,i2,d2;
double last_error = 0, current_error, sum_error = 0;
double last_error2 = 0, current_error2, sum_error2 = 0;
float rpm, target_rpm = 2.0;
float rpm2, target_rpm2 = 4.0;
 
// Variable Bawah
float Vt;
float k_enc     = PI*D_ENCODER;
float k_robot   = PI*D_ROBOT;
float speedT    = 0.2;
float vpid      = 0;
float pwmP      = 0.5;
float pwmT      = -0.95;


/* Deklarasi Encoder Base */
encoderKRAI encoderKiri(PC_4, PB_15, 2000, encoderKRAI::X2_ENCODING);   //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan

/* Deklarasi Encoder Launcher */
encoderKRAI encoderAtas( PC_10, PC_11, 28, encoderKRAI::X2_ENCODING);
encoderKRAI encoderAtas2( PD_2, PC_12, 28, encoderKRAI::X2_ENCODING);

/* Deklarasi Motor Base */
Motor motor1(PB_9, PA_12, PC_5);    // pwm, fwd, rev, Motor Depan
Motor motor2(PB_6, PB_1, PB_12);    // pwm, fwd, rev, Motor Belakang

/* Deklarasi Motor Launcher */
Motor motorL1(PA_8,PC_2,PC_1);    // pwm ,fwd, rev, Motor Launcher1
Motor motorL3(PA_10, PC_3, PC_0); // pwm, fwd, rev, Motor Launcher2 
Motor motorP(PB_7, PA_14, PA_15); // pwm, fwd, rev, Motor Powerscrew                

/* Deklarasi Penumatik Launcher */
DigitalOut pneumatik(PB_3, PullUp);

/*Dekalrasi Limit Switch */
DigitalIn limitA (PC_9, PullUp);
DigitalIn limitT(PB_10, PullUp);
DigitalIn limitB (PC_8, PullUp);

/**
 *  posX dan posY berdasarkan arah robot
 *  encoder Depan & Belakang sejajar sumbu Y
 *  encoder Kanan & Kirim sejajar sumbu X 
 **/

/* Variabel Encoder */
float errT, Tetha;                  // Variabel yang didapatkan encoder

/* Fungsi dan Procedur Encoder */
void setCenter();                   // Fungsi reset agar robot di tengah
float getTetha();                   // Fungsi mendapatkan jarak Tetha

/* Inisialisasi  Pin TX-RX Joystik dan PC */
joysticknucleo joystick(PA_0,PA_1);
Serial pc(USBTX,USBRX);

/* Deklarasi Variable Milis */
unsigned long int previousMillis = 0;
unsigned long int currentMillis;
unsigned long int previousMillis2 = 0;
unsigned long int currentMillis2;

/* Variabel Stick */
char case_ger;
bool launcher = false;
bool reload = false;

/****************************************************/
/*         Deklarasi Fungsi dan Procedure           */
/****************************************************/
void init_speed();
void speedKalibrasiMotor();
float pidBase(float Kp, float Ki, float Kd)
{
    int errorP;
    errorP = getTetha();
    return (float)Kp*errorP;    
}

int case_gerak(){
/****************************************************
 **  Gerak Motor Base
 **  Case 1  : Pivot kanan
 **  Case 2  : Pivot Kiri
 **  Case 3  : Kanan
 **  Case 4  : Kiri
 **  Case 5  : Break
 ****************************************************/ 
    
    int casegerak;
    if (!joystick.L1 && joystick.R1) {
        // Pivot Kanan
        casegerak = 1;
    } 
    else if (!joystick.R1 && joystick.L1) {
        // Pivot Kiri
        casegerak = 2;
    } 
    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(joystick.kanan)&&(!joystick.kiri))  {   
        // Kanan
        casegerak = 3;
//        pc.printf("kanan");
    } 
    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(joystick.kiri)) {   
        // Kiri
        casegerak = 4;
//        pc.printf("kiri");       
    } 
    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
        // Break
        casegerak = 5; 
    }
    return(casegerak);
}

void aktuator(){
/* Fungsi untuk menggerakkan Motor PowerScrew */
    // PowerScrew
    if (reload){
        if (!limitA){
            motorP.brake (1);
            wait_ms(1000);
        }
        else
        {
            motorP.speed(pwmP);
            if (!limitT)
            {
                while (limitB) 
                {
                    motorP.speed(pwmT);
                }
                motorP.brake(1);
                reload = !reload;
            }
        }
    }
    
/*Motor Atas*/
    if (launcher) {
        startMillis();
        currentMillis  = millis();
        currentMillis2 = millis();
        
        /*PID Launcher Depan*/
        if (currentMillis-previousMillis>=10)
        {
            rpm = (float)encoderAtas.getPulses();    
            current_error = target_rpm - rpm;
            sum_error = sum_error + current_error;
            p = current_error*kpA;
            d = (current_error-last_error)*kdA/10.0;
            i = sum_error*kiA*10.0;
            speed = p + d + i;
            init_speed();
            motorL1.speed(speed);
            last_error = current_error;
            encoderAtas.reset();
          //pc.printf("%.04lf\n",rpm);
            previousMillis = currentMillis;
        }
        else
        {
            encoderAtas.getPulses();
        }      
        if (currentMillis2-previousMillis2>=10)
        {
            rpm2 = (float)encoderAtas2.getPulses();    
            current_error2 = target_rpm2 - rpm2;
            sum_error2 = sum_error2 + current_error2;
            p2 = current_error2*kpA;
            d2 = (current_error2-last_error2)*kdA/10.0;
            i2 = sum_error2*kiA*10.0;
            speed2 = p2 + d2 + i2;
            init_speed();
            motorL3.speed(speed2);
            last_error2 = current_error2;
            encoderAtas2.reset();
          //pc.printf("%.04lf\n",rpm2);
            previousMillis2 = currentMillis2;
        }
        else
        {
            encoderAtas2.getPulses();
        }
    }
    else
    {
        motorL1.brake(1);
        motorL3.brake(1);
    }
    
    
    // MOTOR Bawah
    switch (case_ger) {
        case (1): {       
            // Pivot Kanan
            motor1.speed(PIVOT);
            motor2.speed(PIVOT);
            setCenter();
            break;
            }
        case (2): {
            // Pivot Kiri
            motor1.speed(-PIVOT);
            motor2.speed(-PIVOT);
            setCenter();
            break;
            }
        case (3) : {
            // Kanan
            //motor1.speed(-VMAX-vpid);
            //motor2.speed(0.2+vpid);
            motor1.speed(-0.365+pidBase(0.09,0,0));
            motor2.speed(0.46+pidBase(0.09,0,0));
            break;
            }
        case (4) : {
            // Kiri
            //motor1.speed(VMAX-vpid);
            //motor2.speed(-0.2+vpid);
            motor1.speed(0.365+pidBase(0.09,0,0));//belakang
            motor2.speed(-0.46+pidBase(0.09,0,0));//depan
            break;
            }
        default : {
            motor1.brake(1);
            motor2.brake(1);
            }   
    } // End Switch 
}

void setCenter(){
/* Fungsi untuk menentukan center dari robot */
    encoderKiri.reset();
}

float getTetha(){
/* Fungsi untuk mendapatkan nilai tetha */
    float busurKir, tetha;
    busurKir = ((encoderKiri.getPulses())/(float)(2000.0)*k_enc);
    tetha = busurKir/k_robot*360;
    
    return -(tetha);    
}

void speedKalibrasiMotor(){
/* Fungsi untuk speed launcher */
    if (joystick.R3_click and target_rpm < 14){
        target_rpm = target_rpm + 1; // RPM++ Motor Belakang
    }
    if (joystick.L3_click and target_rpm > 1){
        target_rpm = target_rpm - 1; // RPM-- Motor Belakang
    } 
    if (joystick.R2_click and target_rpm2 < 14){
        target_rpm2 = target_rpm2 + 1; // RPM++ Motor Depan
    }  
    if (joystick.L2_click and target_rpm2 > 1 ){
        target_rpm2 = target_rpm2 - 1; // RPM-- Motor Depan
    }
    // pc.printf("Rpm depan = %.4f\t  Rpm belakang = %.4f\n", target_rpm, target_rpm2);    
}

void init_speed (){
    if (speed>maxSpeed){
        speed = maxSpeed;
    }
    
    if (speed<minSpeed){
        speed = minSpeed;
    }
    if (speed2>maxSpeed){
        speed2 = maxSpeed;
    }
    
    if (speed2<minSpeed){
        speed2 = minSpeed;
    }
}  
/*********************************************************/
/*                  Main Function                        */
/*********************************************************/

int main (void){
    /* Set baud rate - 115200 */
    joystick.setup();
    pc.baud(115200);
    wait_ms(1000);
    setCenter();
    wait_ms(500);
    pc.printf("ready....");

    /* Untuk mendapatkan serial dari Arduino */
    while(1)
    {
        // Interrupt Serial
        joystick.idle();        
        //pc.printf("enco : %d \n",encoderKiri.getPulses());
        if(joystick.readable()) {
            // Panggil fungsi pembacaan joystik
            joystick.baca_data();
            // Panggil fungsi pengolahan data joystik
            joystick.olah_data();
            // Masuk ke case gerak
            case_ger = case_gerak();
            aktuator();
            if (joystick.segitiga_click){
                launcher = !launcher;
            }
            if (joystick.lingkaran_click){
                pneumatik = 0;
                wait_ms(1000);
                pneumatik = 1;
            }
            speedKalibrasiMotor();
            if (joystick.silang_click){
                reload = !reload;
            }  
        }
        else {
            joystick.idle();    
            motor1.brake(1);
            motor2.brake(1);
        }
    }
}