Update 18 Februari 2017, PID laucnher dan Base sudah diperbarui

Dependencies:   Motor PID Joystick_OrdoV5 mbed millis

Fork of MainProgram_BaseBaru_otomatis-reloader by KRAI 2017

Revision:
16:90119f03c5d1
Parent:
15:98f0d56b14f0
Child:
17:e4229d77a5ab
diff -r 98f0d56b14f0 -r 90119f03c5d1 main.cpp
--- a/main.cpp	Fri Dec 09 12:03:44 2016 +0000
+++ b/main.cpp	Tue Jan 24 12:34:29 2017 +0000
@@ -28,10 +28,10 @@
 /*  Tombol segitiga => Aktif motor Launcher                                 */
 /*  Tombol lingkaran=> Aktif servo Launcher                                 */
 /*  Tombol L3       => PWM Launcher dikurangin                              */
-/*  Tombol R3       => PWM Launcher ditambahin                                                                        */
+/*  Tombol R3       => PWM Launcher ditambahin                              */
 /*                                                                          */
-/*                                                                          */
-/*                                                                          */
+/*  Bismillahirahmanirrahim                                                 */
+/*  Jagalah Kebersihan kodingan                                             */
 /****************************************************************************/
 
 
@@ -39,209 +39,141 @@
 #include "JoystickPS3.h"
 #include "Motor.h"
 #include "Servo.h"
-
-//#define koefperlambatan 0.8
 #include "encoderKRAI.h"
 
-#define pi 22/7
-#define diaEncoder 0.058
-#define PPR 1000
-#define diaRobot 0.64
-#define pinservo1 PC_8
-//PC 9
-#define pinservo2 PC_9
-
-float K_enc = pi*diaEncoder;
-float K_robot = pi*diaRobot;
+/***********************************************/
+/*          Konstanta dan Variabel             */
+/***********************************************/
+#define PI 3.14159265
+#define D_ENCODER 0.058
+#define D_ROBOT 0.64
 
-float speed1=0.6;
-float speed2=0.6;
-float speed3=0.6;
-float speed4=0.6;
-float speedB=0.43 ;
-float speedL=0.4;
+float k_enc     = PI*D_ENCODER;
+float k_robot   = PI*D_ROBOT;
 
-float KpX=0.5, KpY=0.5, Kp_tetha=0.03;
-
-Timer waktu;
-//float jarakGlobalY;
+float speed1    =0.6;
+float speed2    =0.6;
+float speed3    =0.6;
+float speed4    =0.6;
+float speedB    =0.43;
+float speedL    =0.4;
 
-// Deklarasi variabel PID
-//PID PID(0.992,0.000,0.81,0.001); //(P,I,D, time sampling)
-/*
-// Deklarasi variabel encoder
-encoderKRAI encoderDepan( PB_14, PB_13, 2000, encoderKRAI::X2_ENCODING);   //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
-encoderKRAI encoderBelakang( PC_4, PB_15, 2000, encoderKRAI::X2_ENCODING);
-encoderKRAI encoderKanan( PD_2, PC_12, 720, encoderKRAI::X2_ENCODING);
-encoderKRAI encoderKiri( PC_11, PC_10, 2000, encoderKRAI::X2_ENCODING);
-*/
+float kpX=0.5, kpY=0.5, kp_tetha=0.03;
+
+/* Deklarasi encoder */
+encoderKRAI encoderDepan( PB_13, PB_14, 2000, encoderKRAI::X2_ENCODING);    //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
+encoderKRAI encoderBelakang( PC_11, PC_10, 2000, encoderKRAI::X2_ENCODING); //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
+encoderKRAI encoderKanan( PC_12, PD_2, 720, encoderKRAI::X2_ENCODING);      //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
+encoderKRAI encoderKiri( PC_4, PB_15, 2000, encoderKRAI::X2_ENCODING);      //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
 
-// Deklarasi variabel encoder
-encoderKRAI encoderDepan( PB_13, PB_14, 2000, encoderKRAI::X2_ENCODING);   //inA, inB, pin Indeks (NC = tak ada), resolusi, pembacaan
-encoderKRAI encoderBelakang( PC_11, PC_10, 2000, encoderKRAI::X2_ENCODING);
-encoderKRAI encoderKanan( PC_12, PD_2, 720, encoderKRAI::X2_ENCODING);
-encoderKRAI encoderKiri( PC_4, PB_15, 2000, encoderKRAI::X2_ENCODING);
+/* Deklarasi Motor Base */
+Motor motor1(PB_7, PA_14 , PA_15);  // pwm, fwd, rev
+Motor motor2(PB_8, PA_13 ,PB_0);    // pwm, fwd, rev
+Motor motor3(PB_9, PA_12 ,PC_5);    // pwm, fwd, rev
+Motor motor4(PB_6, PB_1 ,PB_12);    // pwm, fwd, rev
 
