![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
utk magang
Dependencies: Motor Ultrasonic encoderKRAI mbed millis odometryKRAI pidKRAI
Diff: main.cpp
- Revision:
- 2:dea57b3f84cd
- Parent:
- 1:5e0cb74f950e
- Child:
- 3:4801d83f397c
diff -r 5e0cb74f950e -r dea57b3f84cd main.cpp --- a/main.cpp Tue Oct 17 16:27:08 2017 +0000 +++ b/main.cpp Thu Oct 19 12:39:11 2017 +0000 @@ -3,15 +3,18 @@ * Bismillahirahmanirrahim * * Updated : - * -Perhitungan PID masih error - * -encoder kanan sama encoder kiri belum kebaca. ntah kenapa + * - * * To do List : * -Coba ODOMETRY !! * -Coba baca encoder kanan dan kiri dulu * - * Last Edited by : Calmantara + * UPDATED : 18/10 + * - Dapet nilai mundur Kp = 0.00083, pwm kanan kiri = 0.4 + * - Dapet nilai maju Kp = 0.00035 + * Last Edited by : Calmantara & Robertsen **/ + //LIBRARY #include "mbed.h" @@ -22,42 +25,57 @@ /*************************** * Konstanta dan Variabel * ***************************/ - +#define PI 3.141592 +#define DRODA 100 + +//Variabel Robot +float kll_roda = (float) PI*DRODA; //variabel keliling robot + +//Primitive Function +void limitMotor(); //procedure untuk mengecek limit pwm motor +float getY(); //fungsi untuk menghitung jarak Y + //Deklarasi Motor Motor motor_depan(PB_6, PB_13, PA_10); //pwm, fwd, rev Motor motor_kanan(PB_8, PA_9, PA_5); //pwm, fwd, rev Motor motor_kiri(PB_9, PA_12, PA_11); //pwm, fwd, rev -//Variabel Motor -float pwm_kanan = 0.3; -float pwm_kiri = -0.3; -float limit_pwm = 0.7; +//Variabel Kecepatan +float pwm_kanan = 0.4; +float pwm_kiri = -0.4; +float limit_pwm = 0.8; //Variabel Serial Serial pc(USBTX, USBRX); //Deklarasi serial pc TX RX //Deklarasi Rotary Encoder encoderKRAI encMotor_depan(PC_0, PC_1, 540, encoderKRAI::X4_ENCODING); //chA, chB, revPulse, interruptType -encoderKRAI encMotor_kanan(PC_5, PC_4, 540, encoderKRAI::X4_ENCODING); //chA, chB, revPulse, interruptType -encoderKRAI encMotor_kiri(PC_7, PC_6, 540, encoderKRAI::X4_ENCODING); //chA, chB, revPulse, interruptType +encoderKRAI encMotor_kanan(PC_10, PC_11, 540, encoderKRAI::X4_ENCODING); //chA, chB, revPulse, interruptType +encoderKRAI encMotor_kiri(PC_2, PC_3, 540, encoderKRAI::X4_ENCODING); //chA, chB, revPulse, interruptType //Variabel Encoder float pulses_depan; //variabel untuk membaca nilai encoder motor depan float pulses_kanan; //variabel untuk membaca nilai encoder motor kanan float pulses_kiri; //variabel untuk membaca nilai encoder motor kiri +float delta_kaki; //variabel untuk membaca nilai delta kanan kiri +float rev_depan; //variabel untuk membaca nilai putaran roda depan +float rev_kanan; //variabel untuk membaca nilai putaran roda kanan +float rev_kiri; //variabel untuk membaca nilai putaran roda kiri //Target nilai encoder -float target_depan = 0; +float target_depan = 0; //Target untuk jumlah rotary encoder gerakan //Variabel PID_1 unsigned long int current_millis; //variabel untuk mendapatkan millis yang berjalan unsigned long int prev_millis1; //variabel untuk mendapatkan millis sebelumnya unsigned short time_sampling = 12; //variabel untuk time sampling -float max_speed = 0.4; -float min_speed = -0.4; -float kp_1 = 0.1; //variabel konstanta PID -float current_error1, prev_error1; -float speed, prev_speed; +float kp_1 = 0.00035; //variabel konstanta PID +float current_error1, prev_error1; //variabel untuk millis PID +float speed, prev_speed; //variabel untuk penambahan pwm PID + +//Variabel cari jarak +float target_jarak = 2.0; //variabel yang digunakan untuk jarak odometry +float jarak_y; //variabel untuk increment jarak y //Variabel Motor Berhenti unsigned long int prev_millis2; //variabel untuk mendapatkan millis sebelumnya @@ -72,7 +90,7 @@ pc.baud(115200); //Start Millis - wait_ms(5000); + wait_ms(3000); startMillis(); //Looping Program @@ -80,45 +98,52 @@ current_millis = millis(); /* Speed Motor */ - if(pwm_kanan > limit_pwm){ + motor_kanan.speed(pwm_kanan); + motor_kiri.speed(pwm_kiri); + + pc.printf("%f\t%f\t%f\n", speed, pulses_kanan, pulses_kiri); + + if(current_millis - prev_millis1 >= time_sampling){ + /* masuk ke perhitungan ketika sudah pada time sampling */ + pulses_kanan = (float) encMotor_kanan.getPulses(); + pulses_kiri = (float) encMotor_kiri.getPulses(); + rev_kanan = (float) encMotor_kanan.getRevolutions(); + rev_kiri = (float) encMotor_kiri.getRevolutions(); + delta_kaki = pulses_kanan + pulses_kiri; + current_error1 = target_depan - delta_kaki; + speed = prev_speed + kp_1*current_error1 + (-kp_1)*prev_error1; + /* Kondisi untuk menambahkan speed */ + pwm_kiri = pwm_kiri + speed; + pwm_kanan = pwm_kanan + speed; + prev_speed = speed; + prev_error1 = current_error1; + prev_millis1 = current_millis; + encMotor_kanan.reset(); + encMotor_kiri.reset(); + } + + if(current_millis - prev_millis2 >= (int)5000){ + pwm_kiri = 0; + pwm_kanan = 0; + } + } +} /* end of main fuction */ + +/************************************ + * Deklarasi Fungsi dan Prosedur * + ************************************/ + void limitMotor(){ + /* Prosedur yang digunakan untuk mengecek batas limit pwm motor */ + if(pwm_kanan > limit_pwm){ pwm_kanan = limit_pwm; } - else if(pwm_kanan < -limit_pwm){ + else if(pwm_kanan < (-limit_pwm)){ pwm_kanan = -limit_pwm; } if(pwm_kiri > limit_pwm){ pwm_kiri = limit_pwm; } - else if(pwm_kiri < -limit_pwm){ + else if(pwm_kiri < (-limit_pwm)){ pwm_kiri = -limit_pwm; } - motor_kanan.speed(pwm_kanan); - motor_kiri.speed(pwm_kiri); - - pc.printf("%f\t%f\t%f\n", pulses_depan, pulses_kanan, pulses_kiri); - - if(current_millis - prev_millis1 >= time_sampling){ - /* masuk ke perhitungan ketika sudah pada time sampling */ - pulses_depan = (float) encMotor_depan.getRevolutions(); //Mengambil pulses encoder - current_error1 = target_depan - pulses_depan; - speed = prev_speed + kp_1*current_error1 + (-kp_1)*prev_error1; - /* Kondisi untuk menambahkan speed */ - if(speed > max_speed){ - pwm_kiri = pwm_kiri - max_speed; - pwm_kanan = pwm_kanan - max_speed; - } - else if ( speed < min_speed){ - pwm_kiri = pwm_kiri - min_speed; - pwm_kanan = pwm_kanan - min_speed; - } - else { - pwm_kiri = pwm_kiri + speed; - pwm_kanan = pwm_kanan + speed; - } - prev_speed = speed; - prev_error1 = current_error1; - prev_millis1 = current_millis; - encMotor_depan.reset(); - } - } -} /* end of main fuction */ \ No newline at end of file + }/* end of limitMotor */ \ No newline at end of file