PID Odometry Inverse Tanpa Yaw
Dependencies: MPU9250 Motor PID QEI mbed
Revision 0:9f9e6b69aa8a, committed 24 months ago
- Comitter:
- photonicbabe
- Date:
- Mon Oct 31 12:38:10 2022 +0000
- Commit message:
- PIDOdoInverse Tanpa Yaw
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPU9250.lib Mon Oct 31 12:38:10 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 31 12:38:10 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 31 12:38:10 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 31 12:38:10 2022 +0000
@@ -0,0 +1,714 @@
+#include "mbed.h"
+#include "Motor.h"
+#include "QEI.h"
+#include "PID.h"
+
+Serial pc(USBTX, USBRX);
+Serial bluetooth(PB_6, PA_10);
+
+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(PA_15, PB_7, NC, 986); //roda belakang kiri
+
+PID DepanKananPID(0.62, 0.1, 0.00001, 0.02); //0000001 Kc, Ti, Td MOTOR baru nomor 1
+PID BelakangKananPID(0.6, 0.1, 0.000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 2
+PID BelakangKiriPID(0.89, 0.1, 0.000000000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 3
+PID DepanKiriPID(0.68, 0.1, 0.0000001, 0.02); //Kc, Ti, Td MOTOR baru nomor 4
+
+Motor DepanKanan(PA_11, PC_8, PC_6);//PB_9, PA_12, PC_5
+Motor DepanKiri(PA_0, PB_0, PA_4);
+Motor BelakangKanan(PB_9, PC_5, PA_12);//PA_11, PC_6, PC_8
+Motor BelakangKiri(PA_1, PC_0, PC_1);
+
+Timer t_jalan;
+
+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 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;
+int koordinat_x;
+int 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;
+
+float target_depan_kiri;
+float target_depan_kanan;
+float target_belakang_kiri;
+float target_belakang_kanan;
+int arah_depan_kiri;
+int arah_depan_kanan;
+int arah_belakang_kiri;
+int arah_belakang_kanan;
+
+
+void fungsi_bluetooth(void)
+{
+ if(bluetooth.readable())
+ {
+ setpoint_x = bluetooth.getc();
+ setpoint_y = 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 =='R')
+ {
+ huruf = 'R';
+ Jalan = Jalan_Kanan;
+ }
+ else if(nilai =='G')
+ {
+ huruf = 'G';
+ Jalan = ke_setpoint;
+ }
+ else if(nilai == 'Y')
+ {
+ huruf = 'G';
+ Jalan = mode_inverse;
+ }
+ else if(nilai == 'S')
+ {
+ 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;
+}
+
+void Cari_Koordinat()
+{
+ koordinat_x_DepanKiri = ((double)Depan_Kiri_Count/(double)Resolusi)*pi*diameter*cos(45.0f*rtd);
+ koordinat_x_DepanKanan = ((double)Depan_Kanan_Count/(double)Resolusi)*pi*diameter*cos(135.0f*rtd);
+ koordinat_x_BelakangKanan = ((double)Belakang_Kanan_Count/(double)Resolusi)*pi*diameter*cos(225.0f*rtd);
+ koordinat_x_BelakangKiri = ((double)Belakang_Kiri_Count/(double)Resolusi)*pi*diameter*cos(315.0f*rtd);
+
+ koordinat_y_DepanKiri = ((double)Depan_Kiri_Count/(double)Resolusi)*pi*diameter*sin(45.0f*rtd);
+ koordinat_y_DepanKanan = ((double)Depan_Kanan_Count/(double)Resolusi)*pi*diameter*sin(135.0f*rtd);
+ koordinat_y_BelakangKanan = ((double)Belakang_Kanan_Count/(double)Resolusi)*pi*diameter*sin(225.0f*rtd);
+ koordinat_y_BelakangKiri = ((double)Belakang_Kiri_Count/(double)Resolusi)*pi*diameter*sin(315.0f*rtd);
+
+ orientasi = ((double)(koordinat_x_DepanKanan + koordinat_x_BelakangKanan) - (double)(koordinat_x_DepanKiri + koordinat_x_BelakangKiri))/(4.0f*13.0f);
+ orientasi = orientasi*57.29;
+ koordinat_y = (koordinat_x_DepanKiri + koordinat_x_DepanKanan + koordinat_x_BelakangKiri + koordinat_x_BelakangKanan)/2;
+ koordinat_x = (koordinat_y_DepanKiri + koordinat_y_DepanKanan + koordinat_y_BelakangKiri + koordinat_y_BelakangKanan)/2;
+}
+
+int cari_abs(float a)
+{
+ if(a<0)
+ {
+ return -1;
+ }
+ else if(a>0)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+void cari_inverse(float setpoint_sudut, float target_x, float target_y)
+{
+ target_x = target_x - koordinat_x;
+ target_y = target_y - koordinat_y;
+ float target_vx;
+ float target_vy;
+ target_x = (double)target_x/100.0f;
+ target_y = (double)target_y/100.0f;
+ 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*-1;
+ }
+ 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*-1;
+ }
+ 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*-1;
+ }
+ 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*-1;
+ }
+ 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(target_x==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;
+ }
+ }
+ setpoint_sudut = setpoint_sudut*rtd;
+ target_depan_kiri = (1/radius)*(sin(45.0f*rtd)*target_vx + cos(45.0f*rtd)*target_vy + radius*setpoint_sudut);
+ target_depan_kanan = (1/radius)*(sin(135.0f*rtd)*target_vx + cos(135.0f*rtd)*target_vy + radius*setpoint_sudut);
+ target_belakang_kanan = (1/radius)*(sin(225.0f*rtd)*target_vx + cos(225.0f*rtd)*target_vy + radius*setpoint_sudut);
+ target_belakang_kiri = (1/radius)*(sin(315.0f*rtd)*target_vx + cos(315.0f*rtd)*target_vy + radius*setpoint_sudut);
+ 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);
+ 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()
+{
+ DepanKananPID.setSetPoint(fabs(target_depan_kanan));
+ BelakangKananPID.setSetPoint(fabs(target_belakang_kanan));
+ BelakangKiriPID.setSetPoint(fabs(target_belakang_kiri));
+ DepanKiriPID.setSetPoint(fabs(target_depan_kiri));
+}
+
+void jalan_maju()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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_kanan()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ pc.printf("Koordinat X : %d\n", koordinat_x);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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 berhenti()
+{
+ t_jalan.reset();
+ t_jalan.start();
+ pc.printf("Koordinat X : %d\n", koordinat_x);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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<setpoint_x)
+ {
+ kosongkan();
+ while(koordinat_x<setpoint_x)
+ {
+ jalan_kanan();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_x>setpoint_x)
+ {
+ kosongkan();
+ while(koordinat_x>setpoint_x)
+ {
+ jalan_kiri();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_x==setpoint_x)
+ {
+ berhenti();
+ }
+}
+
+void ke_setpoint_y()
+{
+ if(koordinat_y<setpoint_y)
+ {
+ kosongkan();
+ while(koordinat_y<setpoint_y)
+ {
+ jalan_maju();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_y>setpoint_y)
+ {
+ kosongkan();
+ while(koordinat_y>setpoint_y)
+ {
+ jalan_mundur();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(koordinat_y==setpoint_y)
+ {
+ berhenti();
+ }
+}
+
+int main()
+{
+ pc.baud(38400);
+ bluetooth.baud(9600);
+ bluetooth.attach(&fungsi_bluetooth, Serial::RxIrq);
+
+ 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);
+ while(1)
+ {
+
+ if(Jalan == Jalan_Maju)
+ {
+ 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);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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)
+ {
+ 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);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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_Kanan)
+ {
+ 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);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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 == Jalan_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);
+ //pc.printf("Koordinat Y : %d\n", koordinat_y);
+ 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 == ke_setpoint)
+ {
+ DepanKananPID.setSetPoint(1400);
+ BelakangKananPID.setSetPoint(1400);
+ BelakangKiriPID.setSetPoint(1400);
+ DepanKiriPID.setSetPoint(1400);
+ while(Jalan == ke_setpoint)
+ {
+ ke_setpoint_x();
+ ke_setpoint_y();
+ }
+ }
+ else if(Jalan == mode_inverse)
+ {
+ kosongkan();
+ cari_inverse(0, (float)setpoint_x, (float)setpoint_y);
+ set_inverse();
+ while((koordinat_x!=setpoint_x)&&(koordinat_y!=setpoint_y))
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ proses_kecepatan();
+ Get_Count();
+ Cari_Koordinat();
+ BelakangKanan.speed(BelakangKananPID.compute()*arah_belakang_kanan);
+ BelakangKiri.speed(BelakangKiriPID.compute()*arah_belakang_kiri);
+ DepanKanan.speed(DepanKananPID.compute()*arah_depan_kanan);
+ DepanKiri.speed(DepanKiriPID.compute()*arah_depan_kiri);
+ pc.printf("Koordinat X : %d\n", koordinat_x);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ while(t_jalan.read_ms()<=20)
+ {
+ }
+ t_jalan.reset();
+ }
+ DepanKanan.brake();
+ BelakangKanan.brake();
+ BelakangKiri.brake();
+ DepanKiri.brake();
+ }
+ else if(Jalan == Berhenti)
+ {
+ while(Jalan==Berhenti)
+ {
+ t_jalan.reset();
+ t_jalan.start();
+ pc.printf("Koordinat X : %d\n", koordinat_x);
+ pc.printf("Koordinat Y : %d\n", koordinat_y);
+ //pc.printf("Orientasi : %f\n", orientasi);
+ 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 31 12:38:10 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/mbed.bld Mon Oct 31 12:38:10 2022 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file