-// Deklarasi variabel motor
-Motor motor1(PB_7, PA_14 , PA_15); // pwm, fwd, rev
-Motor motor2(PB_8, PA_13 ,PB_0); // pwm, fwd, rev
-Motor motor3(PB_9, PA_12 ,PC_5); // pwm, fwd, rev
-Motor motor4(PB_6, PB_1 ,PB_12); // pwm, fwd, rev
+/* Deklarasi Motor Launcher */
+Motor motorld(PA_8, PC_1 , PC_2);   // pwm, fwd, rev
+Motor motorlb(PA_9, PA_4, PC_15 );  // pwm, fwd, rev
 
-//Motor Atas
-Motor motorld(PA_8, PC_1 , PC_2); // pwm, fwd, rev
-Motor motorlb(PA_9, PA_4, PC_15 ); // pwm, fwd, rev
-
-//Servo Atas
+/* Deklarasi Servo Launcher */
 Servo servoS(PB_2);
 Servo servoB(PA_5);
 
-// Deklarasi variabel posisi robot
-//robotPos posisi();
-
-// Inisialisasi  Pin TX-RX Joystik dan PC
-//Serial pc(PA_0,PA_1);
-//Serial pc(USBTX,USBRX);
-// Deklarasi Variabel Global
-/*
- * posX dan posY berdasarkan arah robot
- * encoder Depan & Belakang sejajar sumbu Y
- * encoder Kanan & Kiri sejajar sumbu X 
- */
-float jarak, posX, posY;
-//float keliling = pi*diameterRoda;
+/**
+ *  posX dan posY berdasarkan arah robot
+ *  encoder Depan & Belakang sejajar sumbu Y
+ *  encoder Kanan & Kiri sejajar sumbu X 
+ **/
 
-void detect_encoder(float speed);
-void setCenter();
-float getY();
-float getX();
-float getTetha();
+/* Variabel Encoder */
+float jarak, posX, posY;            // 
+float XT, YT, Tetha;                // Jarak Target Robot
+float errX, errY, errT, Vt, Vx, Vy; // Variabel yang didapatkan encoder
+float v1, v2, v3, v4;               // Variabel kecepatan motor dari encoder
 
-// Inisialisasi  Pin TX-RX Joystik dan PC
+/* Fungsi dan Procedur Encoder */
+void setCenter();                   // Fungsi reset agar robot di tengah
+float getY();                       // FUngsi mendapatkan jarak Y
+float getX();                       // FUngsi mendapatkan jarak X
+float getTetha();                   // FUngsi mendapatkan jarak Tetha
+
+/* Inisialisasi  Pin TX-RX Joystik dan PC */
 joysticknucleo joystick(PA_0,PA_1);
-Serial pc(USBTX,USBRX);
 
-// Posisi target
-float XT, YT, Tetha;
-
-//encoder variable
-float errX, errY, errT, Vt, Vx, Vy;
-float V1, V2, V3, V4;
-
-//bool perlambatan=0;
+/* Variabel Stick */
 char case_ger;
-bool maju=false,mundur=false,pivka=false,pivki=false,kiri=false,kanan=false,saka=false,saki=false,sbka=false,sbki=false,cw1=false,ccw1=false,cw2=false,ccw2=false,cw3=false,ccw3=false,analog=false;
-bool stop = true;
-bool Launcher = false,ServoGo = false;
-float jLX,jLY;
-double vcurr;
-float x,y; // untuk analoghat kiri
-float errorx=0,errory=0;
-
-// Fungsi mapping 0-255 ke -128 sampai 127
-float mapping(float a,float error)
-{   
-     float hasil,b;
-    b = (float)((a-128)/128);
-    if (b>(error - 0.2) && b<(error + 0.2))
-    {
-        hasil = 0;
-    } else {
-        hasil = b;
-        }
-    return (hasil);
-}
+bool launcher = false,servoGo = false;
 
