base versi 1 motherboard prototype

Dependencies:   Motor NewTextLCD PID mbed

main.cpp

Committer:
rizqicahyo
Date:
2015-12-19
Revision:
2:23fe981b6ef7
Parent:
1:33203568631b

File content as of revision 2:23fe981b6ef7:

/*********************************************************************************************/
/** GARUDAGO-ITB (KRAI2016)                                                                 **/
/** #ROADTOBANGKOK!                                                                         **/
/**                                                                                         **/
/** MAIN PROGRAM ROBOT HYBRID SEMI OTOMATIS                                                 **/
/**                                                                                         **/
/**                                                                                         **/
/** Created by :                                                                            **/
/** Rizqi Cahyo Yuwono                                                                      **/
/** EL'14 - 13214090                                                                        **/
/**                                                                                         **/
/** Last Update : 19 Desember 2015, 06.10 WIB                                               **/
/*********************************************************************************************/

/*********************************************************************************************/
/**     FILE HEADER                                                                         **/
/*********************************************************************************************/
#include "mbed.h"
#include "Motor.h"
#include "NewTextLCD.h"
#include "PS3_USB.h"
#include "PID.h"


/*********************************************************************************************/
/**     DEKLARASI INPUT OUTPUT                                                              **/
/*********************************************************************************************/
// serial pc
Serial pc(USBTX,USBRX);

// LCD 20x4
TextLCD lcd(PB_13, PB_14, PB_15, PB_1, PB_2, PB_5, TextLCD::LCD20x4); //rs,e,d4-d7

// joystick PS3
PS3_USB PS3 (PA_11,PA_12); //(rx,tx)

// PID sensor garis 
PID PID(0.532,0.000,0.41,0.001); //(P,I,D, time sampling)

// Motor
Motor motor_kiri (PA_15, PA_14, PA_13); //motor1 (pwm, fwd, rev)
Motor motor_kanan (PA_1, PC_14 ,PC_15); //motor2 (pwm, fwd, rev)

// Selektor dan Sensor
BusOut selektor(PB_0,PA_9,PC_2); //(selektor A, selektor B, selektor C)
AnalogIn sensorR (PC_0); //ADC1    
AnalogIn sensorL(PC_3); //ADC2

// Multitasker
Ticker timer;


/*********************************************************************************************/
/**     DEKLARASI VARIABEL GLOBAL                                                           **/
/*********************************************************************************************/
float gLimit=0.4; //nilai batas sensor agar dapat membedakan warna putih dengan background
float gMax_speed=0.5; //nilai maksimum kecepatan motor
float gMin_speed=-0.05;  //nilai minimum kecepatan motor

unsigned char gMode=0;  //variabel mode driving (manual = 0 otomatis = 1)
unsigned char gCase=0;  //variabel keadaan proses

unsigned char logic_sensor[16]; //variabel logic dari sensor garis
unsigned char over=0;

unsigned char i; // variabel iterasi


  
/*********************************************************************************************/
/**     DEKLARASI PROSEDUR DAN FUNGSI                                                        **/
/*********************************************************************************************/      
float adcSensor(int i)  //pembacaan nilai ADC dari sensor garis
{
    if (i < 8)
    {
        selektor = 7-i;
        return sensorL.read();
    }
    else
    {
        selektor = 15-i;
        return sensorR.read();
    }
}

