Update 18 Februari 2017, PID laucnher dan Base sudah diperbarui
Dependencies: Motor PID Joystick_OrdoV5 mbed millis
Fork of MainProgram_BaseBaru_otomatis-reloader by
Diff: main.cpp
- Revision:
- 22:4632f58461e0
- Parent:
- 21:da2f3d04468f
- Child:
- 23:023b522977b2
diff -r da2f3d04468f -r 4632f58461e0 main.cpp --- a/main.cpp Sat Jan 28 07:24:07 2017 +0000 +++ b/main.cpp Sat Jan 28 10:19:36 2017 +0000 @@ -3,15 +3,15 @@ /* */ /* - Digunakan encoder autonics */ /* - Konfigurasi Motor dan Encoder sbb : */ -/* _________________ */ -/* | DEPAN | */ -/* | 1. e .2 | Angka ==> Motor */ -/* | ` ` | e ==> Encoder */ -/* | e e | */ -/* | . . | */ -/* | 4` e `3 | */ -/* |________________| */ -/* */ +/* ______________________ */ +/* / \ 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 */ @@ -21,14 +21,14 @@ /* Joystick */ /* Kanan => Posisi target x ditambah 'perpindahan' */ /* Kiri => Posisi target x dikurang 'perpindahan' */ -/* Atas => Posisi target y ditambah 0.01 */ -/* Bawah => Posisi target y dikurang 0.01 */ /* */ /* Tombol silang => Kembali keposisi Awal */ /* Tombol segitiga => Aktif motor Launcher */ /* Tombol lingkaran=> Aktif servo Launcher */ -/* Tombol L3 => PWM Launcher dikurangin */ -/* Tombol R3 => PWM Launcher ditambahin */ +/* Tombol L1 => Pivot Kiri */ +/* Tombol R1 => Pivot Kanan */ +/* Tombol L3 => PWM Launcher Belakang dikurangin */ +/* Tombol R3 => PWM Launcher Belakang ditambahin */ /* */ /* Bismillahirahmanirrahim */ /* Jagalah Kebersihan Kodingan */ @@ -44,36 +44,28 @@ /* Konstanta dan Variabel */ /***********************************************/ #define PI 3.14159265 -#define D_ENCODER 0.058 -#define D_ROBOT 0.64 -#define VMAX 0.3 // Maju, Mundur, Kiri Kanan -#define SAMPING 0.3 // Saka, Saki, Sbka, Sbki +#define D_ENCODER 0.997 // Diameter Roda Encoder +#define D_ROBOT // Diameter Roda Robot +#define VMAX 0.3 // Kiri Kanan #define PIVOT 0.4 // Pivka, Pivki #define PERPINDAHAN 1 // Perpindahan ke kanan dan kiri float k_enc = PI*D_ENCODER; -float k_robot = PI*D_ROBOT; -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 speedT = 0.2; +float speedB = 0.43; +float speedL = 0.4; -float kpX=0.5, kpY=0.5, kp_tetha=0.03; +float vpid = 0; + +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 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 +Motor motor1(PB_7, PA_14, PA_15); // pwm, fwd, rev, Motor Depan +Motor motor2(PB_8, PA_13, PB_0); // pwm, fwd, rev, Motor Belakang /* Deklarasi Motor Launcher */ Motor motorld(PA_8, PC_1, PC_2); // pwm, fwd, rev @@ -90,15 +82,10 @@ **/ /* 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 +float errT, Tetha; // Variabel yang didapatkan encoder /* 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 */ @@ -106,27 +93,21 @@ /* Variabel Stick */ char case_ger; -bool launcher = false, servoGo = false, manual = true; -int caseSebelum; +bool launcher = false, servoGo = false; -/***********************************************/ -/* Deklarasi Fungsi dan Procedure */ -/***********************************************/ +/****************************************************/ +/* 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 + ** Case 3 : Kanan + ** Case 4 : Kiri + ** Case 5 : Break ****************************************************/ + int casegerak; if (!joystick.L1 && joystick.R1) { // Pivot Kanan @@ -136,40 +117,17 @@ // Pivot Kiri casegerak = 2; } - 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)) { - // Mundur - casegerak = 4; - } - 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)) { - // Serong Bawah Kanan - casegerak = 6; - } - 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)) { - // Serong Bawah Kiri - casegerak = 8; - } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(joystick.kanan)&&(!joystick.kiri)) { // Kanan - casegerak = 9; + casegerak = 3; } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(joystick.kiri)) { // Kiri - casegerak = 10; + casegerak = 4; } else if ((!joystick.R1)&&(!joystick.L1)&&(!joystick.atas)&&(!joystick.bawah)&&(!joystick.kanan)&&(!joystick.kiri)) { - casegerak = 12; + // Break + casegerak = 5; } return(casegerak); } @@ -207,257 +165,90 @@ } // MOTOR Bawah - if (manual) { - // Mode Manual - switch (case_ger) { + switch (case_ger) { case (1): { // Pivot Kanan motor1.speed(-PIVOT); motor2.speed(-PIVOT); - motor3.speed(-PIVOT); - motor4.speed(-PIVOT); break; } case (2): { // Pivot Kiri motor1.speed(PIVOT); motor2.speed(PIVOT); - motor3.speed(PIVOT); - motor4.speed(PIVOT); - break; - } - case (3): { - // Maju - motor1.speed(-VMAX); - motor2.speed(VMAX); - motor3.speed(VMAX); - motor4.speed(-VMAX); - break; - } - case (4): { - // Mundur - motor1.speed(VMAX); - motor2.speed(-VMAX); - motor3.speed(-VMAX); - motor4.speed(VMAX); - break; - } - case (5) : { - // Samping Atas Kanan - motor1.speed(-SAMPING); - motor2.brake(1); - motor3.speed(SAMPING); - motor4.brake(1); break; - } - case (6) : { - // Samping Bawah Kanan - motor1.brake(1); - motor2.speed(-SAMPING); - motor3.brake(1); - motor4.speed(SAMPING); - break; - } - case (7) : { - // Samping Atas Kiri - motor1.brake(1); - motor2.speed(SAMPING); - motor3.brake(1); - motor4.speed(-SAMPING); + } + case (3) : { + // Kanan + motor1.speed(-VMAX-vpid); + motor2.speed(VMAX+vpid); break; - } - case (8) : { - // Samping Bawah Kiri - motor1.speed(SAMPING); - motor2.brake(1); - motor3.speed(-SAMPING); - motor4.brake(1); - break; - } - case (9) : { - // Kanan - motor1.speed(-VMAX); - motor2.speed(-VMAX); - motor3.speed(VMAX); - motor4.speed(VMAX); - break; - } - case (10) : { + } + case (4) : { // Kiri - motor1.speed(VMAX); - motor2.speed(VMAX); - motor3.speed(-VMAX); - motor4.speed(-VMAX); + motor1.speed(VMAX-vpid); + motor2.speed(-VMAX+vpid); break; } default : { - motor1.brake(1); - motor2.brake(1); - motor3.brake(1); - motor4.brake(1); + motor1.brake(1); + motor2.brake(1); } - } // End Switch - } else { - // Mode Encoder - switch (case_ger) { - case (1):{ - Tetha = Tetha - 0.05; - break; - } - case (2):{ - Tetha = Tetha + 0.05; - break; - } - case (3):{ - YT = YT + 0.01; - break; - } - case (4):{ - YT = YT - 0.01; - break; - } - case (5) :{ - XT = XT + 0.01; - YT = YT + 0.01; - break; - } - case (6) :{ - XT = XT + 0.01; - YT = YT - 0.01; - break; - } - case (7) :{ - XT = XT - 0.01; - YT = YT + 0.01; - break; - } - case (8) :{ - XT = XT - 0.01; - YT = YT - 0.01; - break; - } - case (9) :{ - // Kanan - if (case_ger != caseSebelum) - XT = XT + PERPINDAHAN; - break; - } - case (10) :{ - // Kiri - if (case_ger != caseSebelum) - XT = XT - PERPINDAHAN; - break; - } - default :{} - } // End of Switch - caseSebelum = case_ger; - } + } // End Switch } void setCenter(){ /* Fungsi untuk menentukan center dari robot */ - encoderDepan.reset(); - encoderBelakang.reset(); - encoderKanan.reset(); encoderKiri.reset(); } -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; - return (jarakEncDpn-jarakEncBlk)/2; -} - -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; - return (jarakEncKir-jarakEncKan)/2; -} - 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; + float busurKir; + busurKir = ((encoderKiri.getPulses())/(float)(2000.0)*k_enc); - return -(busurDpn+busurBlk+busurKir+busurKan)/4; + return -(busurKir); } -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; +void gotoXYT(float Ta){ +/* Fungsi untuk bergerak ke target */ + float vt; 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 (vt>speed1) + { vt = speed1; } + else if (vt<-speed1) + { vt = -speed1; } - 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); + if ((((errT > 0.05) || (errT<-0.05))){ + vpid = vt; } else{ - motor1.brake(1); - motor2.brake(1); - motor3.brake(1); - motor4.brake(1); + vpid = 0; } } void speedLauncher(){ /* Fungsi untuk speed launcher */ if (joystick.R3_click and speedL < 0.8){ - speedL = speedL + 0.01; + speedL = speedL + 0.01; // PWM++ Motor Belakang } if (joystick.L3_click and speedL > 0.1){ - speedL = speedL - 0.01; + speedL = speedL - 0.01; // PWM-- Motor Belakang } if (joystick.R2_click and speedB < 0.8 ){ - speedB = speedB + 0.01; + speedB = speedB + 0.01; // PWM++ Motor Depan } if (joystick.L2_click and speedB > 0.1 ){ - speedB = speedB - 0.01; + speedB = speedB - 0.01; // PWM-- Motor Depan } } -/***********************************************/ -/* Main Function */ -/***********************************************/ +/*********************************************************/ +/* Main Function */ +/*********************************************************/ int main (void){ /* Set baud rate - 115200 */ @@ -467,8 +258,6 @@ wait_ms(500); /* Posisi Awal */ - XT = 0; - YT = 0; Tetha = 0; /* Untuk mendapatkan serial dari Arduino */ @@ -490,18 +279,10 @@ if (joystick.segitiga_click) launcher = !launcher; if (joystick.lingkaran_click) servoGo = true; - if (joystick.SELECT_click) manual = !manual; - if (joystick.silang) { - XT = 0; - YT = 0; - Tetha = 0; - } speedLauncher(); } else { joystick.idle(); } - if (!manual) - gotoXYT(XT,YT,Tetha); } }