Robot Sulistia, Full Kodingan Lomba KRTMI 2022
Dependencies: MPU9250 Motor PID QEI SRF05 mbed
PIDremote.cpp
00001 #include "mbed.h" 00002 #include "Motor.h" 00003 #include "QEI.h" 00004 #include "PID.h" 00005 00006 #define i2c_address 0x60 00007 00008 Serial pc(USBTX, USBRX); 00009 Serial bluetooth(PB_6, PA_10); 00010 I2C CMPS(PB_4, PA_8); 00011 //SRF05 ultra(PA_9, PC_7); 00012 float jarak; 00013 00014 DigitalOut trigPin1(PA_9); // sensor tengah 00015 DigitalIn echoPin1(PC_7); 00016 DigitalIn ir(PB_9); 00017 int eksistensi_koin; 00018 int ada = 0; 00019 int tidak_ada = 1; 00020 int i; 00021 int kecepatan_state; 00022 00023 QEI DepanKananQEI(PB_8, PC_9, NC, 986); //roda depan kanan PB_1, PB_15, NC, 624 00024 QEI BelakangKananQEI(PB_1, PB_15, NC, 986); //roda belakang kiri PB_14, PB_13, NC, 624 00025 QEI DepanKiriQEI(PC_12, PC_10, NC, 986); //roda depan kiri 00026 QEI BelakangKiriQEI(PB_7, PA_15, NC, 986); //roda belakang kiri 00027 00028 //Tuning Di alas 00029 //PID DepanKananPID(0.40, 0.020, 0.00001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1 00030 //PID BelakangKananPID(0.37, 0.018, 0.0000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 2 00031 //PID BelakangKiriPID(0.496, 0.0565, 0.0000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3 00032 //PID DepanKiriPID(0.85, 0.08, 0.000000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4 00033 00034 //Tuning Di Lantai 00035 //PID DepanKananPID(0.5, 0.020, 0.00001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1 00036 //PID BelakangKananPID(0.5, 0.022, 0.00000000001, 0.02); 00037 //PID BelakangKiriPID(0.496, 0.0565, 0.0000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3 00038 //PID DepanKiriPID(0.85, 0.08, 0.000000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4 00039 00040 PID DepanKananPID(0.8, 0.1, 0.00000001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1 00041 PID BelakangKananPID(0.78, 0.1, 0.0000001, 0.02); 00042 PID BelakangKiriPID(0.78, 0.1, 0.000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3 00043 PID DepanKiriPID(0.87, 0.1, 0.000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4 00044 00045 00046 00047 Motor DepanKanan(PC_6, PA_11, PB_12); 00048 Motor DepanKiri(PA_0, PA_4, PB_0); 00049 Motor BelakangKanan(PC_8, PC_5, PA_12); 00050 Motor BelakangKiri(PA_1, PC_1, PC_0); 00051 00052 PwmOut Servo(PA_7); 00053 PwmOut Servo2(PB_10); 00054 00055 Timer t_jalan; 00056 Timer t2; 00057 Timer t; 00058 Timer t_capit; 00059 00060 char nilai, huruf; 00061 int Jalan; 00062 int Jalan_Maju =1; 00063 int Berhenti = 0; 00064 int Jalan_Mundur = 2; 00065 int Jalan_Kanan = 3; 00066 int Jalan_Kiri = 4; 00067 int ke_setpoint = 5; 00068 int mode_inverse = 6; 00069 int Rotasi_Kanan = 7; 00070 int Rotasi_Kiri = 8; 00071 int Belok_Kanan = 9; 00072 int Belok_Kiri = 10; 00073 int Muter_Kiri = 11; 00074 int Muter_Kanan =12; 00075 int Capit_Buka = 13; 00076 int Capit_Muter = 14; 00077 int Cari_Koin1 = 15; 00078 int Cari_Koin2 = 16; 00079 int Mundur_Belok_Kanan = 17; 00080 int Mundur_Belok_Kiri = 18; 00081 int Ganti_Kecepatan = 19; 00082 00083 int DepanKananPulses = 0; 00084 int DepanKananPrevPulses = 0; 00085 float DepanKananVelocity = 0.0; 00086 00087 int BelakangKananPulses = 0; 00088 int BelakangKananPrevPulses = 0; 00089 float BelakangKananVelocity = 0.0; 00090 00091 int BelakangKiriPulses = 0; 00092 int BelakangKiriPrevPulses = 0; 00093 float BelakangKiriVelocity = 0.0; 00094 00095 int DepanKiriPulses = 0; 00096 int DepanKiriPrevPulses = 0; 00097 float DepanKiriVelocity = 0.0; 00098 00099 int Depan_Kanan_Count; 00100 int Depan_Kiri_Count; 00101 int Belakang_Kanan_Count; 00102 int Belakang_Kiri_Count; 00103 00104 int d_pulse_DepanKanan; 00105 int d_pulse_DepanKiri; 00106 int d_pulse_BelakangKanan; 00107 int d_pulse_BelakangKiri; 00108 00109 int koordinat_x_DepanKiri; 00110 int koordinat_x_DepanKanan; 00111 int koordinat_x_BelakangKiri; 00112 int koordinat_x_BelakangKanan; 00113 int koordinat_y_DepanKiri; 00114 int koordinat_y_DepanKanan; 00115 int koordinat_y_BelakangKiri; 00116 int koordinat_y_BelakangKanan; 00117 float koordinat_x; 00118 float koordinat_y; 00119 int Resolusi = 986; 00120 float pi = 3.141; 00121 float diameter = 5.8f; 00122 float rtd = pi/180.0f; 00123 int setpoint_x; 00124 int setpoint_y; 00125 float radius = 0.029; 00126 float orientasi; 00127 int orientasi_2; 00128 int target_orientasi; 00129 float waktu; 00130 int BEARING_Register; 00131 char bits[2]; 00132 int _byteHigh; 00133 int _byteLow; 00134 float bearing; 00135 00136 float target_depan_kiri; 00137 float target_depan_kanan; 00138 float target_belakang_kiri; 00139 float target_belakang_kanan; 00140 float arah_depan_kiri; 00141 float arah_depan_kanan; 00142 float arah_belakang_kiri; 00143 float arah_belakang_kanan; 00144 00145 float temp_x_DepanKiri; 00146 float temp_x_DepanKanan; 00147 float temp_x_BelakangKanan; 00148 float temp_x_BelakangKiri; 00149 float temp_y_DepanKiri; 00150 float temp_y_DepanKanan; 00151 float temp_y_BelakangKanan; 00152 float temp_y_BelakangKiri; 00153 float temp_x; 00154 float temp_y; 00155 float terhadap_x; 00156 float terhadap_y; 00157 int koordinat_x_bulat; 00158 int koordinat_y_bulat; 00159 float target_x_basis; 00160 float target_y_basis; 00161 float sudut_awal; 00162 int capit_state; 00163 int capit2_state; 00164 00165 void fungsi_bluetooth(void) 00166 { 00167 if(bluetooth.readable()) 00168 { 00169 setpoint_x = bluetooth.getc(); 00170 setpoint_y = bluetooth.getc(); 00171 int target_sudut = bluetooth.getc(); 00172 nilai = bluetooth.getc(); 00173 if (nilai == 'S') 00174 { 00175 huruf = 'S'; 00176 Jalan = Berhenti; 00177 } 00178 else if (nilai == 'F') 00179 { 00180 huruf = 'F'; 00181 Jalan = Jalan_Maju; 00182 } 00183 else if(nilai =='B') 00184 { 00185 huruf = 'B'; 00186 Jalan = Jalan_Mundur; 00187 } 00188 else if(nilai =='L') 00189 { 00190 huruf = 'L'; 00191 Jalan = Jalan_Kiri; 00192 } 00193 else if(nilai =='K') 00194 { 00195 huruf = 'K'; 00196 Jalan = Belok_Kiri; 00197 } 00198 else if(nilai =='A') 00199 { 00200 huruf = 'A'; 00201 Jalan = Belok_Kanan; 00202 } 00203 else if(nilai =='R') 00204 { 00205 huruf = 'R'; 00206 Jalan = Jalan_Kanan; 00207 } 00208 else if(nilai =='Q') 00209 { 00210 huruf = 'Q'; 00211 Jalan = Muter_Kiri; 00212 } 00213 else if(nilai =='E') 00214 { 00215 huruf = 'E'; 00216 Jalan = Muter_Kanan; 00217 } 00218 else if(nilai =='M') 00219 { 00220 huruf = 'M'; 00221 Jalan = Rotasi_Kanan; 00222 } 00223 else if(nilai =='W') 00224 { 00225 huruf = 'W'; 00226 Jalan = Rotasi_Kiri; 00227 } 00228 else if(nilai == 'U') 00229 { 00230 huruf = 'U'; 00231 Jalan = Mundur_Belok_Kiri; 00232 } 00233 else if(nilai == 'V') 00234 { 00235 huruf = 'V'; 00236 Jalan = Mundur_Belok_Kanan; 00237 } 00238 else if(nilai =='T') 00239 { 00240 huruf = 'T'; 00241 Jalan = Capit_Buka; 00242 } 00243 else if(nilai =='O') 00244 { 00245 huruf = 'O'; 00246 Jalan = Capit_Muter; 00247 } 00248 else if(nilai =='J') 00249 { 00250 huruf = 'J'; 00251 Jalan = Cari_Koin1; 00252 //Jalan = ke_setpoint; 00253 } 00254 else if(nilai =='H') 00255 { 00256 huruf = 'H'; 00257 Jalan = Cari_Koin2; 00258 //Jalan = ke_setpoint; 00259 } 00260 00261 else if(nilai =='Y') 00262 { 00263 huruf = 'G'; 00264 Jalan = ke_setpoint; 00265 } 00266 else if(nilai == 'G') 00267 { 00268 huruf = 'G'; 00269 Jalan = mode_inverse; 00270 } 00271 else if(nilai == 'X') 00272 { 00273 huruf = 'X'; 00274 Jalan = Ganti_Kecepatan; 00275 } 00276 else if(nilai == 'S') 00277 { 00278 Jalan = Berhenti; 00279 } 00280 else if(nilai == 'p') 00281 { 00282 NVIC_SystemReset(); 00283 } 00284 } 00285 } 00286 00287 void kosongkan() 00288 { 00289 BelakangKananQEI.reset(); 00290 DepanKananQEI.reset(); 00291 DepanKiriQEI.reset(); 00292 BelakangKiriQEI.reset(); 00293 00294 DepanKananPulses = 0; 00295 DepanKananPrevPulses = 0; 00296 DepanKananVelocity = 0.0; 00297 00298 BelakangKananPulses = 0; 00299 BelakangKananPrevPulses = 0; 00300 BelakangKananVelocity = 0.0; 00301 00302 BelakangKiriPulses = 0; 00303 BelakangKiriPrevPulses = 0; 00304 BelakangKiriVelocity = 0.0; 00305 00306 DepanKiriPulses = 0; 00307 DepanKiriPrevPulses = 0; 00308 DepanKiriVelocity = 0.0; 00309 } 00310 00311 void proses_kecepatan() 00312 { 00313 DepanKananPulses = DepanKananQEI.getPulses(); 00314 d_pulse_DepanKanan = DepanKananPulses - DepanKananPrevPulses; 00315 DepanKananVelocity = (DepanKananPulses - DepanKananPrevPulses) / 0.02; 00316 DepanKananPrevPulses = DepanKananPulses; 00317 DepanKananPID.setProcessValue(fabs(DepanKananVelocity)); 00318 00319 DepanKiriPulses = DepanKiriQEI.getPulses(); 00320 d_pulse_DepanKiri = DepanKiriPulses - DepanKiriPrevPulses; 00321 DepanKiriVelocity = (DepanKiriPulses - DepanKiriPrevPulses) / 0.02; 00322 DepanKiriPrevPulses = DepanKiriPulses; 00323 DepanKiriPID.setProcessValue(fabs(DepanKiriVelocity)); 00324 00325 BelakangKananPulses = BelakangKananQEI.getPulses(); 00326 d_pulse_BelakangKanan = BelakangKananPulses - BelakangKananPrevPulses; 00327 BelakangKananVelocity = (BelakangKananPulses - BelakangKananPrevPulses) / 0.02; 00328 BelakangKananPrevPulses = BelakangKananPulses; 00329 BelakangKananPID.setProcessValue(fabs(BelakangKananVelocity)); 00330 00331 BelakangKiriPulses = BelakangKiriQEI.getPulses(); 00332 d_pulse_BelakangKiri = BelakangKiriPulses - BelakangKiriPrevPulses; 00333 BelakangKiriVelocity = (BelakangKiriPulses - BelakangKiriPrevPulses) / 0.02; 00334 BelakangKiriPrevPulses = BelakangKiriPulses; 00335 BelakangKiriPID.setProcessValue(fabs(BelakangKiriVelocity)); 00336 } 00337 00338 float Get_Yaw() 00339 { 00340 CMPS.unlock(); 00341 CMPS.start(); 00342 // to indicate an i2c read, shift the 7 bit address up 1 bit and set bit 0 to a 1 00343 CMPS.write(i2c_address << 1); 00344 int writeResult = CMPS.write(BEARING_Register); 00345 if(writeResult != 1) 00346 { 00347 pc.printf("%d\n", writeResult); 00348 return bearing; 00349 } 00350 else 00351 { 00352 CMPS.stop(); 00353 CMPS.read(i2c_address <<1, bits, 2); 00354 _byteHigh = bits[0]; 00355 _byteLow = bits[1]; 00356 bearing = ((_byteHigh<<=8) + _byteLow) / 10; 00357 return bearing; 00358 } 00359 } 00360 00361 void Get_Count() 00362 { 00363 Depan_Kanan_Count = Depan_Kanan_Count + d_pulse_DepanKanan; 00364 Depan_Kiri_Count = Depan_Kiri_Count + d_pulse_DepanKiri; 00365 Belakang_Kanan_Count = Belakang_Kanan_Count + d_pulse_BelakangKanan; 00366 Belakang_Kiri_Count = Belakang_Kiri_Count + d_pulse_BelakangKiri; 00367 00368 temp_y_DepanKiri = ((double)d_pulse_DepanKiri/(double)Resolusi)*pi*diameter*cos(45.0f*rtd); 00369 temp_y_DepanKanan = ((double)d_pulse_DepanKanan/(double)Resolusi)*pi*diameter*cos(135.0f*rtd); 00370 temp_y_BelakangKanan = ((double)d_pulse_BelakangKanan/(double)Resolusi)*pi*diameter*cos(225.0f*rtd); 00371 temp_y_BelakangKiri = ((double)d_pulse_BelakangKiri/(double)Resolusi)*pi*diameter*cos(315.0f*rtd); 00372 00373 temp_x_DepanKiri = ((double)d_pulse_DepanKiri/(double)Resolusi)*pi*diameter*sin(45.0f*rtd); 00374 temp_x_DepanKanan = ((double)d_pulse_DepanKanan/(double)Resolusi)*pi*diameter*sin(135.0f*rtd); 00375 temp_x_BelakangKanan = ((double)d_pulse_BelakangKanan/(double)Resolusi)*pi*diameter*sin(225.0f*rtd); 00376 temp_x_BelakangKiri = ((double)d_pulse_BelakangKiri/(double)Resolusi)*pi*diameter*sin(315.0f*rtd); 00377 00378 temp_x = (temp_x_DepanKiri + temp_x_DepanKanan + temp_x_BelakangKiri + temp_x_BelakangKanan)/2; 00379 temp_y = (temp_y_DepanKiri + temp_y_DepanKanan + temp_y_BelakangKiri + temp_y_BelakangKanan)/2; 00380 00381 terhadap_x = -1*(double)temp_y*sin(orientasi*rtd) + (double)temp_x*cos(orientasi*rtd); 00382 terhadap_y = (double)temp_y*cos(orientasi*rtd) + (double)temp_x*sin(orientasi*rtd); 00383 } 00384 00385 void Cari_Koordinat() 00386 { 00387 orientasi = -1.0f * ((double)Get_Yaw()- sudut_awal); 00388 orientasi_2 = orientasi; 00389 00390 koordinat_y = koordinat_y + terhadap_y; 00391 koordinat_x = koordinat_x + terhadap_x; 00392 koordinat_x_bulat = koordinat_x; 00393 koordinat_y_bulat = koordinat_y; 00394 } 00395 00396 float cari_abs(float a) 00397 { 00398 if(a<0) 00399 { 00400 if(fabs(a)<20) 00401 { 00402 return 0.0f; 00403 } 00404 else if(fabs(a)>=20) 00405 { 00406 return -1.0f; 00407 } 00408 } 00409 else if(a>0) 00410 { 00411 if(fabs(a)<20) 00412 { 00413 return 0.0f; 00414 } 00415 else if(fabs(a)>=20) 00416 { 00417 return 1.0f; 00418 } 00419 } 00420 else 00421 { 00422 return 0.0f; 00423 } 00424 } 00425 00426 void cari_inverse(float setpoint_sudut, float target_x, float target_y) 00427 { 00428 //mengganti basis vektor berdasarkan sudut(rotasi axis) 00429 setpoint_sudut = setpoint_sudut*rtd; 00430 target_x = target_x - koordinat_x; 00431 target_y = target_y - koordinat_y; 00432 target_x_basis = target_x*cos(setpoint_sudut*-1.0f) - target_y*sin(setpoint_sudut*-1.0f); 00433 target_y_basis = target_x*sin(setpoint_sudut*-1.0f) + target_y*cos(setpoint_sudut*-1.0f); 00434 target_x = target_x_basis; 00435 target_y = target_y_basis; 00436 //meengganti satuan target 00437 float target_vx; 00438 float target_vy; 00439 target_x = (double)target_x/100.0f; 00440 target_y = (double)target_y/100.0f; 00441 //mencari target kecepatan translasi dari robot 00442 //maks kecepatan translasi per aksis 0.6 m/s 00443 if(fabs(target_x)>fabs(target_y)) 00444 { 00445 if((target_x<0)&&(target_y<0)) 00446 { 00447 target_vx = -0.6; 00448 target_vy = ((double)target_y/(double)target_x)*target_vx; 00449 } 00450 else if((target_x<0)&&(target_y>0)) 00451 { 00452 target_vx = -0.6; 00453 target_vy = ((double)target_y/(double)target_x)*target_vx; 00454 } 00455 else if((target_x>0)&&(target_y>0)) 00456 { 00457 target_vx = 0.6; 00458 target_vy = ((double)target_y/(double)target_x)*target_vx; 00459 } 00460 else if((target_x>0)&&(target_y<0)) 00461 { 00462 target_vx = 0.6; 00463 target_vy = ((double)target_y/(double)target_x)*target_vx; 00464 } 00465 else if((target_y==0)&&(target_x>0)) 00466 { 00467 target_vx = 0.6; 00468 target_vy = 0; 00469 } 00470 else if((target_y==0)&&(target_x<0)) 00471 { 00472 target_vx = -0.6; 00473 target_vy = 0; 00474 } 00475 } 00476 else if(fabs(target_x)<fabs(target_y)) 00477 { 00478 if((target_x<0)&&(target_y<0)) 00479 { 00480 target_vy = -0.6; 00481 target_vx = ((double)target_x/(double)target_y)*target_vy; 00482 } 00483 else if((target_x<0)&&(target_y>0)) 00484 { 00485 target_vy = 0.6; 00486 target_vx = ((double)target_x/(double)target_y)*target_vy; 00487 } 00488 else if((target_x>0)&&(target_y>0)) 00489 { 00490 target_vy = 0.6; 00491 target_vx = ((double)target_x/(double)target_y)*target_vy; 00492 } 00493 else if((target_x>0)&&(target_y<0)) 00494 { 00495 target_vy = -0.6; 00496 target_vx = ((double)target_x/(double)target_y)*target_vy; 00497 } 00498 else if((target_x==0)&&(target_y>0)) 00499 { 00500 target_vy = 0.6; 00501 target_vx = 0; 00502 } 00503 else if((target_x==0)&&(target_y<0)) 00504 { 00505 target_vy = -0.6; 00506 target_vx = 0; 00507 } 00508 } 00509 else if(fabs(target_x)==fabs(target_y)) 00510 { 00511 if((target_x<0)&&(target_y<0)) 00512 { 00513 target_vy = -0.6; 00514 target_vx = target_vy; 00515 } 00516 else if((target_x<0)&&(target_y>0)) 00517 { 00518 target_vy = 0.6; 00519 target_vx = -1*target_vy; 00520 } 00521 else if((target_x>0)&&(target_y<0)) 00522 { 00523 target_vy = -0.6; 00524 target_vx = -1*target_vy; 00525 } 00526 else if((target_x>0)&&(target_y>0)) 00527 { 00528 target_vy = 0.6; 00529 target_vx = target_vy; 00530 } 00531 } 00532 //mencari kecepatan sudut tiap roda berdasarkan target kecepatan translasi 00533 target_depan_kiri = (1/radius)*(sin(45.0f*rtd)*target_vx + cos(45.0f*rtd)*target_vy); 00534 target_depan_kanan = (1/radius)*(sin(135.0f*rtd)*target_vx + cos(135.0f*rtd)*target_vy); 00535 target_belakang_kanan = (1/radius)*(sin(225.0f*rtd)*target_vx + cos(225.0f*rtd)*target_vy); 00536 target_belakang_kiri = (1/radius)*(sin(315.0f*rtd)*target_vx + cos(315.0f*rtd)*target_vy); 00537 target_depan_kiri = (target_depan_kiri*624.0f)/(2.0f*3.14); 00538 target_depan_kanan = (target_depan_kanan*624.0f)/(2.0f*3.14); 00539 target_belakang_kiri = (target_belakang_kiri*624.0f)/(2.0f*3.14); 00540 target_belakang_kanan = (target_belakang_kanan*624.0f)/(2.0f*3.14); 00541 //mengambil arah gerak motor 00542 arah_depan_kiri = cari_abs(target_depan_kiri); 00543 arah_depan_kanan = cari_abs(target_depan_kanan); 00544 arah_belakang_kiri = cari_abs(target_belakang_kiri); 00545 arah_belakang_kanan = cari_abs(target_belakang_kanan); 00546 } 00547 00548 void set_inverse() 00549 { 00550 //memasukkan nilai target kecepatan sudut untuk setpoint PID 00551 if(arah_depan_kanan!=0) 00552 { 00553 if(arah_depan_kiri==0) 00554 { 00555 DepanKananPID.setSetPoint(fabs(target_depan_kanan)); 00556 BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri)); 00557 BelakangKananPID.setSetPoint(0); 00558 DepanKiriPID.setSetPoint(0); 00559 } 00560 else if(arah_depan_kiri!=0) 00561 { 00562 DepanKananPID.setSetPoint(fabs(target_depan_kanan)); 00563 BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri)); 00564 BelakangKananPID.setSetPoint(fabs(target_belakang_kanan)); 00565 DepanKiriPID.setSetPoint(fabs(target_depan_kiri)); 00566 } 00567 } 00568 else if(arah_depan_kiri!=0) 00569 { 00570 if(arah_depan_kanan==0) 00571 { 00572 DepanKananPID.setSetPoint(0); 00573 BelakangKiriPID.setSetPoint(0); 00574 BelakangKananPID.setSetPoint(fabs(target_belakang_kanan)); 00575 DepanKiriPID.setSetPoint(fabs(target_depan_kiri)); 00576 } 00577 else if(arah_depan_kanan!=0) 00578 { 00579 DepanKananPID.setSetPoint(fabs(target_depan_kanan)); 00580 BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri)); 00581 BelakangKananPID.setSetPoint(fabs(target_belakang_kanan)); 00582 DepanKiriPID.setSetPoint(fabs(target_depan_kiri)); 00583 } 00584 } 00585 } 00586 00587 void jalan_maju() 00588 { 00589 t_jalan.reset(); 00590 t_jalan.start(); 00591 proses_kecepatan(); 00592 Get_Count(); 00593 Cari_Koordinat(); 00594 pc.printf("Jarak : %d\n", jarak); 00595 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00596 BelakangKanan.speed(BelakangKananPID.compute()*-1); 00597 BelakangKiri.speed(BelakangKiriPID.compute()); 00598 DepanKanan.speed(DepanKananPID.compute()*-1); 00599 DepanKiri.speed(DepanKiriPID.compute()); 00600 while(t_jalan.read_ms()<=20) 00601 { 00602 } 00603 t_jalan.reset(); 00604 } 00605 00606 void jalan_mundur() 00607 { 00608 t_jalan.reset(); 00609 t_jalan.start(); 00610 proses_kecepatan(); 00611 Get_Count(); 00612 Cari_Koordinat(); 00613 pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00614 pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00615 BelakangKanan.speed(BelakangKananPID.compute()); 00616 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 00617 DepanKanan.speed(DepanKananPID.compute()); 00618 DepanKiri.speed(DepanKiriPID.compute()*-1); 00619 while(t_jalan.read_ms()<=20) 00620 { 00621 } 00622 t_jalan.reset(); 00623 } 00624 00625 void jalan_kanan() 00626 { 00627 t_jalan.reset(); 00628 t_jalan.start(); 00629 proses_kecepatan(); 00630 Get_Count(); 00631 Cari_Koordinat(); 00632 pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00633 pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00634 BelakangKanan.speed(BelakangKananPID.compute()*-1); 00635 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 00636 DepanKanan.speed(DepanKananPID.compute()); 00637 DepanKiri.speed(DepanKiriPID.compute()); 00638 while(t_jalan.read_ms()<=20) 00639 { 00640 } 00641 t_jalan.reset(); 00642 } 00643 00644 void jalan_kiri() 00645 { 00646 t_jalan.reset(); 00647 t_jalan.start(); 00648 proses_kecepatan(); 00649 Get_Count(); 00650 Cari_Koordinat(); 00651 pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00652 pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00653 BelakangKanan.speed(BelakangKananPID.compute()); 00654 BelakangKiri.speed(BelakangKiriPID.compute()); 00655 DepanKanan.speed(DepanKananPID.compute()*-1); 00656 DepanKiri.speed(DepanKiriPID.compute()*-1); 00657 while(t_jalan.read_ms()<=20) 00658 { 00659 } 00660 t_jalan.reset(); 00661 } 00662 00663 void jalan_rotasi_kanan() 00664 { 00665 t_jalan.reset(); 00666 t_jalan.start(); 00667 proses_kecepatan(); 00668 Get_Count(); 00669 Cari_Koordinat(); 00670 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00671 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00672 pc.printf("Orientasi : %d\n", orientasi_2); 00673 BelakangKanan.speed(BelakangKananPID.compute()); 00674 BelakangKiri.speed(BelakangKiriPID.compute()); 00675 DepanKanan.speed(DepanKananPID.compute()); 00676 DepanKiri.speed(DepanKiriPID.compute()); 00677 while(t_jalan.read_ms()<=20) 00678 { 00679 } 00680 t_jalan.reset(); 00681 } 00682 00683 void jalan_rotasi_kiri() 00684 { 00685 t_jalan.reset(); 00686 t_jalan.start(); 00687 proses_kecepatan(); 00688 Get_Count(); 00689 Cari_Koordinat(); 00690 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00691 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00692 pc.printf("Orientasi : %d\n", orientasi_2); 00693 BelakangKanan.speed(BelakangKananPID.compute()*-1); 00694 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 00695 DepanKanan.speed(DepanKananPID.compute()*-1); 00696 DepanKiri.speed(DepanKiriPID.compute()*-1); 00697 while(t_jalan.read_ms()<=20) 00698 { 00699 } 00700 t_jalan.reset(); 00701 } 00702 00703 void berhenti() 00704 { 00705 t_jalan.reset(); 00706 t_jalan.start(); 00707 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00708 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00709 pc.printf("Orientasi : %d\n", orientasi_2); 00710 DepanKanan.brake(0); 00711 BelakangKanan.brake(0); 00712 BelakangKiri.brake(0); 00713 DepanKiri.brake(0); 00714 while(t_jalan.read_ms()<=20) 00715 { 00716 } 00717 t_jalan.reset(); 00718 } 00719 00720 void ke_setpoint_x() 00721 { 00722 if(koordinat_x_bulat<setpoint_x) 00723 { 00724 kosongkan(); 00725 while(koordinat_x_bulat<setpoint_x) 00726 { 00727 jalan_kanan(); 00728 } 00729 DepanKanan.brake(); 00730 BelakangKanan.brake(); 00731 BelakangKiri.brake(); 00732 DepanKiri.brake(); 00733 } 00734 else if(koordinat_x_bulat>setpoint_x) 00735 { 00736 kosongkan(); 00737 while(koordinat_x_bulat>setpoint_x) 00738 { 00739 jalan_kiri(); 00740 } 00741 DepanKanan.brake(); 00742 BelakangKanan.brake(); 00743 BelakangKiri.brake(); 00744 DepanKiri.brake(); 00745 } 00746 else if(koordinat_x_bulat==setpoint_x) 00747 { 00748 berhenti(); 00749 } 00750 } 00751 00752 void ke_setpoint_y() 00753 { 00754 if(koordinat_y_bulat<setpoint_y) 00755 { 00756 kosongkan(); 00757 while(koordinat_y_bulat<setpoint_y) 00758 { 00759 jalan_maju(); 00760 } 00761 DepanKanan.brake(); 00762 BelakangKanan.brake(); 00763 BelakangKiri.brake(); 00764 DepanKiri.brake(); 00765 } 00766 else if(koordinat_y_bulat>setpoint_y) 00767 { 00768 kosongkan(); 00769 while(koordinat_y>setpoint_y) 00770 { 00771 jalan_mundur(); 00772 } 00773 DepanKanan.brake(); 00774 BelakangKanan.brake(); 00775 BelakangKiri.brake(); 00776 DepanKiri.brake(); 00777 } 00778 else if(koordinat_y_bulat==setpoint_y) 00779 { 00780 berhenti(); 00781 } 00782 } 00783 00784 void mode_cepat() 00785 { 00786 target_depan_kanan = 1800.0f; 00787 target_depan_kiri = 1800.0f; 00788 target_belakang_kanan = 1800.0f; 00789 target_belakang_kiri = 1800.0f; 00790 } 00791 00792 void mode_lambat() 00793 { 00794 target_depan_kanan = 1000.0f; 00795 target_depan_kiri = 1000.0f; 00796 target_belakang_kanan = 1000.0f; 00797 target_belakang_kiri = 1000.0f; 00798 } 00799 00800 00801 void ke_target_orientasi() 00802 { 00803 if(orientasi_2>target_orientasi) 00804 { 00805 kosongkan(); 00806 while(orientasi_2<target_orientasi) 00807 { 00808 jalan_rotasi_kiri(); 00809 } 00810 DepanKanan.brake(); 00811 BelakangKanan.brake(); 00812 BelakangKiri.brake(); 00813 DepanKiri.brake(); 00814 } 00815 else if(orientasi_2<target_orientasi) 00816 { 00817 kosongkan(); 00818 while(orientasi_2>target_orientasi) 00819 { 00820 jalan_rotasi_kanan(); 00821 } 00822 DepanKanan.brake(); 00823 BelakangKanan.brake(); 00824 BelakangKiri.brake(); 00825 DepanKiri.brake(); 00826 } 00827 else if(orientasi_2==target_orientasi) 00828 { 00829 berhenti(); 00830 } 00831 } 00832 00833 void ke_target_orientasi2() 00834 { 00835 while(orientasi_2<target_orientasi) 00836 { 00837 jalan_rotasi_kiri(); 00838 if(orientasi_2 == target_orientasi) 00839 { 00840 berhenti(); 00841 } 00842 } 00843 while(orientasi_2>target_orientasi) 00844 { 00845 jalan_rotasi_kanan(); 00846 if(orientasi_2 == target_orientasi) 00847 { 00848 berhenti(); 00849 } 00850 } 00851 } 00852 00853 void jalan_inverse() 00854 { 00855 if((arah_depan_kiri==0)&&(arah_belakang_kanan==0)==1) 00856 { 00857 BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri); 00858 DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan); 00859 } 00860 else if((arah_depan_kanan==0)&&(arah_belakang_kiri==0)==1) 00861 { 00862 BelakangKanan.speed(BelakangKiriPID.compute()*arah_belakang_kanan); 00863 DepanKiri.speed(DepanKananPID.compute()*arah_depan_kiri); 00864 } 00865 else if(arah_depan_kiri!=0) 00866 { 00867 if(arah_depan_kanan!=0) 00868 { 00869 BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri); 00870 DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan); 00871 BelakangKanan.speed(BelakangKiriPID.compute()*arah_belakang_kanan); 00872 DepanKiri.speed(DepanKananPID.compute()*arah_depan_kiri); 00873 } 00874 } 00875 } 00876 00877 void cari_koin1() 00878 { 00879 target_orientasi = 180; 00880 ke_target_orientasi(); 00881 while(jarak>=23) 00882 { 00883 //jarak = ultra.read(); 00884 jalan_maju(); 00885 } 00886 //while(jarak<=20) 00887 //{ 00888 // jalan_maju(); 00889 //} 00890 //while(eksistensi_koin!=0) 00891 //{ 00892 // jalan_kanan(); 00893 //} 00894 } 00895 00896 float sensor(){ 00897 float jarak2; 00898 int durasi; 00899 trigPin1=1; 00900 t.reset(); 00901 wait_us(10); 00902 trigPin1=0; 00903 while (echoPin1 == 0){ 00904 }t.start(); 00905 while (echoPin1 == 1) 00906 { 00907 } 00908 t.stop(); 00909 durasi = t.read_us(); 00910 jarak2 = (double)(durasi) / 29.0f /2.0f ; // 29 kecepatan suara di udara (2.9 detik untuk 1 kilometer), dibagi 2 karena bolak-balik 00911 return jarak2; 00912 } 00913 00914 void cari_koin2() 00915 { 00916 while(orientasi != 180) 00917 { 00918 ke_target_orientasi(); 00919 } 00920 while(jarak>=23) 00921 { 00922 //jarak = ultra.read(); 00923 jalan_maju(); 00924 } 00925 //while(eksistensi_koin!=0) 00926 //{ 00927 // jalan_kanan(); 00928 //} 00929 } 00930 00931 int main() 00932 { 00933 pc.baud(38400); 00934 bluetooth.baud(9600); 00935 bluetooth.attach(&fungsi_bluetooth, Serial::RxIrq); 00936 00937 BEARING_Register = 0x02; 00938 DepanKanan.period(0.01f); 00939 BelakangKanan.period(0.01f); 00940 BelakangKiri.period(0.01f); //Set motor PWM periods to 20KHz. 00941 DepanKiri.period(0.01f); 00942 00943 DepanKananPID.setInputLimits(0, 3000);//Input units: counts per second. 00944 DepanKananPID.setOutputLimits(0.0, 0.9);//Output units: PwmOut duty cycle as %. 00945 DepanKananPID.setMode(AUTO_MODE); 00946 00947 BelakangKananPID.setInputLimits(0, 3000); 00948 BelakangKananPID.setOutputLimits(0.0, 0.9); 00949 BelakangKananPID.setMode(AUTO_MODE); 00950 00951 BelakangKiriPID.setInputLimits(0, 3000); 00952 BelakangKiriPID.setOutputLimits(0.0, 0.9); 00953 BelakangKiriPID.setMode(AUTO_MODE); 00954 00955 DepanKiriPID.setInputLimits(0, 3000); 00956 DepanKiriPID.setOutputLimits(0.0, 0.9); 00957 DepanKiriPID.setMode(AUTO_MODE); 00958 00959 DepanKananPID.setSetPoint(1400); 00960 BelakangKananPID.setSetPoint(1400); 00961 BelakangKiriPID.setSetPoint(1400); 00962 DepanKiriPID.setSetPoint(1400); 00963 sudut_awal = Get_Yaw(); 00964 while(1) 00965 { 00966 00967 if(Jalan == Jalan_Maju) 00968 { 00969 DepanKananPID.setSetPoint(target_depan_kanan); 00970 BelakangKananPID.setSetPoint(target_belakang_kanan); 00971 BelakangKiriPID.setSetPoint(target_belakang_kiri); 00972 DepanKiriPID.setSetPoint(target_depan_kiri); 00973 kosongkan(); 00974 while(Jalan== Jalan_Maju) 00975 { 00976 t_jalan.reset(); 00977 t_jalan.start(); 00978 proses_kecepatan(); 00979 Get_Count(); 00980 Cari_Koordinat(); 00981 pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 00982 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 00983 pc.printf("Orientasi : %f\n", orientasi); 00984 BelakangKanan.speed(BelakangKananPID.compute()*-1); 00985 BelakangKiri.speed(BelakangKiriPID.compute()); 00986 DepanKanan.speed(DepanKananPID.compute()*-1); 00987 DepanKiri.speed(DepanKiriPID.compute()); 00988 while(t_jalan.read_ms()<=20) 00989 { 00990 } 00991 t_jalan.reset(); 00992 } 00993 DepanKanan.brake(); 00994 BelakangKanan.brake(); 00995 BelakangKiri.brake(); 00996 DepanKiri.brake(); 00997 } 00998 00999 else if(Jalan == Jalan_Mundur) 01000 { 01001 DepanKananPID.setSetPoint(target_depan_kanan); 01002 BelakangKananPID.setSetPoint(target_belakang_kanan); 01003 BelakangKiriPID.setSetPoint(target_belakang_kiri); 01004 DepanKiriPID.setSetPoint(target_depan_kiri); 01005 kosongkan(); 01006 while(Jalan== Jalan_Mundur) 01007 { 01008 t_jalan.reset(); 01009 t_jalan.start(); 01010 proses_kecepatan(); 01011 Get_Count(); 01012 Cari_Koordinat(); 01013 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01014 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01015 pc.printf("Orientasi : %f\n", orientasi); 01016 BelakangKanan.speed(BelakangKananPID.compute()); 01017 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01018 DepanKanan.speed(DepanKananPID.compute()); 01019 DepanKiri.speed(DepanKiriPID.compute()*-1); 01020 while(t_jalan.read_ms()<=20) 01021 { 01022 } 01023 t_jalan.reset(); 01024 } 01025 DepanKanan.brake(); 01026 BelakangKanan.brake(); 01027 BelakangKiri.brake(); 01028 DepanKiri.brake(); 01029 } 01030 01031 else if(Jalan == Jalan_Kiri) 01032 { 01033 DepanKananPID.setSetPoint(target_depan_kanan); 01034 BelakangKananPID.setSetPoint(target_belakang_kanan); 01035 BelakangKiriPID.setSetPoint(target_belakang_kiri); 01036 DepanKiriPID.setSetPoint(target_depan_kiri); 01037 kosongkan(); 01038 while(Jalan== Jalan_Kiri) 01039 { 01040 t_jalan.reset(); 01041 t_jalan.start(); 01042 proses_kecepatan(); 01043 Get_Count(); 01044 Cari_Koordinat(); 01045 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01046 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01047 pc.printf("Orientasi : %f\n", orientasi); 01048 BelakangKanan.speed(BelakangKananPID.compute()); 01049 BelakangKiri.speed(BelakangKiriPID.compute()); 01050 DepanKanan.speed(DepanKananPID.compute()*-1); 01051 DepanKiri.speed(DepanKiriPID.compute()*-1); 01052 while(t_jalan.read_ms()<=20) 01053 { 01054 } 01055 t_jalan.reset(); 01056 } 01057 DepanKanan.brake(); 01058 BelakangKanan.brake(); 01059 BelakangKiri.brake(); 01060 DepanKiri.brake(); 01061 } 01062 else if(Jalan == Jalan_Kanan) 01063 { 01064 DepanKananPID.setSetPoint(target_depan_kanan); 01065 BelakangKananPID.setSetPoint(target_belakang_kanan); 01066 BelakangKiriPID.setSetPoint(target_belakang_kiri); 01067 DepanKiriPID.setSetPoint(target_depan_kiri); 01068 kosongkan(); 01069 while(Jalan== Jalan_Kanan) 01070 { 01071 t_jalan.reset(); 01072 t_jalan.start(); 01073 proses_kecepatan(); 01074 Get_Count(); 01075 Cari_Koordinat(); 01076 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01077 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01078 pc.printf("Orientasi : %f\n", orientasi); 01079 BelakangKanan.speed(BelakangKananPID.compute()*-1); 01080 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01081 DepanKanan.speed(DepanKananPID.compute()); 01082 DepanKiri.speed(DepanKiriPID.compute()); 01083 while(t_jalan.read_ms()<=20) 01084 { 01085 } 01086 t_jalan.reset(); 01087 } 01088 DepanKanan.brake(1); 01089 BelakangKanan.brake(1); 01090 BelakangKiri.brake(1); 01091 DepanKiri.brake(1); 01092 } 01093 01094 else if(Jalan == Rotasi_Kanan) 01095 { 01096 DepanKananPID.setSetPoint(target_depan_kanan-800.0f); 01097 BelakangKananPID.setSetPoint(target_belakang_kanan-800.0f); 01098 BelakangKiriPID.setSetPoint(target_belakang_kiri-800.0f); 01099 DepanKiriPID.setSetPoint(target_depan_kiri-800.0f); 01100 kosongkan(); 01101 while(Jalan== Rotasi_Kanan) 01102 { 01103 t_jalan.reset(); 01104 t_jalan.start(); 01105 proses_kecepatan(); 01106 Get_Count(); 01107 Cari_Koordinat(); 01108 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01109 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01110 pc.printf("Orientasi : %f\n", orientasi); 01111 BelakangKanan.speed(BelakangKananPID.compute()); 01112 BelakangKiri.speed(BelakangKiriPID.compute()); 01113 DepanKanan.speed(DepanKananPID.compute()); 01114 DepanKiri.speed(DepanKiriPID.compute()); 01115 while(t_jalan.read_ms()<=20) 01116 { 01117 } 01118 t_jalan.reset(); 01119 } 01120 DepanKanan.brake(); 01121 BelakangKanan.brake(); 01122 BelakangKiri.brake(); 01123 DepanKiri.brake(); 01124 } 01125 01126 else if(Jalan == Rotasi_Kiri) 01127 { 01128 DepanKananPID.setSetPoint(target_depan_kanan-800.0f); 01129 BelakangKananPID.setSetPoint(target_belakang_kanan-800.0f); 01130 BelakangKiriPID.setSetPoint(target_belakang_kiri-800.0f); 01131 DepanKiriPID.setSetPoint(target_depan_kiri-800.0f); 01132 kosongkan(); 01133 while(Jalan== Rotasi_Kiri) 01134 { 01135 t_jalan.reset(); 01136 t_jalan.start(); 01137 proses_kecepatan(); 01138 Get_Count(); 01139 Cari_Koordinat(); 01140 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01141 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01142 pc.printf("Orientasi : %f\n", orientasi); 01143 BelakangKanan.speed(BelakangKananPID.compute()*-1); 01144 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01145 DepanKanan.speed(DepanKananPID.compute()*-1); 01146 DepanKiri.speed(DepanKiriPID.compute()*-1); 01147 while(t_jalan.read_ms()<=20) 01148 { 01149 } 01150 t_jalan.reset(); 01151 } 01152 DepanKanan.brake(); 01153 BelakangKanan.brake(); 01154 BelakangKiri.brake(); 01155 DepanKiri.brake(); 01156 } 01157 01158 else if(Jalan == Belok_Kanan) 01159 { 01160 DepanKananPID.setSetPoint(target_depan_kanan-1000.0f); 01161 BelakangKananPID.setSetPoint(target_belakang_kanan-1000.0f); 01162 BelakangKiriPID.setSetPoint(target_belakang_kiri); 01163 DepanKiriPID.setSetPoint(target_depan_kiri); 01164 kosongkan(); 01165 while(Jalan== Belok_Kanan) 01166 { 01167 t_jalan.reset(); 01168 t_jalan.start(); 01169 proses_kecepatan(); 01170 Get_Count(); 01171 Cari_Koordinat(); 01172 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01173 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01174 pc.printf("Orientasi : %f\n", orientasi); 01175 BelakangKanan.speed(BelakangKananPID.compute()*-1); 01176 BelakangKiri.speed(BelakangKiriPID.compute()); 01177 DepanKanan.speed(DepanKananPID.compute()*-1); 01178 DepanKiri.speed(DepanKiriPID.compute()); 01179 while(t_jalan.read_ms()<=20) 01180 { 01181 } 01182 t_jalan.reset(); 01183 } 01184 DepanKanan.brake(); 01185 BelakangKanan.brake(); 01186 BelakangKiri.brake(); 01187 DepanKiri.brake(); 01188 } 01189 01190 else if(Jalan == Mundur_Belok_Kanan) 01191 { 01192 DepanKananPID.setSetPoint(target_depan_kanan-1000.0f); 01193 BelakangKananPID.setSetPoint(target_belakang_kanan-1000.0f); 01194 BelakangKiriPID.setSetPoint(target_belakang_kiri); 01195 DepanKiriPID.setSetPoint(target_depan_kiri); 01196 kosongkan(); 01197 while(Jalan== Mundur_Belok_Kanan) 01198 { 01199 t_jalan.reset(); 01200 t_jalan.start(); 01201 proses_kecepatan(); 01202 Get_Count(); 01203 Cari_Koordinat(); 01204 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01205 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01206 pc.printf("Orientasi : %f\n", orientasi); 01207 BelakangKanan.speed(BelakangKananPID.compute()); 01208 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01209 DepanKanan.speed(DepanKananPID.compute()); 01210 DepanKiri.speed(DepanKiriPID.compute()*-1); 01211 while(t_jalan.read_ms()<=20) 01212 { 01213 } 01214 t_jalan.reset(); 01215 } 01216 DepanKanan.brake(); 01217 BelakangKanan.brake(); 01218 BelakangKiri.brake(); 01219 DepanKiri.brake(); 01220 } 01221 01222 else if(Jalan == Mundur_Belok_Kiri) 01223 { 01224 DepanKananPID.setSetPoint(target_depan_kanan); 01225 BelakangKananPID.setSetPoint(target_belakang_kanan); 01226 BelakangKiriPID.setSetPoint(target_belakang_kiri-1000.0f); 01227 DepanKiriPID.setSetPoint(target_depan_kiri-1000.0f); 01228 kosongkan(); 01229 while(Jalan== Mundur_Belok_Kiri) 01230 { 01231 t_jalan.reset(); 01232 t_jalan.start(); 01233 proses_kecepatan(); 01234 Get_Count(); 01235 Cari_Koordinat(); 01236 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01237 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01238 pc.printf("Orientasi : %f\n", orientasi); 01239 BelakangKanan.speed(BelakangKananPID.compute()); 01240 BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01241 DepanKanan.speed(DepanKananPID.compute()); 01242 DepanKiri.speed(DepanKiriPID.compute()*-1); 01243 while(t_jalan.read_ms()<=20) 01244 { 01245 } 01246 t_jalan.reset(); 01247 } 01248 DepanKanan.brake(); 01249 BelakangKanan.brake(); 01250 BelakangKiri.brake(); 01251 DepanKiri.brake(); 01252 } 01253 01254 else if(Jalan == Belok_Kiri) 01255 { 01256 DepanKananPID.setSetPoint(target_depan_kanan); 01257 BelakangKananPID.setSetPoint(target_belakang_kanan); 01258 BelakangKiriPID.setSetPoint(target_belakang_kiri-1000); 01259 DepanKiriPID.setSetPoint(target_depan_kiri-1000); 01260 kosongkan(); 01261 while(Jalan== Belok_Kiri) 01262 { 01263 t_jalan.reset(); 01264 t_jalan.start(); 01265 proses_kecepatan(); 01266 Get_Count(); 01267 Cari_Koordinat(); 01268 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01269 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01270 pc.printf("Orientasi : %f\n", orientasi); 01271 BelakangKanan.speed(BelakangKananPID.compute()*-1); 01272 BelakangKiri.speed(BelakangKiriPID.compute()); 01273 DepanKanan.speed(DepanKananPID.compute()*-1); 01274 DepanKiri.speed(DepanKiriPID.compute()); 01275 while(t_jalan.read_ms()<=20) 01276 { 01277 } 01278 t_jalan.reset(); 01279 } 01280 DepanKanan.brake(); 01281 BelakangKanan.brake(); 01282 BelakangKiri.brake(); 01283 DepanKiri.brake(); 01284 } 01285 01286 else if(Jalan == Muter_Kanan) 01287 { 01288 //DepanKananPID.setSetPoint(1400); 01289 BelakangKananPID.setSetPoint(1400); 01290 //BelakangKiriPID.setSetPoint(1400); 01291 DepanKiriPID.setSetPoint(1400); 01292 kosongkan(); 01293 while(Jalan== Muter_Kanan) 01294 { 01295 t_jalan.reset(); 01296 t_jalan.start(); 01297 proses_kecepatan(); 01298 Get_Count(); 01299 Cari_Koordinat(); 01300 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01301 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01302 pc.printf("Orientasi : %f\n", orientasi); 01303 BelakangKanan.speed(BelakangKananPID.compute()*-1); 01304 //BelakangKiri.speed(BelakangKiriPID.compute()*-1); 01305 //DepanKanan.speed(DepanKananPID.compute()); 01306 DepanKiri.speed(DepanKiriPID.compute()); 01307 while(t_jalan.read_ms()<=20) 01308 { 01309 } 01310 t_jalan.reset(); 01311 } 01312 DepanKanan.brake(); 01313 BelakangKanan.brake(); 01314 BelakangKiri.brake(); 01315 DepanKiri.brake(); 01316 } 01317 01318 else if(Jalan == Muter_Kiri) 01319 { 01320 DepanKananPID.setSetPoint(1400); 01321 //BelakangKananPID.setSetPoint(1400); 01322 BelakangKiriPID.setSetPoint(1400); 01323 //DepanKiriPID.setSetPoint(1400); 01324 kosongkan(); 01325 while(Jalan== Muter_Kiri) 01326 { 01327 t_jalan.reset(); 01328 t_jalan.start(); 01329 proses_kecepatan(); 01330 Get_Count(); 01331 Cari_Koordinat(); 01332 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01333 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01334 pc.printf("Orientasi : %f\n", orientasi); 01335 //BelakangKanan.speed(BelakangKananPID.compute()); 01336 BelakangKiri.speed(BelakangKiriPID.compute()*1); 01337 DepanKanan.speed(DepanKananPID.compute()*-1); 01338 //DepanKiri.speed(DepanKiriPID.compute()*-1); 01339 while(t_jalan.read_ms()<=20) 01340 { 01341 } 01342 t_jalan.reset(); 01343 } 01344 DepanKanan.brake(); 01345 BelakangKanan.brake(); 01346 BelakangKiri.brake(); 01347 DepanKiri.brake(); 01348 } 01349 01350 else if(Jalan == Ganti_Kecepatan) 01351 { 01352 if(kecepatan_state==0) 01353 { 01354 mode_lambat(); 01355 wait_ms(200); 01356 kecepatan_state =1; 01357 } 01358 else if(kecepatan_state==1) 01359 { 01360 mode_cepat(); 01361 wait_ms(200); 01362 kecepatan_state = 0; 01363 } 01364 } 01365 01366 else if(Jalan == ke_setpoint) 01367 { 01368 DepanKananPID.setSetPoint(1400); 01369 BelakangKananPID.setSetPoint(1400); 01370 BelakangKiriPID.setSetPoint(1400); 01371 DepanKiriPID.setSetPoint(1400); 01372 //while(Jalan == ke_setpoint) 01373 //{ 01374 //ke_setpoint_x(); 01375 //ke_setpoint_y(); 01376 ke_target_orientasi(); 01377 //} 01378 } 01379 else if(Jalan == mode_inverse) 01380 { 01381 kosongkan(); 01382 cari_inverse(orientasi, (float)setpoint_x, (float)setpoint_y); 01383 set_inverse(); 01384 while(Jalan == mode_inverse) 01385 { 01386 if((koordinat_x_bulat!=setpoint_x)&&(koordinat_y_bulat!=setpoint_y)) 01387 { 01388 t_jalan.reset(); 01389 t_jalan.start(); 01390 proses_kecepatan(); 01391 Get_Count(); 01392 Cari_Koordinat(); 01393 if(arah_depan_kanan!=0) 01394 { 01395 if(arah_depan_kiri==0) 01396 { 01397 BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri); 01398 DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan); 01399 BelakangKanan.brake(0); 01400 DepanKiri.brake(0); 01401 } 01402 else if(arah_depan_kiri!=0) 01403 { 01404 BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri); 01405 DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan); 01406 BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan); 01407 DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri); 01408 } 01409 } 01410 else if(arah_depan_kiri!=0) 01411 { 01412 if(arah_depan_kanan==0) 01413 { 01414 BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan); 01415 DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri); 01416 BelakangKiri.brake(0); 01417 DepanKanan.brake(0); 01418 } 01419 else if(arah_depan_kanan!=0) 01420 { 01421 BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri); 01422 DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan); 01423 BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan); 01424 DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri); 01425 } 01426 } 01427 pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01428 pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01429 pc.printf("Orientasi : %d\n", orientasi_2); 01430 //pc.printf("X basis : %f\n", target_x_basis); 01431 //pc.printf("Y basis : %f\n", target_y_basis); 01432 //pc.printf("Depan Kiri : %f\n", target_depan_kiri); 01433 //pc.printf("Depan Kanan : %f\n", target_depan_kanan); 01434 //pc.printf("Belakang Kanan : %f\n", target_belakang_kanan); 01435 //pc.printf("Belakang Kiri : %f\n", target_belakang_kiri); 01436 while(t_jalan.read_ms()<=20) 01437 { 01438 } 01439 t_jalan.reset(); 01440 } 01441 } 01442 } 01443 else if(Jalan == Capit_Buka) 01444 { 01445 if(capit_state==0) 01446 { 01447 Servo.pulsewidth_us(1230); 01448 capit_state=1; 01449 wait_ms(200); 01450 } 01451 else if(capit_state==1) 01452 { 01453 Servo.pulsewidth_us(2400); 01454 capit_state=0; 01455 wait_ms(200); 01456 } 01457 /*else if(capit_state==2) 01458 { 01459 Servo.pulsewidth_us(1500); 01460 capit_state=0; 01461 wait_ms(200); 01462 } 01463 */ 01464 } 01465 else if(Jalan == Capit_Muter) 01466 { 01467 if(capit2_state==0) 01468 { 01469 for(i=1800; i>910; i--) 01470 { 01471 t_capit.reset(); 01472 t_capit.start(); 01473 Servo2.pulsewidth_us(i); 01474 while(t_capit.read_ms()<1) 01475 { 01476 } 01477 t_capit.stop(); 01478 } 01479 capit2_state=1; 01480 } 01481 else if(capit2_state==1) 01482 { 01483 for(i=910; i<1800; i=i++) 01484 { 01485 t_capit.reset(); 01486 t_capit.start(); 01487 Servo2.pulsewidth_us(i); 01488 while(t_capit.read_us()<600) 01489 { 01490 } 01491 t_capit.stop(); 01492 } 01493 capit2_state=0; 01494 } 01495 } 01496 else if(Jalan == Cari_Koin1) 01497 { 01498 DepanKananPID.setSetPoint(1000); 01499 BelakangKananPID.setSetPoint(1000); 01500 BelakangKiriPID.setSetPoint(1000); 01501 DepanKiriPID.setSetPoint(1000); 01502 eksistensi_koin = ir.read(); 01503 jarak = sensor(); 01504 while(Jalan == Cari_Koin1) 01505 { 01506 //target_orientasi = 180; 01507 //ke_target_orientasi2(); 01508 Servo.pulsewidth_us(2290); 01509 wait_ms(100); 01510 while(jarak>16.0f) 01511 { 01512 //jalan_maju(); 01513 jarak = sensor(); 01514 jalan_maju(); 01515 } 01516 berhenti(); 01517 wait_ms(300); 01518 while(eksistensi_koin== tidak_ada) 01519 { 01520 eksistensi_koin = ir.read(); 01521 jalan_kiri(); 01522 } 01523 berhenti(); 01524 wait_ms(300); 01525 Servo.pulsewidth_us(1190); 01526 wait_ms(100); 01527 t2.reset(); 01528 t2.start(); 01529 while(t2.read_ms()<1500) 01530 { 01531 jalan_mundur(); 01532 } 01533 t2.stop(); 01534 //while(jarak<90) 01535 //{ 01536 // jalan_mundur(); 01537 // jarak = sensor(); 01538 //} 01539 //Servo2.pulsewidth_us(2200); 01540 //target_orientasi = 0; 01541 //ke_target_orientasi2(); 01542 } 01543 } 01544 else if(Jalan == Cari_Koin2) 01545 { 01546 while(Jalan == Cari_Koin2) 01547 { 01548 cari_koin2(); 01549 } 01550 } 01551 else if(Jalan == Berhenti) 01552 { 01553 kosongkan(); 01554 while(Jalan==Berhenti) 01555 { 01556 t_jalan.reset(); 01557 t_jalan.start(); 01558 proses_kecepatan(); 01559 Get_Count(); 01560 Cari_Koordinat(); 01561 //pc.printf("Koordinat X : %d\n", koordinat_x_bulat); 01562 //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat); 01563 pc.printf("Orientasi : %d\n", orientasi_2); 01564 DepanKanan.brake(0); 01565 BelakangKanan.brake(0); 01566 BelakangKiri.brake(0); 01567 DepanKiri.brake(0); 01568 while(t_jalan.read_ms()<=20) 01569 { 01570 } 01571 t_jalan.reset(); 01572 } 01573 } 01574 } 01575 }
Generated on Tue Oct 4 2022 10:50:35 by
1.7.2