void PIDrunning()   //menjalankan perintah untuk line follower
{  
    
    int pv;
    float speedR,speedL;
    
    //menentukan logic sensor
    for(i=1;i<16;i++){
        if(adcSensor(i) <= gLimit)
            logic_sensor[i]=1;
        else
            logic_sensor[i]=0;
    }
    
    //////////////////logic dari PV (present Value)/////////////////////////
    if(logic_sensor[0]==1){
        pv = -15;
        over=1;
    }
    else if(logic_sensor[15]==1){
        pv = 15;
        over=2;
    }
    else if(logic_sensor[1]==1 && logic_sensor[0]==1){
        pv = -14;
    }
    else if(logic_sensor[14]==1 && logic_sensor[15]==1){
        pv = 14;
    }
    else if(logic_sensor[1]==1 ){
        pv = -13;
    }
    else if(logic_sensor[14]==1 ){
        pv = 13;
    }
    else if(logic_sensor[2]==1 && logic_sensor[1]==1){
        pv = -12;
    }
    else if(logic_sensor[13]==1 && logic_sensor[14]==1){
        pv = 12;
    }
    else if(logic_sensor[2]==1 ){
        pv = -11;
    }
    else if(logic_sensor[13]==1 ){
        pv = 11;
    }
    else if(logic_sensor[3]==1 && logic_sensor[2]==1){
        pv = -10;
    }
    else if(logic_sensor[12]==1 && logic_sensor[13]==1){
        pv = 10;
    }
    else if(logic_sensor[3]==1 ){
        pv = -9;
    }
    else if(logic_sensor[12]==1 ){
        pv = 9;
    }
    else if(logic_sensor[4]==1 && logic_sensor[3]==1){
        pv = -8;
    }
    else if(logic_sensor[11]==1 && logic_sensor[12]==1){
        pv = 8;
    }
    else if(logic_sensor[4]==1 ){
        pv = -7;
    }
    else if(logic_sensor[11]==1 ){
        pv = 7;
    }
    else if(logic_sensor[5]==1 && logic_sensor[4]==1){
        pv = -6;
    }
    else if(logic_sensor[10]==1 && logic_sensor[11]==1){
        pv = 6;
    }
    else if(logic_sensor[5]==1 ){
        pv = -5;
    }
    else if(logic_sensor[10]==1 ){
        pv = 5;  
    }
    else if(logic_sensor[6]==1 && logic_sensor[5]==1){
        pv = -4;
    }
    else if(logic_sensor[9]==1 && logic_sensor[10]==1){
        pv = 4;
    }
    else if(logic_sensor[6]==1 ){
        pv = -3;
    }
    else if(logic_sensor[9]==1 ){
        pv = 3;
    }
    else if(logic_sensor[7]==1 && logic_sensor[6]==1){
        pv = -2;
    }  
     else if(logic_sensor[8]==1 && logic_sensor[9]==1){
        pv = 2;
    }
    else if (logic_sensor[7]==1 && logic_sensor[8]==1){
        pv = 0;
    }
    else if(logic_sensor[7]==1 ){
        pv = -1;    
    }
    else if(logic_sensor[8]==1 ){
        pv = 1;
    }  
    ///////////////// robot bergerak keluar dari sensor/////////////////////
        if(over=1){
            /*if(speed_ka > 0){
                wait_ms(10);
                motor_kanan.speed(-speed_ka);
                wait_ms(10);
                }
            else{
                motor_kanan.speed(speed_ka);
                }
            wait_ms(10);*/
            
            motor_kiri.brake(1);
            //wait_ms(100);
            
        }
        else if(over==2){
            /*if(speed_ki > 0){
                wait_ms(10);
                motor_kiri.speed(-speed_ki);
                wait_ms(10);
                }
            else{
                wait_ms(10);
                motor_kiri.speed(speed_ki);
                wait_ms(10);
                }
            wait_ms(10);*/
            motor_kanan.brake(1);
            //wait_ms(100);
        }
    
    PID.setProcessValue(pv);
    PID.setSetPoint(0);
    
    // memulai perhitungan PID

    speedR = gMax_speed + PID.compute();
    if(speedR > gMax_speed){
        speedR = gMax_speed;
        }
    else if(speedR < gMin_speed)
        speedR = gMin_speed;
    motor_kanan.speed(speedR);

    speedL = gMax_speed - PID.compute();
    if(speedL > gMax_speed)
        speedL = gMax_speed;
    else if(speedL < gMin_speed)
        speedL = gMin_speed;
    motor_kiri.speed(speedL);
    
    over=0;
}

void showLCD()  //menampilkan user interface pada LCD
{   
    lcd.cls();
    lcd.locate(5,0);
    lcd.printf("GarudaGo !!");
    
    switch(gCase)
    {
        case 0 :
        {
            lcd.locate(1,1);
            lcd.printf("Kalibrasi = %.4f",gLimit);
            break;
        }
        case 1 :
        {   
            if (gMode == 1)
            {
                lcd.locate(3,1);
                lcd.printf("Mode = Otomatis");
            }
            else if (gMode==0)
            {
                lcd.locate(3,1);
                lcd.printf("Mode = Manual");
            }
            break;
        }
    }
    
    for(i=0;i<16;i++){
        if(adcSensor(i) <= gLimit)
            logic_sensor[i]=1;
        else
            logic_sensor[i]=0;    
        lcd.locate(i+2,3);
        lcd.printf("%d",logic_sensor[i]);
    }
}

