Tambahan codingan servo, Cek pin servo terlebih dahulu

Dependencies:   Motor PID Joystic_OrdoV3 mbed

Fork of Joystick_OrdoV3 by KRAI 2017

Revision:
3:1287fccc11be
Parent:
1:56bd3e8f38c5
Child:
4:483c07cc22e1
--- a/main.cpp	Sat Jun 27 07:37:28 2015 +0000
+++ b/main.cpp	Sun Oct 16 06:27:39 2016 +0000
@@ -1,9 +1,7 @@
 /**
-Base 4 Nasional
-
 Case Gerak
-1.  Pivot Kanan
-2.  Pivot Kiri
+1.  cw
+2.  ccw
 3.  Maju
 4.  Mundur
 5.  Serong Atas Kanan
@@ -12,9 +10,12 @@
 8.  Serong Bawah Kiri
 9.  Kanan
 10. Kiri
-11. Stop
+11. Analog kiri base
+12. stop
 
+Urutan motor 1234 searah jarum jam
 
+Source Code dari
 Bima Sahbani            EL'12
 Fanny Achmad Hindrarta  EL'12
 **/
@@ -29,80 +30,93 @@
 //#define koefperlambatan 0.8
 
 // Deklarasi variabel motor
-Motor motor1(PA_15, PA_13, PA_14); // pwm, fwd, rev
-Motor motor2(PA_0, PC_14, PC_15); // pwm, fwd, rev
-Motor motor3(PA_1, PH_1, PH_0); // pwm, fwd, rev
-Motor motor4(PC_6, PC_9, PC_8); // pwm, fwd, rev
-
-// Deklarasi Register Pneumatik
-DigitalOut pneumatik1(PC_11);
-DigitalOut pneumatik2(PD_2);
-
-// Deklarasi Timer Pneumatik
-Timer timer_pneu;
+Motor motor1(PB_6, PA_7 , PB_12); // pwm, fwd, rev
+Motor motor2(PB_9, PA_12, PC_5); // pwm, fwd, rev
+Motor motor3(PB_7, PA_15, PA_14); // pwm, fwd, rev
+Motor motor4(PB_8, PB_1 , PA_13); // pwm, fwd, rev
 
 // Inisialisasi  Pin TX-RX Joystik dan PC
-joysticknucleo joystick(PA_11,PA_12);
-//Serial pc(USBTX,USBRX);
+joysticknucleo joystick(PA_0,PA_1);
+Serial pc(USBTX,USBRX);
 
 //bool perlambatan=0;
 char case_ger;
-bool maju=false,mundur=false,kiri=false,kanan=false,saka=false,saki=false,sbka=false,sbki=false,pivki=false,pivka=false,cw1=false,ccw1=false,cw2=false,ccw2=false,cw3=false,ccw3=false;
+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 t1, t2, pneu1, pneu2;
-int delay_pneumatik;
-double vcurr;
+int jLX,jLY;
+double vcurr=0;
+float x,y,xk,yk; // untuk analog, x sebelum kalibrasi xk sesudah kalibrasi
+float errorx=0,errory=0;
+
+// Fungsi mapping 0-255 ke -1 sampai 1
+float mapping(int x)
+{   
+    float hasil;
+    hasil = ((x+1)/128)-1;
+    
+    return (hasil);
+}
 
+// simpan data analog
+void baca_analog()
+{
+        jLX = joystick.LX;
+        jLY = joystick.LY;
+        
+        // Pembacaan nilai Y terbalik
+        x = mapping(jLX);
+        y = -mapping(jLY); 
+            
+        // Setelah di kalibrasi
+        xk = x + errorx;
+        yk = y + errory;
+}
 