-// Kalibrasi tombol analog kiri
-void kalibrasi()
-{
-    errorx = (jLX - 128)/128;
-    errory = (jLY - 128)/128;    
-
-}
-
-// simpan data analog
-void baca_analog()
-{
-        jLX = joystick.LX;
-        jLY = joystick.LY;
-        
-        // Pembacaan nilai Y terbalik
-        x = mapping(jLX,errorx);
-        y = -mapping(jLY,errory); 
-}
-
-// Gerak dari Motor base
-int case_gerak()
-{
+/***********************************************/
+/*         Deklarasi Fungsi dan Procedure      */
+/***********************************************/
+int case_gerak(){
+/*****************************************************
+ **  Gerak Motor Base
+ **  Case 1  : Pivot kanan
+ **  Case 2  : Pivot Kiri
+ **  Case 3  : Maju
+ **  Case 4  : Mundur
+ **  Case 5  : Serong Atas Kanan
+ **  Case 6  : Serong Bawah Kanan
+ **  Case 7  : Serong Atas Kiri
+ **  Case 8  : Serong Bawah Kiri
+ **  Case 9  : Kanan
+ **  Case 10 : Kiri
+ **  Case 12 : break
+ ****************************************************/ 
     int casegerak;
-    baca_analog();
-     if (!joystick.L1 && joystick.R1) {
+    if (!joystick.L1 && joystick.R1) {
         // Pivot Kanan
         casegerak = 1;
-    } else if (!joystick.R1 && joystick.L1) {
+    } 
+    else if (!joystick.R1 && joystick.L1) {
         // Pivot Kiri
         casegerak = 2;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
         // Maju
         casegerak = 3;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri))  {  
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri))  {  
         // Mundur
         casegerak = 4;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(!joystick.kiri)&&(joystick.kanan))   {   
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(!joystick.kiri)&&(joystick.kanan))   {   
         // Serong Atas Kanan
         casegerak = 5;
-    } else if((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(!joystick.kiri)&&(joystick.kanan)) {   
+    } 
+    else if((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(!joystick.kiri)&&(joystick.kanan)) {   
         // Serong Bawah Kanan
         casegerak = 6;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(joystick.kiri)&&(!joystick.kanan)) {   
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(joystick.atas)&&(!joystick.bawah)&&(joystick.kiri)&&(!joystick.kanan)) {   
         // Serong Atas Kiri
         casegerak = 7;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(joystick.kiri)&&(!joystick.kanan)) {   
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(joystick.kiri)&&(!joystick.kanan)) {   
         // Serong Bawah Kiri
         casegerak = 8;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(joystick.kanan)&&(!joystick.kiri))  {   
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(joystick.kanan)&&(!joystick.kiri))  {   
         // Kanan
         casegerak = 9;
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(joystick.kiri)) {   
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(joystick.kiri)) {   
         // Kiri
         casegerak = 10;        
-    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
-        // case gerak analog on off
-        if (analog){
-            casegerak = 11;
-        } else {
-            casegerak = 12;
-        }    
-}
+    } 
+    else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
+        casegerak = 12; 
+    }
     return(casegerak);
 }
 