void running()  //prosedur utama untuk kendali robot
{
    float speed=gMax_speed;
    float k=1;
    
    switch(gCase)
    {
        case 0 :
        {
            motor_kiri.brake(0);
            motor_kanan.brake(0);
            
            if(PS3.L2 == 0 && PS3.R2==255 && !PS3.R1 && !PS3.L1)
                gLimit += 0.00001;
            else if (PS3.L2 == 255 && PS3.R2==0 && !PS3.R1 && !PS3.L1)
                gLimit -= 0.00001;
            else if(PS3.L2 == 0 && PS3.R2==0 && PS3.R1 && !PS3.L1)
                gLimit += 0.0005;
            if(PS3.L2 == 0 && PS3.R2==0 && !PS3.R1 && PS3.L1)
                gLimit -= 0.0005;
            
            if (gLimit > 1.0)
                gLimit = 1.0;
            else if(gLimit < 0)
                gLimit = 0.0;
            
            if(PS3.START && PS3.L2 == 0 && PS3.R2 == 0 && !PS3.R1 && !PS3.L1)
                gCase++;

            break;   
        }
        case 1 : 
        {
            if (gMode == 1)
            {
                if (PS3.silang)
                {
                    PIDrunning();
                    pc.printf("PID \t %f \t ",PID.compute());
                    
                    for(i=0;i<16;i++)
                    {
                        pc.printf("%d ",logic_sensor[i]);
                    }
                    pc.printf("\n");
                }
                else if(!PS3.silang)
                {
                    motor_kiri.brake(0);
                    motor_kanan.brake(0);
                    pc.printf("PID stop \n");
                }
            }
            else if (gMode == 0)
            {
                if (PS3.atas && !PS3.bawah && !PS3.L1 && !PS3.R1) //maju
                {
                    if (speed < 0.1)
                        speed = 0.1;
                    else
                        speed += 0.005;
                    
                    if (speed >= gMax_speed)
                        speed = gMax_speed;  
                    
                    motor_kiri.speed(speed*k);
                    motor_kanan.speed(speed*k);
                    pc.printf("maju \n");
                }
                else if (!PS3.atas && PS3.bawah && !PS3.L1 && !PS3.R1) //mundur
                {
                    if (speed < 0.1)
                        speed = 0.1;
                    else
                        speed += 0.005;
                    
                    if (speed >= gMax_speed)
                        speed = gMax_speed;
                        
                    motor_kiri.speed(-speed*k);
                    motor_kanan.speed(-speed*k);
                    pc.printf("mundur \n");
                }
                else if (!PS3.atas && !PS3.bawah && PS3.L1 && !PS3.R1) //pivot kiri
                {
                    if (speed < 0.1)
                        speed = 0.1;
                    else
                        speed += 0.005;
                    
                    if (speed >= gMax_speed)
                        speed = gMax_speed;
                        
                    motor_kiri.speed(-speed*k*0.7);
                    motor_kanan.speed(speed*k*0.7);
                    pc.printf("piv kiri \n");
                }
                else if (!PS3.atas && !PS3.bawah && !PS3.L1 && PS3.R1) //pivot kanan
                {
                    if (speed < 0.1)
                        speed = 0.1;
                    else
                        speed += 0.005;
                    
                    if (speed >= gMax_speed)
                        speed = gMax_speed;
                        
                    motor_kiri.speed(speed*k*0.7);
                    motor_kanan.speed(-speed*k*0.7);
                    pc.printf("piv kanan \n");
                }
                else if (!PS3.atas && !PS3.bawah && !PS3.L1 && !PS3.R1)
                {
                    motor_kiri.brake(0);
                    motor_kanan.brake(0);
                    pc.printf("stop \n");
                }
                
               /*if(PS3.L2 == 255 && PS3.R2 == 0)
                    k=0.5;
                else if (PS3.L2 == 0 && PS3.R2 == 255)
                    k=2;
                else
                    k=1;*/
            }
            else
            {
                motor_kiri.brake(1);
                motor_kanan.brake(1);
                pc.printf("no PID no MANUAL \n");
            }
            
            if(PS3.SELECT && !PS3.START)
            {
                if (gMode==1)
                    gMode=0;
                else
                    gMode=1;
            }
        
            if(PS3.START && !PS3.SELECT)
                gCase--;
                
            break;
        }   
    }
}


/*********************************************************************************************/
/*********************************************************************************************/
/**     PROGRAM UTAMA                                                                       **/
/*********************************************************************************************/
/*********************************************************************************************/
int main(void){
    //inisialisasi joystick
    PS3.setup();
    
    //inisialisasi PID
    PID.setInputLimits(-15,15);
    PID.setOutputLimits(-1.0,1.0);
    PID.setMode(1.0);
    PID.setBias(0.0);
    PID.reset();
    
    // serial PC
    pc.baud(115200);
    
    //multitasking untuk menampilkan layar
    timer.attach(&showLCD,1);
    
    while(1){  
        PS3.idle();
        
        if(PS3.readable()) 
        {
           // Panggil fungsi pembacaan joystik
           PS3.baca_data();
           // Panggil fungsi pengolahan data joystik
           PS3.olah_data();
           //pc.printf("%2x %2x %2x %2x %3d %3d %3d %3d %3d %3d\n\r",PS3.button, PS3.RL, PS3.button_click, PS3.RL_click, PS3.R2, PS3.L2, PS3.RX, PS3.RY, PS3.LX, PS3.LY);
           running();  
        }
        else 
        {
           PS3.idle();
        }
    }
}