+// Gerak dari Motor base
 int case_gerak()
 {
     int casegerak;
-    if (!joystick.L1 && joystick.R1) {
+    baca_analog();
+     if (!joystick.L1 && joystick.R1) {
         // Pivot Kanan
         casegerak = 1;
     } else if (!joystick.R1 && joystick.L1) {
         // Pivot Kiri
         casegerak = 2;
-    } else if (((!(joystick.L1&&joystick.R1)) && (joystick.LX>110 && joystick.LX<190) && (joystick.LY<=50)) || ((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.L1&&joystick.R1)) && (joystick.LX>90 && joystick.LX<190) && (joystick.LY>=200) )|| ((!joystick.atas)&&(joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)))  {  
+        casegerak = 3;
+    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri))  {  
         // Mundur
         casegerak = 4;
-    } else if ((!(joystick.L1&&joystick.R1)) && (((joystick.LX>=200)&&(joystick.LY<=50)) || ((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.L1&&joystick.R1)) && (((joystick.LX>=200)&&(joystick.LY>=200)) || ((!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.L1&&joystick.R1)) && (((joystick.LX<=50)&&(joystick.LY<=50)) || ((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.L1&&joystick.R1)) && (((joystick.LX<=50)&&(joystick.LY>=200)) || ((!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.L1&&joystick.R1)) && (joystick.LX>=210) && (joystick.LY>80 && joystick.LY<200))|| ((!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.L1&&joystick.R1)) && (joystick.LX<=50) && (joystick.LY>80 && joystick.LY<200))|| ((!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 {
-        // Stop
-        casegerak = 11;
-    }
-
-    if(joystick.silang_click && t1==0 && t2==0) {
-        pneu1 = 1;
-    } else {
-        pneu1 = 0;
-    }
-    
-    if(joystick.kotak_click && t1==0 && t2==0) {
-        pneu2 = 1;
-    } else {
-        pneu2 = 0;
-    }
+        casegerak = 10;        
+    } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) {  
+        // analog switch mode
+        if (joystick.SELECT_click) {analog=!analog;}
+        // case gerak analog on off
+        if (analog){
+            casegerak = 11;
+        } else {
+            casegerak = 12;
+        }    
+}
     return(casegerak);
 }
 
@@ -110,7 +124,7 @@
 
 /**
 
-**  Case 1  : Pivot Kanan
+**  Case 1  : Pivot kanan
 **  Case 2  : Pivot Kiri
 **  Case 3  : Maju
 **  Case 4  : Mundur
@@ -120,47 +134,21 @@
 **  Case 8  : Serong Bawah Kiri
 **  Case 9  : Kanan
 **  Case 10 : Kiri
-**  Case 11 : Break
+**  Case 11 : Analog
+**  Case 11 : break
 
 **/
+
+// Pergerakan dari base
 void aktuator()
 {
     double koef;
     double s1=0,s2=0,s3=0,s4=0;
     
-    // PNEUMATIK
-    if(t1==1) {
-        if(timer_pneu.read_ms() - delay_pneumatik > 800) {
-            pneumatik1 = 1;
-            t1=0;
-        }
-    }
-    if(t2==1) {
-        if(timer_pneu.read_ms() - delay_pneumatik > 800) {
-            pneumatik2 = 1;
-            t2=0;
-        }
-    }
-    
-    if (pneu1 == 1 || pneu2==1) {
-        timer_pneu.reset();
-        delay_pneumatik = timer_pneu.read_ms();
-        if(pneu1 == 1) {
-            pneumatik1 = 0;
-            t1 = 1;
-            pneu1 = 0;
-        } else if(pneu2 == 1) {
-            pneumatik2 = 0;
-            t2 = 1;
-            pneu2 = 0;
-        }
-        
-    }
-
     // MOTOR
     switch (case_ger) 
     {
-    case (1): 
+case (1): 
         {       
             if (pivka) {
                 if(vcurr<0.1) {
@@ -187,14 +175,14 @@
             }
             
             s1 = (float)(-0.5*koef*vcurr);
-            s2 = (float)(0.5*koef*vcurr);
+            s2 = (float)(-0.5*koef*vcurr);
             s3 = (float)(-0.5*koef*vcurr);
-            s4 = (float)(0.5*koef*vcurr);    
+            s4 = (float)(-0.5*koef*vcurr);    
             
             pivka=true;         
-            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=mundur=analog=kiri=kanan=saka=saki=sbka=sbki=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("pivKa\n");
+            pc.printf("pivKa\n");
             
             motor1.speed(s1);
             motor2.speed(s2);
@@ -229,14 +217,14 @@
             }
             
             s1 = (float)(0.5*koef*vcurr);
-            s2 = (float)(-0.5*koef*vcurr);
+            s2 = (float)(0.5*koef*vcurr);
             s3 = (float)(0.5*koef*vcurr); 
-            s4 = (float)(-0.5*koef*vcurr);    
+            s4 = (float)(0.5*koef*vcurr);    
             
             pivki=true; 
-            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=pivka=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=mundur=kiri=analog=kanan=saka=saki=sbka=sbki=pivka=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("pivKi\n");
+            pc.printf("pivKi\n");
             
             motor1.speed(s1);
             motor2.speed(s2);
@@ -282,9 +270,9 @@
             //s4 =koef*vcurr;    
             
             maju=true;             
-            mundur=kiri=kanan=saka=saki=sbka=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            mundur=kiri=kanan=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
 
-            //pc.printf("maju\n");
+            pc.printf("maju\n");
 
             motor1.speed(s1);
             motor2.speed(s2);
@@ -324,9 +312,9 @@
             s4 = (float)(1*koef*(vcurr+0.005));
 
             mundur=true; 
-            maju=kiri=kanan=saka=saki=sbka=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=kiri=kanan=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
 
-            //pc.printf("mundur\n");
+            pc.printf("mundur\n");
 
             motor1.speed(s1);
             motor2.speed(s2);
@@ -364,9 +352,9 @@
             s4 = (float)(0);                 //-koef*0.1*vcurr;                
             
             saka=true; 
-            maju=mundur=kiri=kanan=sbka=saki=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=mundur=kiri=kanan=sbka=saki=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("saka\n");
+            pc.printf("saka\n");
             
             motor1.speed(s1);
             motor2.brake(1);
@@ -408,9 +396,9 @@
             s4 = (float)(koef*vcurr);
             
             sbka=true; 
-            maju=mundur=kiri=kanan=saka=saki=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=mundur=kiri=kanan=saka=saki=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("sbka\n");
+            pc.printf("sbka\n");
 
             //motor1.speed(s1);
             motor1.brake(1);
@@ -452,9 +440,9 @@
             s4 = (float)(-koef*vcurr);  
             
             saki=true; 
-            maju=kiri=kanan=saka=mundur=sbka=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=kiri=kanan=saka=mundur=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("saki\n");
+            pc.printf("saki\n");
             
             //motor1.speed(s1);
             motor1.brake(1);
@@ -496,9 +484,9 @@
             s4 = (float)(0);                 //koef*0.1*vcurr;
             
             sbki=true; 
-            maju=kiri=kanan=saka=saki=sbka=mundur=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=kiri=kanan=saka=saki=sbka=mundur=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("sbki\n");
+            pc.printf("sbki\n");
             
             motor1.speed(s1);
             //motor2.speed(s2);
@@ -540,9 +528,9 @@
             s4 =(float)(1.0*koef*vcurr);           
             
             kanan=true; 
-            maju=kiri=mundur=saka=saki=sbka=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=kiri=mundur=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("Kanan\n");
+            pc.printf("Kanan\n");
             
             motor1.speed(s1);
             motor2.speed(s2);
@@ -581,9 +569,9 @@
             s4 =(float)(-1.0*koef*vcurr);
             
             kiri=true; 
-            maju=kanan=mundur=saka=saki=sbka=sbki=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            maju=kanan=mundur=saka=saki=sbka=sbki=analog=pivka=pivki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
             
-            //pc.printf("Kiri\n");
+            pc.printf("Kiri\n");
             
             motor1.speed(s1);
             motor2.speed(s2);
@@ -592,7 +580,52 @@
               
             break;
         }
-    default :
+    case (11): 
+        {          
+            if (analog) {
+                if(vcurr<0.1) {
+                    vcurr=0.1;
+                } else {
+                    vcurr+=ax;
+                }
+                //perlambatan=0;
+            } else { 
+                //perlambatan=1;
+            } 
+            
+            if (vcurr>=vmax) {
+                vcurr=vmax; 
+            }
+            
+            if(joystick.R2==255 && joystick.L2==0) {
+                koef=2;
+            } else if (joystick.L2==255 && joystick.R2==0) {
+                koef=0.5;
+            }
+            else { 
+                koef=1;
+            }
+            
+            s1 = (float)(0.5*koef*vcurr*((-xk)+(yk)));
+            s2 = (float)(0.5*koef*vcurr*((-xk)+(-yk)));
+            s3 = (float)(0.5*koef*vcurr*((xk)+(-yk)));
+            s4 = (float)(0.5*koef*vcurr*((xk)+(yk)));    
+            
+                                  
+                       
+            analog=true;
+            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            
+            pc.printf("analog x= %d  y= %d  /n  ",x,y);
+            
+       
+                motor1.speed(s1);
+                motor2.speed(s2);
+                motor3.speed(s3);
+                motor4.speed(s4);
+            break;
+    }
+        default :
         {
             //if (mundur||kiri||kanan||saka||saki||sbka||sbki||pivki||pivka||cw1||ccw1||cw2||ccw2||cw3||ccw3) wait_ms(100);
             //if (maju && (vcurr>=0.5)) wait_ms(100); 
@@ -618,28 +651,32 @@
                 motor4.brake(1);
             //}
 
-            maju=mundur=kiri=kanan=saka=saki=sbka=sbki=pivki=pivka=cw1=ccw1=cw2=ccw2=cw3=ccw3=false;
+            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\n");
-        }
+            pc.printf("Stop\n");
+        }  
     }
 }
 
+// Kalibrasi tombol analog kiri
+void kalibrasi()
+{
+    errorx = 0-x;
+    errory = 0-y;    
+
+}
+
 
 int main (void)
 {
     // Set baud rate - 115200
     joystick.setup();
-    //pc.baud(115200);
-    //pc.printf("Ready...\n");
-    timer_pneu.start();
-    pneumatik1=1;
-    pneumatik2=1;
-    t1=0;
-    t2=0;
+    pc.baud(115200);
+    pc.printf("Ready...\n");
+
     while(1)
     {
         // Interrupt Serial
@@ -651,7 +688,11 @@
             joystick.olah_data();
             //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);
             case_ger = case_gerak();
-            aktuator();  
+            aktuator();
+            //kalibrasi
+            if (joystick.START_click){
+                kalibrasi();
+            }  
 
         } else {
             joystick.idle();