-
-
-/**
-
-**  Case 1  : Pivot kanan
-**  Case 2  : Pivot Kiri
-**  Case 3  : Maju
-**  Case 4  : Mundur
-**  Case 5  : Serong Atas Kanan
-**  Case 6  : Serong Bawah Kanan
-**  Case 7  : Serong Atas Kiri
-**  Case 8  : Serong Bawah Kiri
-**  Case 9  : Kanan
-**  Case 10 : Kiri
-**  Case 11 : Analog
-**  Case 11 : break
-
-**/
-
-
-// Pergerakan dari base
-void aktuator()
-{
-    //Servo
-    if (ServoGo){
+void aktuator(){
+/* Fungsi untuk menggerakkan servo */
+    // Servo
+    if (servoGo){
         servoS.position(20);
         wait_ms(500);
         servoS.position(-28);
@@ -254,16 +186,15 @@
         }
         wait_ms(500);
         servoB.position(0);
-        ServoGo = false;
-        
-    }else{
+        servoGo = false;
+    }
+    else{
         servoS.position(20);
         servoB.position(0);
-    
     }
     
     // Motor Atas
-    if (Launcher) {
+    if (launcher) {
             motorld.speed(speedL);
             motorlb.speed(speedB);
     }else{
@@ -272,317 +203,201 @@
     }
     
     // MOTOR Bawah
-    switch (case_ger) 
-    {
-case (1): 
-        {       
-           Tetha = Tetha - 0.05;
-            pivka=true;         
-            maju=mundur=analog=kiri=kanan=saka=saki=sbka=sbki=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("pivKa  Xt =%.2f x=%.2f YT=%.2f y=%.2f errx=%.2f erry=%.2f \n",XT,x,YT,y,errX,errY);
-            
-         
+    switch (case_ger) {
+        case (1):{       
+            Tetha = Tetha - 0.05;
             break;
         }
-    case (2):
-           {
-             Tetha = Tetha + 0.05; 
-            
-            pivki=true; 
-            maju=mundur=kiri=analog=kanan=saka=saki=sbka=sbki=pivka=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("pivKi  Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
-         
-            break;
-           }
-    case (3):
-        {   
-           YT = YT + 0.01;
-            
-            maju=true;             
-            mundur=kiri=kanan=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-
-            //pc.printf("maju Xt =%.2f x=%.2f YT=%.2f y=%.2f  errx=%.2f erry=%.2f \n",XT,x,YT,y,errX,errY);
-
+        case (2):{
+            Tetha = Tetha + 0.05;     
             break;
         }
-    case (4):
-        { 
-            YT = YT - 0.01;
-
-            mundur=true; 
-            maju=kiri=kanan=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-
-            //pc.printf("mundur Xt =%.2f x=%.2f YT=%.2f y=%.2f errx=%.2f erry=%.2f \n",XT,x,YT,y,errX,errY);
-
-    
+        case (3):{   
+            YT = YT + 0.01;
             break;
         }
-    case (5) :
-        {   
-            XT = XT + 0.01;
-            YT = YT + 0.01;
-            
-            saka=true; 
-            maju=mundur=kiri=kanan=sbka=saki=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("saka Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
-            
+        case (4):{ 
+            YT = YT - 0.01;
             break;
         }
-    case (6) :
-        {   
-             XT = XT + 0.01;
-            YT = YT - 0.01;
-
-            
-            sbka=true; 
-            maju=mundur=kiri=kanan=saka=saki=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("sbka  Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-
-    
+        case (5) :{   
+            XT = XT + 0.01;
+            YT = YT + 0.01;     
             break;
         }
-    case (7) :
-        {   
-         XT = XT - 0.01;
-         YT = YT + 0.01;
-
-            
-            saki=true; 
-            maju=kiri=kanan=saka=mundur=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("saki Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
-    
+        case (6) :{   
+            XT = XT + 0.01;
+            YT = YT - 0.01;
             break;
         }
-    case (8) :
-        {   
-           XT = XT - 0.01;
-           YT = YT - 0.01;
-         
-            //pc.printf("sbki Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
-    
+        case (7) :{   
+            XT = XT - 0.01;
+            YT = YT + 0.01;
             break;
         }
-    case (9) :
-        {   
-            XT = XT + 0.01;
-            kanan=true; 
-            maju=kiri=mundur=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("Kanan Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
+        case (8) :{   
+            XT = XT - 0.01;
+            YT = YT - 0.01;
             break;
         }
-    case (10) :
-        {   
-          XT = XT - 0.01;
-            
-            kiri=true; 
-            maju=kanan=mundur=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("Kiri Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
-              
+        case (9) :{   
+            XT = XT + 0.01;
             break;
         }
-    case (11): 
-        {          
-                     
-         XT = XT + 0.01*x;
-         YT = YT + 0.01*y;
-                       
-            analog=true;
-            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            
-            //pc.printf("analog  Xt =%.2f x=%.2f YT=%.2f y=%.2f \n",XT,x,YT,y);
-            
+        case (10) :{   
+            XT = XT - 0.01;
             break;
-    }
-        default :
-        {
-          
-            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=analog=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
-            stop = true;
-
-            //s1 = 0;s2 =0; s3 =0; s4 =0;
-
-        //    pc.printf("Stop V1=%.2f V2=%.2f V3=%.2f V4=%.2f\n",V1,V2,V3,V4);
-        }  
-    }  
+        }
+        default :{}  
+    }   //end of switch  
 }
 
-//Begin Encoder
-
-void setCenter()
-{
+void setCenter(){
+/* Fungsi untuk menentukan center dari robot */
     encoderDepan.reset();
     encoderBelakang.reset();
     encoderKanan.reset();
     encoderKiri.reset();
 }
 
-float getX()
-{
+float getX(){
+/* Fungsi untuk mendapatkan jarak X */
     float  jarakEncDpn, jarakEncBlk;
-    jarakEncDpn = (encoderDepan.getPulses())/(float)(2000.0)*K_enc;
-    jarakEncBlk = (encoderBelakang.getPulses())/(float)(2000.0)*K_enc;
+    jarakEncDpn = (encoderDepan.getPulses())/(float)(2000.0)*k_enc;
+    jarakEncBlk = (encoderBelakang.getPulses())/(float)(2000.0)*k_enc;
     return (jarakEncDpn-jarakEncBlk)/2;
 }
 
-float getY()
-{
+float getY(){
+/* Fungsi untuk mendapatkan jarak Y */
     float  jarakEncKir, jarakEncKan;
-    jarakEncKir = (encoderKiri.getPulses())/(float)(2000.0)*K_enc;
-    jarakEncKan = (encoderKanan.getPulses())/(float)(720.0)*K_enc;
+    jarakEncKir = (encoderKiri.getPulses())/(float)(2000.0)*k_enc;
+    jarakEncKan = (encoderKanan.getPulses())/(float)(720.0)*k_enc;
     return (jarakEncKir-jarakEncKan)/2;   
 }
 
-float getTetha()
-{
+float getTetha(){
+/* Fungsi untuk mendapatkan nilai tetha */
     float busurDpn, busurBlk, busurKir, busurKan;
-    busurDpn = ((encoderDepan.getPulses())/(float)(2000.0)*K_enc)/K_robot*360.0;
-    busurBlk = ((encoderBelakang.getPulses())/(float)(2000.0)*K_enc)/K_robot*360.0;
-    busurKir = ((encoderKiri.getPulses())/(float)(2000.0)*K_enc)/K_robot*360.0;
-    busurKan = ((encoderKanan.getPulses())/(float)(720.0)*K_enc)/K_robot*360.0;
+    busurDpn = ((encoderDepan.getPulses())/(float)(2000.0)*k_enc)/k_robot*360.0;
+    busurBlk = ((encoderBelakang.getPulses())/(float)(2000.0)*k_enc)/k_robot*360.0;
+    busurKir = ((encoderKiri.getPulses())/(float)(2000.0)*k_enc)/k_robot*360.0;
+    busurKan = ((encoderKanan.getPulses())/(float)(720.0)*k_enc)/k_robot*360.0;
     
     return -(busurDpn+busurBlk+busurKir+busurKan)/4;    
 }
 
-void gotoXYT(float xa, float ya, float Ta)
-{
+void gotoXYT(float xa, float ya, float Ta){
+/* Fungsi untuk bergerat ke target */
+    errX = xa-getX();
+    Vx = kpX*errX;
+    
+    errY = ya-getY();
+    Vy = kpY*errY;
+    
+    errT = Ta-getTetha();
+    Vt = kp_tetha*errT;
+    
+    v1 = Vx+Vy-Vt;
+    v2 = Vx-Vy-Vt;
+    v3 = -Vx-Vy-Vt;
+    v4 = -Vx+Vy-Vt;
+    
+    if (v1>speed1)
+    { v1 = speed1; }
+    else if (v1<-speed1)
+    { v1 = -speed1; }
+    
+    if (v2>speed2)
+    { v2 = speed2; }
+    else if (v2<-speed2)
+    { v2 = -speed2; }
+    
+    if (v3>speed3)
+    { v3 = speed3; }
+    else if (v3<-speed3)
+    { v3 = -speed3; }
+    
+    if (v4>speed4)
+    { v4 = speed4; }
+    else if (v4<-speed4)
+    { v4 = -speed4; }
+    
+    if (((errX > 0.05) || (errX<-0.05)) || ((errY > 0.05) || (errY<-0.05)) || ((errT > 0.05) || (errT<-0.05))){
+        motor1.speed(v1);
+        motor2.speed(v2);
+        motor3.speed(v3);
+        motor4.speed(v4);    
+    }
+    else{
+        motor1.brake(1);
+        motor2.brake(1);
+        motor3.brake(1);
+        motor4.brake(1);
+    }
+}
 
-        errX = xa-getX();
-        Vx = KpX*errX;
-        
-        errY = ya-getY();
-        Vy = KpY*errY;
-        
-        errT = Ta-getTetha();
-        Vt = Kp_tetha*errT;
-        
-        V1 = Vx+Vy-Vt;
-        V2 = Vx-Vy-Vt;
-        V3 = -Vx-Vy-Vt;
-        V4 = -Vx+Vy-Vt;
-        
-        if (V1>speed1)
-        { V1 = speed1; }
-        else if (V1<-speed1)
-        { V1 = -speed1; }
-        
-        if (V2>speed2)
-        { V2 = speed2; }
-        else if (V2<-speed2)
-        { V2 = -speed2; }
-        
-        if (V3>speed3)
-        { V3 = speed3; }
-        else if (V3<-speed3)
-        { V3 = -speed3; }
-        
-        if (V4>speed4)
-        { V4 = speed4; }
-        else if (V4<-speed4)
-        { V4 = -speed4; }
-        
-        if (((errX > 0.05) || (errX<-0.05)) || ((errY > 0.05) || (errY<-0.05)) || ((errT > 0.05) || (errT<-0.05)))
-        {
-            motor1.speed(V1);
-            motor2.speed(V2);
-            motor3.speed(V3);
-            motor4.speed(V4);    
-      //      pc.printf("V1=%.2f \ ", V1);
-        }
-        else
-        {
-            motor1.brake(1);
-            motor2.brake(1);
-            motor3.brake(1);
-            motor4.brake(1);
-            //_ms(1000);
-        }
-        //pc.printf("%f\t%f\t%f  ", errX*100,errY*100,errT); 
-   //     wait_ms(10);
-
-}
-//End Encoder
-
-void speedLauncher()
-{
+void speedLauncher(){
+/* Fungsi untuk speed launcher */
     if (joystick.R3_click and speedL < 0.8){
-        speedL = speedL + 0.01;}
+        speedL = speedL + 0.01;
+    }
     if (joystick.L3_click and speedL > 0.1){
-        speedL = speedL - 0.01;} 
+        speedL = speedL - 0.01;
+    } 
     if (joystick.R2_click and speedB < 0.8 ){
-            speedB = speedB + 0.01;}  
+        speedB = speedB + 0.01;
+    }  
     if (joystick.L2_click and speedB > 0.1 ){
-        speedB = speedB - 0.01;}    
-    //pc.printf("Pwm depan = %.3f\t  Pwm belakang = %.3f\n", speedL, speedB);
+        speedB = speedB - 0.01;
+    }    
 }
    
-    
-    
-int main (void)
-{
-    // Set baud rate - 115200
+/***********************************************/
+/*              Main Function                  */
+/***********************************************/
+
+int main (void){
+    /* Set baud rate - 115200 */
     joystick.setup();
-    pc.baud(115200);
     wait_ms(1000);
     setCenter();
     wait_ms(500);
     
-    //Posisi Awal
+    /* Posisi Awal */
     XT = 0;
     YT = 0;
     Tetha = 0;
-    pc.printf("Ready...\n");
-    kalibrasi();
-    waktu.start();
+
+    /* Untuk mendapatkan serial dari Arduino */
     while(1)
     {
         // Interrupt Serial
-        joystick.idle();
-       if(joystick.readable() ) {
+        joystick.idle();        
+        
+        if(joystick.readable() ) {
             // Panggil fungsi pembacaan joystik
             joystick.baca_data();
+            
             // Panggil fungsi pengolahan data joystik
             joystick.olah_data();
-            //pc.printf("%3d %3d\n\r",joystick.R2, joystick.L2);
-            //pc.printf("%2x %2x %2x %2x %3d %3d %3d %3d %3d %3d\n\r",joystick.button, joystick.RL, joystick.button_click, joystick.RL_click, joystick.R2, joystick.L2, joystick.RX, joystick.RY, joystick.LX, joystick.LY);
+            
+            // Masuk ke case gerak
             case_ger = case_gerak();
             aktuator();
-            
-            //pc.printf("bacaS = %.2f\tbacaB = %.2f\n",servoS.read(), servoB.read());
-            
-            //kalibrasi
-            if (joystick.START){
-                kalibrasi();}
-             // analog switch mode
-            if (joystick.SELECT_click)      {analog = !analog;}  
-            if (joystick.segitiga_click)    {Launcher = !Launcher;}
-            if (joystick.lingkaran_click){
-                ServoGo = true;
-                waktu.reset();
-                }  
+
+            if (joystick.segitiga_click)    launcher  = !launcher;
+            if (joystick.lingkaran_click)   servoGo = true;
             if (joystick.silang) {
                 XT = 0;
                 YT = 0;
                 Tetha = 0;
-                //pc.printf("x..\n");
-                }
+            }
             speedLauncher();
          
-        } else {
-            joystick.idle();
-            
+        } 
+        else {
+            joystick.idle();    
         }                           
             gotoXYT(XT,YT,Tetha);