Kodingan PID dan Remote tanpa Odometry dan inverse kinematics
Dependencies: MPU9250 Motor PID QEI SRF05 mbed
Revision 0:111e1d96ec2d, committed 2022-10-10
- Comitter:
- photonicbabe
- Date:
- Mon Oct 10 09:33:24 2022 +0000
- Commit message:
- Kodingan PID dan Remote tanpa odometry dan inverse kinematic
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPU9250.lib Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/Edutech/code/MPU9250/#98a0cccbc509
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Motor.lib Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/simon/code/Motor/#f265e441bcd9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PID.lib Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/aberk/code/PID/#6e12a3e5af19
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PIDremote.cpp Mon Oct 10 09:33:24 2022 +0000
@@ -0,0 +1,1683 @@
+#include "mbed.h"
+#include "Motor.h"
+#include "QEI.h"
+#include "PID.h"
+
+
+Serial pc(USBTX, USBRX);
+Serial bluetooth(PB_6, PA_10);
+//SRF05 ultra(PA_9, PC_7);
+float jarak;
+int j;
+
+DigitalOut trigPin1(PC_7); // sensor tengah
+DigitalIn echoPin1(PA_9);
+DigitalIn ir(PB_9);
+int eksistensi_koin;
+int ada = 0;
+int tidak_ada = 1;
+int i;
+int kecepatan_state;
+
+QEI DepanKananQEI(PB_8, PC_9, NC, 986); //roda depan kanan PB_1, PB_15, NC, 624
+QEI BelakangKananQEI(PB_1, PB_15, NC, 986); //roda belakang kiri PB_14, PB_13, NC, 624
+QEI DepanKiriQEI(PC_10, PC_12, NC, 986); //roda depan kiri
+QEI BelakangKiriQEI(PB_7, PA_15, NC, 986); //roda belakang kiri
+
+//PID DepanKananPID(0.8, 0.1, 0.00000001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1
+//PID BelakangKananPID(0.78, 0.1, 0.0000001, 0.02);
+//PID BelakangKiriPID(0.78, 0.1, 0.000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3
+//PID DepanKiriPID(0.87, 0.1, 0.000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4
+
+PID DepanKananPID(0.85, 0.1, 0.00001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1
+PID BelakangKananPID(0.85, 0.1, 0.0000001, 0.02);
+PID BelakangKiriPID(0.84, 0.1, 0.000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3
+PID DepanKiriPID(0.87, 0.1, 0.00001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4
+
+
+Motor DepanKanan(PC_6, PA_11, PB_12);
+Motor DepanKiri(PA_0, PB_0, PA_4);
+Motor BelakangKanan(PC_8, PC_5, PA_12);
+Motor BelakangKiri(PA_1, PC_1, PC_0);
+
+PwmOut Servo2(PA_7);
+PwmOut Servo(PB_10);
+
+Timer t_jalan;
+Timer t2;
+Timer t;
+Timer t_capit;
+
+char nilai, huruf;
+int Jalan;
+int Jalan_Maju =1;
+int Berhenti = 0;
+int Jalan_Mundur = 2;
+int Jalan_Kanan = 3;
+int Jalan_Kiri = 4;
+int ke_setpoint = 5;
+int mode_inverse = 6;
+int Rotasi_Kanan = 7;
+int Rotasi_Kiri = 8;
+int Belok_Kanan = 9;
+int Belok_Kiri = 10;
+int Muter_Kiri = 11;
+int Muter_Kanan =12;
+int Capit_Buka = 13;
+int Capit_Muter = 14;
+int Cari_Koin1 = 15;
+int Cari_Koin2 = 16;
+int Mundur_Belok_Kanan = 17;
+int Mundur_Belok_Kiri = 18;
+int Ganti_Kecepatan = 19;
+
+int DepanKananPulses = 0;
+int DepanKananPrevPulses = 0;
+float DepanKananVelocity = 0.0;
+
+int BelakangKananPulses = 0;
+int BelakangKananPrevPulses = 0;
+float BelakangKananVelocity = 0.0;
+
+int BelakangKiriPulses = 0;
+int BelakangKiriPrevPulses = 0;
+float BelakangKiriVelocity = 0.0;
+
+int DepanKiriPulses = 0;
+int DepanKiriPrevPulses = 0;
+float DepanKiriVelocity = 0.0;
+
+int Depan_Kanan_Count;
+int Depan_Kiri_Count;
+int Belakang_Kanan_Count;
+int Belakang_Kiri_Count;
+
+int d_pulse_DepanKanan;
+int d_pulse_DepanKiri;
+int d_pulse_BelakangKanan;
+int d_pulse_BelakangKiri;
+
+int koordinat_x_DepanKiri;
+int koordinat_x_DepanKanan;
+int koordinat_x_BelakangKiri;
+int koordinat_x_BelakangKanan;
+int koordinat_y_DepanKiri;
+int koordinat_y_DepanKanan;
+int koordinat_y_BelakangKiri;
+int koordinat_y_BelakangKanan;
+float koordinat_x;
+float koordinat_y;
+int Resolusi = 986;
+float pi = 3.141;
+float diameter = 5.8f;
+float rtd = pi/180.0f;
+int setpoint_x;
+int setpoint_y;
+float radius = 0.029;
+float orientasi;
+int orientasi_2;
+int target_orientasi;
+float waktu;
+int BEARING_Register;
+char bits[2];
+int _byteHigh;
+int _byteLow;
+float bearing;
+
+float target_depan_kiri;
+float target_depan_kanan;
+float target_belakang_kiri;
+float target_belakang_kanan;
+float arah_depan_kiri;
+float arah_depan_kanan;
+float arah_belakang_kiri;
+float arah_belakang_kanan;
+
+float temp_x_DepanKiri;
+float temp_x_DepanKanan;
+float temp_x_BelakangKanan;
+float temp_x_BelakangKiri;
+float temp_y_DepanKiri;
+float temp_y_DepanKanan;
+float temp_y_BelakangKanan;
+float temp_y_BelakangKiri;
+float temp_x;
+float temp_y;
+float terhadap_x;
+float terhadap_y;
+int koordinat_x_bulat;
+int koordinat_y_bulat;
+float target_x_basis;
+float target_y_basis;
+float sudut_awal;
+int capit_state;
+int capit2_state;
+
+void fungsi_bluetooth(void)
+{
+ if(bluetooth.readable())
+ {
+ setpoint_x = bluetooth.getc();
+ setpoint_y = bluetooth.getc();
+ int target_sudut = bluetooth.getc();
+ nilai = bluetooth.getc();
+ if (nilai == 'S')
+ {
+ huruf = 'S';
+ Jalan = Berhenti;
+ }
+ else if (nilai == 'F')
+ {
+ huruf = 'F';
+ Jalan = Jalan_Maju;
+ }
+ else if(nilai =='B')
+ {
+ huruf = 'B';
+ Jalan = Jalan_Mundur;
+ }
+ else if(nilai =='L')
+ {
+ huruf = 'L';
+ Jalan = Jalan_Kiri;
+ }
+ else if(nilai =='K')
+ {
+ huruf = 'K';
+ Jalan = Belok_Kiri;
+ }
+ else if(nilai =='A')
+ {
+ huruf = 'A';
+ Jalan = Belok_Kanan;
+ }
+ else if(nilai =='R')
+ {
+ huruf = 'R';
+ Jalan = Jalan_Kanan;
+ }
+ else if(nilai =='Q')
+ {
+ huruf = 'Q';
+ Jalan = Muter_Kiri;
+ }
+ else if(nilai =='E')
+ {
+ huruf = 'E';
+ Jalan = Muter_Kanan;
+ }
+ else if(nilai =='M')
+ {
+ huruf = 'M';
+ Jalan = Rotasi_Kanan;
+ }
+ else if(nilai =='W')
+ {
+ huruf = 'W';
+ Jalan = Rotasi_Kiri;
+ }
+ else if(nilai == 'U')
+ {
+ huruf = 'U';
+ Jalan = Mundur_Belok_Kiri;
+ }
+ else if(nilai == 'V')
+ {
+ huruf = 'V';
+ Jalan = Mundur_Belok_Kanan;
+ }
+ else if(nilai =='T')
+ {
+ huruf = 'T';
+ Jalan = Capit_Buka;
+ }
+ else if(nilai =='O')
+ {
+ huruf = 'O';
+ Jalan = Capit_Muter;
+ }
+ else if(nilai =='J')
+ {
+ huruf = 'J';
+ Jalan = Cari_Koin1;
+ //Jalan = ke_setpoint;
+ }
+ else if(nilai =='H')
+ {
+ huruf = 'H';
+ Jalan = Cari_Koin2;
+ //Jalan = ke_setpoint;
+ }
+
+ else if(nilai =='Y')
+ {
+ huruf = 'G';
+ Jalan = ke_setpoint;
+ }
+ else if(nilai == 'G')
+ {
+ huruf = 'G';
+ Jalan = mode_inverse;
+ }
+ else if(nilai == 'X')
+ {
+ huruf = 'X';
+ Jalan = Ganti_Kecepatan;
+ }
+ else if(nilai == 'S')
+ {
+ Jalan = Berhenti;
+ }
+ else if(nilai == 'p')
+ {
+ NVIC_SystemReset();
+ }
+ }
+ else
+ {
+ Jalan = Berhenti;
+ }
+}
+
+void kosongkan()
+{
+ BelakangKananQEI.reset();
+ DepanKananQEI.reset();
+ DepanKiriQEI.reset();
+ BelakangKiriQEI.reset();
+
+ DepanKananPulses = 0;
+ DepanKananPrevPulses = 0;
+ DepanKananVelocity = 0.0;
+
+ BelakangKananPulses = 0;
+ BelakangKananPrevPulses = 0;
+ BelakangKananVelocity = 0.0;
+
+ BelakangKiriPulses = 0;
+ BelakangKiriPrevPulses = 0;
+ BelakangKiriVelocity = 0.0;
+
+ DepanKiriPulses = 0;
+ DepanKiriPrevPulses = 0;
+ DepanKiriVelocity = 0.0;
+}
+
+void proses_kecepatan()
+{
+ DepanKananPulses = DepanKananQEI.getPulses();
+ d_pulse_DepanKanan = DepanKananPulses - DepanKananPrevPulses;
+ DepanKananVelocity = (DepanKananPulses - DepanKananPrevPulses) / 0.02;
+ DepanKananPrevPulses = DepanKananPulses;
+ DepanKananPID.setProcessValue(fabs(DepanKananVelocity));
+
+ DepanKiriPulses = DepanKiriQEI.getPulses();
+ d_pulse_DepanKiri = DepanKiriPulses - DepanKiriPrevPulses;
+ DepanKiriVelocity = (DepanKiriPulses - DepanKiriPrevPulses) / 0.02;
+ DepanKiriPrevPulses = DepanKiriPulses;
+ DepanKiriPID.setProcessValue(fabs(DepanKiriVelocity));
+
+ BelakangKananPulses = BelakangKananQEI.getPulses();
+ d_pulse_BelakangKanan = BelakangKananPulses - BelakangKananPrevPulses;
+ BelakangKananVelocity = (BelakangKananPulses - BelakangKananPrevPulses) / 0.02;
+ BelakangKananPrevPulses = BelakangKananPulses;
+ BelakangKananPID.setProcessValue(fabs(BelakangKananVelocity));
+
+ BelakangKiriPulses = BelakangKiriQEI.getPulses();
+ d_pulse_BelakangKiri = BelakangKiriPulses - BelakangKiriPrevPulses;
+ BelakangKiriVelocity = (BelakangKiriPulses - BelakangKiriPrevPulses) / 0.02;
+ BelakangKiriPrevPulses = BelakangKiriPulses;
+ BelakangKiriPID.setProcessValue(fabs(BelakangKiriVelocity));
+}
+
+void Get_Count()
+{
+ Depan_Kanan_Count = Depan_Kanan_Count + d_pulse_DepanKanan;
+ Depan_Kiri_Count = Depan_Kiri_Count + d_pulse_DepanKiri;
+ Belakang_Kanan_Count = Belakang_Kanan_Count + d_pulse_BelakangKanan;
+ Belakang_Kiri_Count = Belakang_Kiri_Count + d_pulse_BelakangKiri;
+
+ temp_y_DepanKiri = ((double)d_pulse_DepanKiri/(double)Resolusi)*pi*diameter*cos(45.0f*rtd);
+ temp_y_DepanKanan = ((double)d_pulse_DepanKanan/(double)Resolusi)*pi*diameter*cos(135.0f*rtd);
+ temp_y_BelakangKanan = ((double)d_pulse_BelakangKanan/(double)Resolusi)*pi*diameter*cos(225.0f*rtd);
+ temp_y_BelakangKiri = ((double)d_pulse_BelakangKiri/(double)Resolusi)*pi*diameter*cos(315.0f*rtd);
+
+ temp_x_DepanKiri = ((double)d_pulse_DepanKiri/(double)Resolusi)*pi*diameter*sin(45.0f*rtd);
+ temp_x_DepanKanan = ((double)d_pulse_DepanKanan/(double)Resolusi)*pi*diameter*sin(135.0f*rtd);
+ temp_x_BelakangKanan = ((double)d_pulse_BelakangKanan/(double)Resolusi)*pi*diameter*sin(225.0f*rtd);
+ temp_x_BelakangKiri = ((double)d_pulse_BelakangKiri/(double)Resolusi)*pi*diameter*sin(315.0f*rtd);
+
+ temp_x = (temp_x_DepanKiri + temp_x_DepanKanan + temp_x_BelakangKiri + temp_x_BelakangKanan)/2;
+ temp_y = (temp_y_DepanKiri + temp_y_DepanKanan + temp_y_BelakangKiri + temp_y_BelakangKanan)/2;
+
+ terhadap_x = -1*(double)temp_y*sin(orientasi*rtd) + (double)temp_x*cos(orientasi*rtd);
+ terhadap_y = (double)temp_y*cos(orientasi*rtd) + (double)temp_x*sin(orientasi*rtd);
+}
+
+void Cari_Koordinat()
+{
+ orientasi = 0;
+ orientasi_2 = orientasi;
+
+ koordinat_y = koordinat_y + terhadap_y;
+ koordinat_x = koordinat_x + terhadap_x;
+ koordinat_x_bulat = koordinat_x;
+ koordinat_y_bulat = koordinat_y;
+}
+
+float cari_abs(float a)
+{
+ if(a<0)
+ {
+ if(fabs(a)<20)
+ {
+ return 0.0f;
+ }
+ else if(fabs(a)>=20)
+ {
+ return -1.0f;
+ }
+ }
+ else if(a>0)
+ {
+ if(fabs(a)<20)
+ {
+ return 0.0f;
+ }
+ else if(fabs(a)>=20)
+ {
+ return 1.0f;
+ }
+ }
+ else
+ {
+ return 0.0f;
+ }
+}
+
+void cari_inverse(float setpoint_sudut, float target_x, float target_y)
+{
+ //mengganti basis vektor berdasarkan sudut(rotasi axis)
+ setpoint_sudut = setpoint_sudut*rtd;
+ target_x = target_x - koordinat_x;
+ target_y = target_y - koordinat_y;
+ target_x_basis = target_x*cos(setpoint_sudut*-1.0f) - target_y*sin(setpoint_sudut*-1.0f);
+ target_y_basis = target_x*sin(setpoint_sudut*-1.0f) + target_y*cos(setpoint_sudut*-1.0f);
+ target_x = target_x_basis;
+ target_y = target_y_basis;
+ //meengganti satuan target
+ float target_vx;
+ float target_vy;
+ target_x = (double)target_x/100.0f;
+ target_y = (double)target_y/100.0f;
+ //mencari target kecepatan translasi dari robot
+ //maks kecepatan translasi per aksis 0.6 m/s
+ if(fabs(target_x)>fabs(target_y))
+ {
+ if((target_x<0)&&(target_y<0))
+ {
+ target_vx = -0.6;
+ target_vy = ((double)target_y/(double)target_x)*target_vx;
+ }
+ else if((target_x<0)&&(target_y>0))
+ {
+ target_vx = -0.6;
+ target_vy = ((double)target_y/(double)target_x)*target_vx;
+ }
+ else if((target_x>0)&&(target_y>0))
+ {
+ target_vx = 0.6;
+ target_vy = ((double)target_y/(double)target_x)*target_vx;
+ }
+ else if((target_x>0)&&(target_y<0))
+ {
+ target_vx = 0.6;
+ target_vy = ((double)target_y/(double)target_x)*target_vx;
+ }
+ else if((target_y==0)&&(target_x>0))
+ {
+ target_vx = 0.6;
+ target_vy = 0;
+ }
+ else if((target_y==0)&&(target_x<0))
+ {
+ target_vx = -0.6;
+ target_vy = 0;
+ }
+ }
+ else if(fabs(target_x)<fabs(target_y))
+ {
+ if((target_x<0)&&(target_y<0))
+ {
+ target_vy = -0.6;
+ target_vx = ((double)target_x/(double)target_y)*target_vy;
+ }
+ else if((target_x<0)&&(target_y>0))
+ {
+ target_vy = 0.6;
+ target_vx = ((double)target_x/(double)target_y)*target_vy;
+ }
+ else if((target_x>0)&&(target_y>0))
+ {
+ target_vy = 0.6;
+ target_vx = ((double)target_x/(double)target_y)*target_vy;
+ }
+ else if((target_x>0)&&(target_y<0))
+ {
+ target_vy = -0.6;
+ target_vx = ((double)target_x/(double)target_y)*target_vy;
+ }
+ else if((target_x==0)&&(target_y>0))
+ {
+ target_vy = 0.6;
+ target_vx = 0;
+ }
+ else if((target_x==0)&&(target_y<0))
+ {
+ target_vy = -0.6;
+ target_vx = 0;
+ }
+ }
+ else if(fabs(target_x)==fabs(target_y))
+ {
+ if((target_x<0)&&(target_y<0))
+ {
+ target_vy = -0.6;
+ target_vx = target_vy;
+ }
+ else if((target_x<0)&&(target_y>0))
+ {
+ target_vy = 0.6;
+ target_vx = -1*target_vy;
+ }
+ else if((target_x>0)&&(target_y<0))
+ {
+ target_vy = -0.6;
+ target_vx = -1*target_vy;
+ }
+ else if((target_x>0)&&(target_y>0))
+ {
+ target_vy = 0.6;
+ target_vx = target_vy;
+ }
+ }
+ //mencari kecepatan sudut tiap roda berdasarkan target kecepatan translasi
+ target_depan_kiri = (1/radius)*(sin(45.0f*rtd)*target_vx + cos(45.0f*rtd)*target_vy);
+ target_depan_kanan = (1/radius)*(sin(135.0f*rtd)*target_vx + cos(135.0f*rtd)*target_vy);
+ target_belakang_kanan = (1/radius)*(sin(225.0f*rtd)*target_vx + cos(225.0f*rtd)*target_vy);
+ target_belakang_kiri = (1/radius)*(sin(315.0f*rtd)*target_vx + cos(315.0f*rtd)*target_vy);
+ target_depan_kiri = (target_depan_kiri*624.0f)/(2.0f*3.14);
+ target_depan_kanan = (target_depan_kanan*624.0f)/(2.0f*3.14);
+ target_belakang_kiri = (target_belakang_kiri*624.0f)/(2.0f*3.14);
+ target_belakang_kanan = (target_belakang_kanan*624.0f)/(2.0f*3.14);
+ //mengambil arah gerak motor
+ arah_depan_kiri = cari_abs(target_depan_kiri);
+ arah_depan_kanan = cari_abs(target_depan_kanan);
+ arah_belakang_kiri = cari_abs(target_belakang_kiri);
+ arah_belakang_kanan = cari_abs(target_belakang_kanan);
+}
+
+void set_inverse()
+{
+ //memasukkan nilai target kecepatan sudut untuk setpoint PID
+ if(arah_depan_kanan!=0)
+ {
+ if(arah_depan_kiri==0)
+ {
+ DepanKananPID.setSetPoint(fabs(target_depan_kanan));
+ BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri));
+ BelakangKananPID.setSetPoint(0);
+ DepanKiriPID.setSetPoint(0);
+ }
+ else if(arah_depan_kiri!=0)
+ {
+ DepanKananPID.setSetPoint(fabs(target_depan_kanan));
+ BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri));
+ BelakangKananPID.setSetPoint(fabs(target_belakang_kanan));
+ DepanKiriPID.setSetPoint(fabs(target_depan_kiri));
+ }
+ }
+ else if(arah_depan_kiri!=0)
+ {
+ if(arah_depan_kanan==0)
+ {
+ DepanKananPID.setSetPoint(0);
+ BelakangKiriPID.setSetPoint(0);
+ BelakangKananPID.setSetPoint(fabs(target_belakang_kanan));
+ DepanKiriPID.setSetPoint(fabs(target_depan_kiri));
+ }
+ else if(arah_depan_kanan!=0)
+ {
+ DepanKananPID.setSetPoint(fabs(target_depan_kanan));
+ BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri));
+ BelakangKananPID.setSetPoint(fabs(target_belakang_kanan));
+ DepanKiriPID.setSetPoint(fabs(target_depan_kiri));
+ }
+ }
+}
+
+void jalan_maju()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Jarak : %d\n", jarak);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void jalan_mundur()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void jalan_mundur2()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ t_capit.reset();
+ t_capit.start();
+ Servo2.pulsewidth_us(j);
+ while(t_capit.read_us()<100)
+ {
+ }
+ t_capit.stop();
+ if(j<1800)
+ {
+ j = j+1;
+ }
+ }
+ t_jalan.reset();
+}
+
+void jalan_kanan()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void jalan_kiri()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void jalan_rotasi_kanan()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %d\n", orientasi_2);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void jalan_rotasi_kiri()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %d\n", orientasi_2);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void berhenti()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %d\n", orientasi_2);
+ DepanKanan.brake(0);
+ BelakangKanan.brake(0);
+ BelakangKiri.brake(0);
+ DepanKiri.brake(0);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+}
+
+void ke_setpoint_x()
+{
+ if(koordinat_x_bulat<setpoint_x)
+ {
+ kosongkan();
+ while(koordinat_x_bulat<setpoint_x)
+ {
+ jalan_kanan();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_x_bulat>setpoint_x)
+ {
+ kosongkan();
+ while(koordinat_x_bulat>setpoint_x)
+ {
+ jalan_kiri();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_x_bulat==setpoint_x)
+ {
+ berhenti();
+ }
+}
+
+void ke_setpoint_y()
+{
+ if(koordinat_y_bulat<setpoint_y)
+ {
+ kosongkan();
+ while(koordinat_y_bulat<setpoint_y)
+ {
+ jalan_maju();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_y_bulat>setpoint_y)
+ {
+ kosongkan();
+ while(koordinat_y>setpoint_y)
+ {
+ jalan_mundur();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_y_bulat==setpoint_y)
+ {
+ berhenti();
+ }
+}
+
+void mode_cepat()
+{
+ target_depan_kanan = 2000.0f;
+ target_depan_kiri = 2000.0f;
+ target_belakang_kanan = 2000.0f;
+ target_belakang_kiri = 2000.0f;
+}
+
+void mode_lambat()
+{
+ target_depan_kanan = 1600.0f;
+ target_depan_kiri = 1600.0f;
+ target_belakang_kanan = 1600.0f;
+ target_belakang_kiri = 1600.0f;
+}
+
+
+void ke_target_orientasi()
+{
+ if(orientasi_2>target_orientasi)
+ {
+ kosongkan();
+ while(orientasi_2<target_orientasi)
+ {
+ jalan_rotasi_kiri();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(orientasi_2<target_orientasi)
+ {
+ kosongkan();
+ while(orientasi_2>target_orientasi)
+ {
+ jalan_rotasi_kanan();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(orientasi_2==target_orientasi)
+ {
+ berhenti();
+ }
+}
+
+void ke_target_orientasi2()
+{
+ while(orientasi_2<target_orientasi)
+ {
+ jalan_rotasi_kiri();
+ if(orientasi_2 == target_orientasi)
+ {
+ berhenti();
+ }
+ }
+ while(orientasi_2>target_orientasi)
+ {
+ jalan_rotasi_kanan();
+ if(orientasi_2 == target_orientasi)
+ {
+ berhenti();
+ }
+ }
+}
+
+void jalan_inverse()
+{
+ if((arah_depan_kiri==0)&&(arah_belakang_kanan==0)==1)
+ {
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ }
+ else if((arah_depan_kanan==0)&&(arah_belakang_kiri==0)==1)
+ {
+ BelakangKanan.speed(BelakangKiriPID.compute()*arah_belakang_kanan);
+ DepanKiri.speed(DepanKananPID.compute()*arah_depan_kiri);
+ }
+ else if(arah_depan_kiri!=0)
+ {
+ if(arah_depan_kanan!=0)
+ {
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ BelakangKanan.speed(BelakangKiriPID.compute()*arah_belakang_kanan);
+ DepanKiri.speed(DepanKananPID.compute()*arah_depan_kiri);
+ }
+ }
+}
+
+void cari_koin1()
+{
+ target_orientasi = 180;
+ ke_target_orientasi();
+ while(jarak>=23)
+ {
+ //jarak = ultra.read();
+ jalan_maju();
+ }
+ //while(jarak<=20)
+ //{
+ // jalan_maju();
+ //}
+ //while(eksistensi_koin!=0)
+ //{
+ // jalan_kanan();
+ //}
+}
+
+float sensor(){
+ float jarak2;
+ int durasi;
+ trigPin1=1;
+ t.reset();
+ wait_us(10);
+ trigPin1=0;
+ while (echoPin1 == 0){
+ }t.start();
+ while (echoPin1 == 1)
+ {
+ }
+ t.stop();
+ durasi = t.read_us();
+ jarak2 = (double)(durasi) / 29.0f /2.0f ; // 29 kecepatan suara di udara (2.9 detik untuk 1 kilometer), dibagi 2 karena bolak-balik
+ return jarak2;
+}
+
+void cari_koin2()
+{
+ while(orientasi != 180)
+ {
+ ke_target_orientasi();
+ }
+ while(jarak>=23)
+ {
+ //jarak = ultra.read();
+ jalan_maju();
+ }
+ //while(eksistensi_koin!=0)
+ //{
+ // jalan_kanan();
+ //}
+}
+
+int main()
+{
+ pc.baud(38400);
+ bluetooth.baud(9600);
+ bluetooth.attach(&fungsi_bluetooth, Serial::RxIrq);
+
+ BEARING_Register = 0x02;
+ DepanKanan.period(0.01f);
+ BelakangKanan.period(0.01f);
+ BelakangKiri.period(0.01f); //Set motor PWM periods to 20KHz.
+ DepanKiri.period(0.01f);
+
+ DepanKananPID.setInputLimits(0, 3000);//Input units: counts per second.
+ DepanKananPID.setOutputLimits(0.0, 0.9);//Output units: PwmOut duty cycle as %.
+ DepanKananPID.setMode(AUTO_MODE);
+
+ BelakangKananPID.setInputLimits(0, 3000);
+ BelakangKananPID.setOutputLimits(0.0, 0.9);
+ BelakangKananPID.setMode(AUTO_MODE);
+
+ BelakangKiriPID.setInputLimits(0, 3000);
+ BelakangKiriPID.setOutputLimits(0.0, 0.9);
+ BelakangKiriPID.setMode(AUTO_MODE);
+
+ DepanKiriPID.setInputLimits(0, 3000);
+ DepanKiriPID.setOutputLimits(0.0, 0.9);
+ DepanKiriPID.setMode(AUTO_MODE);
+
+ DepanKananPID.setSetPoint(1400);
+ BelakangKananPID.setSetPoint(1400);
+ BelakangKiriPID.setSetPoint(1400);
+ DepanKiriPID.setSetPoint(1400);
+
+ target_depan_kanan = 2000.0f;
+ target_depan_kiri = 2000.0f;
+ target_belakang_kanan = 2000.0f;
+ target_belakang_kiri = 2000.0f;
+
+ Servo2.pulsewidth_us(910);
+ capit2_state = 1;
+ Servo.pulsewidth_us(1100);
+ capit_state = 1;
+ while(1)
+ {
+
+ if(Jalan == Jalan_Maju)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Jalan_Maju)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Jalan_Mundur)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Jalan_Mundur)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Jalan_Kiri)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Jalan_Kiri)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(Jalan == Jalan_Kanan)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Jalan_Kanan)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake(1);
+ BelakangKanan.brake(1);
+ BelakangKiri.brake(1);
+ DepanKiri.brake(1);
+ }
+
+ else if(Jalan == Rotasi_Kanan)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan-800.0f);
+ BelakangKananPID.setSetPoint(target_belakang_kanan-800.0f);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri-800.0f);
+ DepanKiriPID.setSetPoint(target_depan_kiri-800.0f);
+ kosongkan();
+ while(Jalan== Rotasi_Kanan)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Rotasi_Kiri)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan-800.0f);
+ BelakangKananPID.setSetPoint(target_belakang_kanan-800.0f);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri-800.0f);
+ DepanKiriPID.setSetPoint(target_depan_kiri-800.0f);
+ kosongkan();
+ while(Jalan== Rotasi_Kiri)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Belok_Kanan)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan-1000.0f);
+ BelakangKananPID.setSetPoint(target_belakang_kanan-1000.0f);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Belok_Kanan)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Mundur_Belok_Kanan)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan-1000.0f);
+ BelakangKananPID.setSetPoint(target_belakang_kanan-1000.0f);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri);
+ DepanKiriPID.setSetPoint(target_depan_kiri);
+ kosongkan();
+ while(Jalan== Mundur_Belok_Kanan)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Mundur_Belok_Kiri)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri-1000.0f);
+ DepanKiriPID.setSetPoint(target_depan_kiri-1000.0f);
+ kosongkan();
+ while(Jalan== Mundur_Belok_Kiri)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Belok_Kiri)
+ {
+ DepanKananPID.setSetPoint(target_depan_kanan);
+ BelakangKananPID.setSetPoint(target_belakang_kanan);
+ BelakangKiriPID.setSetPoint(target_belakang_kiri-1000);
+ DepanKiriPID.setSetPoint(target_depan_kiri-1000);
+ kosongkan();
+ while(Jalan== Belok_Kiri)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ BelakangKiri.speed(BelakangKiriPID.compute());
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Muter_Kanan)
+ {
+ //DepanKananPID.setSetPoint(1400);
+ BelakangKananPID.setSetPoint(1400);
+ //BelakangKiriPID.setSetPoint(1400);
+ DepanKiriPID.setSetPoint(1400);
+ kosongkan();
+ while(Jalan== Muter_Kanan)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ BelakangKanan.speed(BelakangKananPID.compute()*-1);
+ //BelakangKiri.speed(BelakangKiriPID.compute()*-1);
+ //DepanKanan.speed(DepanKananPID.compute());
+ DepanKiri.speed(DepanKiriPID.compute());
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Muter_Kiri)
+ {
+ DepanKananPID.setSetPoint(1400);
+ //BelakangKananPID.setSetPoint(1400);
+ BelakangKiriPID.setSetPoint(1400);
+ //DepanKiriPID.setSetPoint(1400);
+ kosongkan();
+ while(Jalan== Muter_Kiri)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %f\n", orientasi);
+ //BelakangKanan.speed(BelakangKananPID.compute());
+ BelakangKiri.speed(BelakangKiriPID.compute()*1);
+ DepanKanan.speed(DepanKananPID.compute()*-1);
+ //DepanKiri.speed(DepanKiriPID.compute()*-1);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+
+ else if(Jalan == Ganti_Kecepatan)
+ {
+ if(kecepatan_state==0)
+ {
+ mode_lambat();
+ wait_ms(200);
+ kecepatan_state =1;
+ }
+ else if(kecepatan_state==1)
+ {
+ mode_cepat();
+ wait_ms(200);
+ kecepatan_state = 0;
+ }
+ }
+
+ else if(Jalan == ke_setpoint)
+ {
+ DepanKananPID.setSetPoint(1400);
+ BelakangKananPID.setSetPoint(1400);
+ BelakangKiriPID.setSetPoint(1400);
+ DepanKiriPID.setSetPoint(1400);
+ //while(Jalan == ke_setpoint)
+ //{
+ //ke_setpoint_x();
+ //ke_setpoint_y();
+ ke_target_orientasi();
+ //}
+ }
+ else if(Jalan == mode_inverse)
+ {
+ kosongkan();
+ cari_inverse(orientasi, (float)setpoint_x, (float)setpoint_y);
+ set_inverse();
+ while(Jalan == mode_inverse)
+ {
+ if((koordinat_x_bulat!=setpoint_x)&&(koordinat_y_bulat!=setpoint_y))
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ if(arah_depan_kanan!=0)
+ {
+ if(arah_depan_kiri==0)
+ {
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ BelakangKanan.brake(0);
+ DepanKiri.brake(0);
+ }
+ else if(arah_depan_kiri!=0)
+ {
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan);
+ DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri);
+ }
+ }
+ else if(arah_depan_kiri!=0)
+ {
+ if(arah_depan_kanan==0)
+ {
+ BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan);
+ DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri);
+ BelakangKiri.brake(0);
+ DepanKanan.brake(0);
+ }
+ else if(arah_depan_kanan!=0)
+ {
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan);
+ DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri);
+ }
+ }
+ pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %d\n", orientasi_2);
+ //pc.printf("X basis : %f\n", target_x_basis);
+ //pc.printf("Y basis : %f\n", target_y_basis);
+ //pc.printf("Depan Kiri : %f\n", target_depan_kiri);
+ //pc.printf("Depan Kanan : %f\n", target_depan_kanan);
+ //pc.printf("Belakang Kanan : %f\n", target_belakang_kanan);
+ //pc.printf("Belakang Kiri : %f\n", target_belakang_kiri);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ }
+ }
+ else if(Jalan == Capit_Buka)
+ {
+ if(capit_state==0)
+ {
+ Servo.pulsewidth_us(1100);
+ capit_state=1;
+ wait_ms(200);
+ }
+ else if(capit_state==1)
+ {
+ Servo.pulsewidth_us(2400);
+ capit_state=0;
+ wait_ms(200);
+ }
+ /*else if(capit_state==2)
+ {
+ Servo.pulsewidth_us(1500);
+ capit_state=0;
+ wait_ms(200);
+ }
+ */
+ }
+ else if(Jalan == Capit_Muter)
+ {
+ if(capit2_state==0)
+ {
+ for(i=1800; i>910; i--)
+ {
+ t_capit.reset();
+ t_capit.start();
+ Servo2.pulsewidth_us(i);
+ while(t_capit.read_ms()<1)
+ {
+ }
+ t_capit.stop();
+ }
+ capit2_state=1;
+ }
+ else if(capit2_state==1)
+ {
+ for(i=910; i<1800; i=i++)
+ {
+ t_capit.reset();
+ t_capit.start();
+ Servo2.pulsewidth_us(i);
+ while(t_capit.read_us()<600)
+ {
+ }
+ t_capit.stop();
+ }
+ capit2_state=0;
+ }
+ }
+ else if(Jalan == Cari_Koin1)
+ {
+ DepanKananPID.setSetPoint(1000);
+ BelakangKananPID.setSetPoint(1000);
+ BelakangKiriPID.setSetPoint(1000);
+ DepanKiriPID.setSetPoint(1000);
+ eksistensi_koin = ir.read();
+ jarak = sensor();
+ while(Jalan == Cari_Koin1)
+ {
+ //target_orientasi = 180;
+ //ke_target_orientasi2();
+ if(capit2_state==0)
+ {
+ for(i=1800; i>910; i--)
+ {
+ t_capit.reset();
+ t_capit.start();
+ Servo2.pulsewidth_us(i);
+ while(t_capit.read_us()<300)
+ {
+ }
+ t_capit.stop();
+ }
+ capit2_state=1;
+ }
+ Servo.pulsewidth_us(2400);
+ wait_ms(100);
+ while(jarak>15.0f)
+ {
+ //jalan_maju();
+ jarak = sensor();
+ jalan_maju();
+ }
+ berhenti();
+ wait_ms(300);
+ DepanKananPID.setSetPoint(800);
+ BelakangKananPID.setSetPoint(800);
+ BelakangKiriPID.setSetPoint(800);
+ DepanKiriPID.setSetPoint(800);
+ while(eksistensi_koin== tidak_ada)
+ {
+ eksistensi_koin = ir.read();
+ jalan_kiri();
+ }
+ berhenti();
+ wait_ms(300);
+ Servo.pulsewidth_us(1100);
+ wait_ms(300);
+ t2.reset();
+ t2.start();
+ j = 910;
+ DepanKananPID.setSetPoint(2000);
+ BelakangKananPID.setSetPoint(2000);
+ BelakangKiriPID.setSetPoint(2000);
+ DepanKiriPID.setSetPoint(2000);
+ while(t2.read_ms()<1400)
+ {
+ jalan_mundur();
+ if(t2.read_ms()>800)
+ {
+ jalan_mundur2();
+ }
+ }
+ t2.stop();
+ capit2_state=0;
+ //while(jarak<90)
+ //{
+ // jalan_mundur();
+ // jarak = sensor();
+ //}
+ //Servo2.pulsewidth_us(2200);
+ //target_orientasi = 0;
+ //ke_target_orientasi2();
+ }
+ }
+ else if(Jalan == Cari_Koin2)
+ {
+ DepanKananPID.setSetPoint(1000);
+ BelakangKananPID.setSetPoint(1000);
+ BelakangKiriPID.setSetPoint(1000);
+ DepanKiriPID.setSetPoint(1000);
+ eksistensi_koin = ir.read();
+ jarak = sensor();
+ while(Jalan == Cari_Koin2)
+ {
+ //target_orientasi = 180;
+ //ke_target_orientasi2();
+ if(capit2_state==0)
+ {
+ for(i=1800; i>910; i--)
+ {
+ t_capit.reset();
+ t_capit.start();
+ Servo2.pulsewidth_us(i);
+ while(t_capit.read_us()<300)
+ {
+ }
+ t_capit.stop();
+ }
+ capit2_state=1;
+ }
+ Servo.pulsewidth_us(2400);
+ wait_ms(100);
+ while(jarak>16.0f)
+ {
+ //jalan_maju();
+ jarak = sensor();
+ jalan_maju();
+ }
+ berhenti();
+ wait_ms(300);
+ DepanKananPID.setSetPoint(800);
+ BelakangKananPID.setSetPoint(800);
+ BelakangKiriPID.setSetPoint(800);
+ DepanKiriPID.setSetPoint(800);
+ while(eksistensi_koin== tidak_ada)
+ {
+ eksistensi_koin = ir.read();
+ jalan_kanan();
+ }
+ berhenti();
+ wait_ms(300);
+ Servo.pulsewidth_us(1100);
+ wait_ms(300);
+ t2.reset();
+ t2.start();
+ j = 910;
+ DepanKananPID.setSetPoint(2000);
+ BelakangKananPID.setSetPoint(2000);
+ BelakangKiriPID.setSetPoint(2000);
+ DepanKiriPID.setSetPoint(2000);
+ while(t2.read_ms()<1400)
+ {
+ jalan_mundur();
+ if(t2.read_ms()>800)
+ {
+ jalan_mundur2();
+ }
+ }
+ t2.stop();
+ capit2_state=0;
+ //while(jarak<90)
+ //{
+ // jalan_mundur();
+ // jarak = sensor();
+ //}
+ //Servo2.pulsewidth_us(2200);
+ //target_orientasi = 0;
+ //ke_target_orientasi2();
+ }
+ }
+ else if(Jalan == Berhenti)
+ {
+ kosongkan();
+ while(Jalan==Berhenti)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ //pc.printf("Koordinat X : %d\n", koordinat_x_bulat);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y_bulat);
+ pc.printf("Orientasi : %d\n", orientasi_2);
+ DepanKanan.brake(0);
+ BelakangKanan.brake(0);
+ BelakangKiri.brake(0);
+ DepanKiri.brake(0);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QEI.lib Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/aberk/code/QEI/#5c2ad81551aa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SRF05.lib Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/simon/code/SRF05/#e758665e072c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Oct 10 09:33:24 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file