Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed encoderKRAI Motornew CMPS12_KRAI ping millis
Diff: main.cpp
- Revision:
- 1:a2c7dd0a0f6e
- Parent:
- 0:7ab5f1f9dcb8
- Child:
- 2:0351727f6354
- Child:
- 3:8f57f69f6e64
diff -r 7ab5f1f9dcb8 -r a2c7dd0a0f6e main.cpp
--- a/main.cpp Wed Feb 06 11:17:11 2019 +0000
+++ b/main.cpp Fri Mar 29 11:31:22 2019 +0000
@@ -1,65 +1,346 @@
-/* sensor : ultrasonic di depan kiri
- sensor 2: ultrasonic di depan kanan
- sensor 3: ultrasonic di belakang kiri
- sensor 4: ultrasonic di belakang kanan
-*/
-
+//DEKLARASI LIBRARY
#include "mbed.h"
-#include "hcsr04.h"
-#include "RGBLed.h"
-#include "LCD_DISCO_F429ZI.h"
-//#include "string.h"
+#include "millis.h"
+#include "Motor.h"
+#include "encoderKRAI.h"
+#include "CMPS12_KRAI.h"
+
+#define PULSE_TO_DEG 0.135
+#define PWM_MAX 0.85
+#define PWM_MIN -0.85
+#define TOLERANCET 1.0
+#define TS 7.0
-LCD_DISCO_F429ZI lcd;
-//Serial pc (USBTX, USBRX,115200);
+CMPS12_KRAI cmps(PB_3, PB_10, 0xc0);
+encoderKRAI encSteer(PC_2,PC_3, 538, encoderKRAI::X4_ENCODING); //encoder motor steering
+encoderKRAI encKanan(PB_9,PB_8, 538, encoderKRAI::X4_ENCODING);
+encoderKRAI encKiri(PC_11,PC_10, 538, encoderKRAI::X4_ENCODING);
+Motor motorSteer(PB_14, PC_4, PB_13); //motor arah putaran CCW ++
+Motor motorKa(PA_11, PA_7,PB_12); //motor kanan
+Motor motorKi(PB_15, PB_1, PB_2); //motor kiri
+DigitalIn Ubutton(USER_BUTTON);
+Serial pc(USBTX, USBRX, 115200);
+DigitalIn switchKi(PA_9,PullUp);
+DigitalIn switchKa(PD_2,PullUp);
+DigitalOut pneu1[2] = {(PC_6),(PC_8)}; //kanan belakang , kiri depan
+DigitalOut pneu2[2] = {(PC_5),(PC_9)}; //kiri belakang, kanan depan
+int pulsetemp;
+float theta;
+float target;
+int cp = 0;
+int brake_state = 0;
+float sum_theta_error;
+float theta_error_prev;
+float theta_target;
+float speed;
+float w;
+float theta_sp;
+float theta_error;
+float heading_temp, heading0, heading;
+double pulse = 0;
+double KI;
+int angkat;
+int bouncing = 0;
+const double KP = 0.05,
+ KI1 = 0.00000,
+ KI2 = 0.00000;
+unsigned long lastParameter, //millis utk perhintungan parameter
+ last_mt_printPID,
+ last_mt_print, //millis utk print
+ last_mt_button, //millis utk user button
+ last_start, //millis start uji coba kuda
+ lastFSM, //finite state machine millis
+ lastPWM,
+ lastMotor,
+ lastCompass,
+ lastThetaTarget;
+int start;
+int state=0;
+float pwm;
+float pwm_maju=0.0;
+float temp = 0;
+float dThetaMax = 35.0;
+float speed_maju=0;
+int ohstart = 0;
+int belok =0;
+int thetaKa;
+int thetaKi;
+int pulseLangkah;
+void hitungParameter();
+void getHeading();
+void hitungPIDTheta(double theta_sp);
+void gerakMotor();
+void tambahPWM();
+void debug();
+void gerakDepan(int end);
+void hitungOdometry();
+void hitungParameterKa();
+void hitungParameterKi();
+void initPneu();
+void angkatKaki();
+//int main(){
+// startMillis();
+// speed_maju=0.3;
+// heading0=(float)cmps.getAngle()/10;
+// while(1){
+// debug();
+// //pc.printf("TEST\n");
+// }
+//}
+
+
+int main()
+{
+ encSteer.reset();
+ startMillis();
+ theta = 0;
+ cp = 1;
+ state=0;
+ theta_sp =0;
+ ohstart=0;
+ KI = KI1;
+ angkat = 0;
+ int kanan;
+ int kiri;
+ initPneu();
+ while(1) {
+ if (millis()- last_mt_print > 15) {
+ //pc.printf("%.2f\n",speed_maju);
+ if(!switchKa) {
+ kanan = 1;
+ pc.printf("KENA ");
+ } else {
+ kanan = 0;
+ }
+ if(!switchKi) {
+ kiri = 1;
+ } else {
+ kiri = 0;
+ }
+ last_mt_print = millis();
+ pc.printf("%d %d %.2f %d \n",kiri,kanan,speed_maju, pulsetemp);
+ }
+ if(!Ubutton) { //mulai gerak maju
+ wait_ms(2000); //diam 2 detik sebelum mulai
+ ohstart = 1;
+ state=1;
+ pwm_maju = 0.8;
+ speed_maju=0.7;
+ last_start=millis();
+ }
+
+ if (millis() - last_start>15000) { //maksimal waktu kuda gerak 17 detik
+ ohstart=0;
+ }
-//D12 TRIGGER D11 ECHO
- HCSR04 sensor(PA_4, PA_5);
- HCSR04 sensor2(PC_4, PC_5);
- // HCSR04 sensor3(PA4, PA5);
- // HCSR04 sensor4(PA6, PA7);
- // DigitalOut led1(PE_10);
- // DigitalOut led2(PE_11);
- // DigitalOut led3(PE_12);
+ if (ohstart) {
+ angkatKaki();
+ if (millis() - lastFSM > 9) {
+ if (state==1) { //state maju lurus
+ theta_sp=0;
+ belok=0;
+ pwm_maju=0.80;
+ }
+ lastFSM=millis();
+ }
+ //urutan prioritas
+ if (millis() - last_mt_printPID > 7) {
+ if (!(fabs(theta_sp- theta) < TOLERANCET)) {
+ hitungPIDTheta(theta_sp);
+ }
+ last_mt_printPID = millis();
+ }
+ if (millis() - lastParameter > 5) {
+ hitungParameter();
+ hitungParameterKa();
+ hitungParameterKi();
+ lastParameter = millis();
+ }
+ if (millis() - lastMotor>4) {
+ gerakMotor();
+ lastMotor=millis();
+ }
+ }
+
+ }
+
+}
+
+void hitungParameter()
+{
+ pulse = (double)encSteer.getPulses()*PULSE_TO_DEG;
+ encSteer.reset();
+ pulseLangkah = (int)encKiri.getPulses();
+ encKiri.reset();
+ pulsetemp += pulseLangkah;
+ if(bouncing == 1) {
+ pulsetemp =0;
+ bouncing = 2;//pc.printf("kena");
+ }
+ theta += pulse;
+}
+void initPneu()
+{
+ pneu1[0]=0;
+ pneu1[1]=0;
+ pneu2[0]=0;
+ pneu2[1]=0;
+}
+
+void angkatKaki()
+{
+ if(!switchKi && bouncing == 0) {
+ bouncing = 1;
+ }
+ if (pulsetemp > 0 && pulsetemp < 150 && !angkat) {
+ pneu2[0] = 1;
+ pneu2[1] = 1;
+ angkat = 1;
+ } else if (pulsetemp > 150 && angkat) {
+ pneu2[0] = 0;
+ pneu2[1] = 0;
+ angkat = 0;
+ bouncing = 0;
+ }
+}
+
+void hitungParameterKa()
+{
+ int pulseKa = (double)encKanan.getPulses()*PULSE_TO_DEG;
+ encKanan.reset();
+
+ thetaKa += pulseKa;
+}
+
+void hitungParameterKi()
+{
+ int pulseKi = (double)encKiri.getPulses()*PULSE_TO_DEG;
+ encKiri.reset();
+
+ thetaKi += pulseKi;
+}
-int main() {
- uint8_t text[10];
- // led1=0;
- // led2=0;
- // led3=0;
- long dkiri, dkanan;
- BSP_LCD_SetFont(&Font20);
- lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN", CENTER_MODE);
- lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"INIT OK", CENTER_MODE);
- wait(3);
- while(1) {
- BSP_LCD_SetFont(&Font20);
- lcd.Clear(LCD_COLOR_BLACK);
- lcd.SetBackColor(LCD_COLOR_BLACK);
- lcd.SetTextColor(LCD_COLOR_WHITE);
- dkiri = sensor.distance();
- dkanan = sensor2.distance();
- // bkiri = sensor3.distance();
- // bkanan = sensor4.distance();
- sprintf((char*)text, "i=%d a=%d", (int *)dkiri,(int *) dkanan);
- lcd.DisplayStringAt(0, LINE(6), (uint8_t *)text, CENTER_MODE);
- //lcd.DisplayStringAt(0, LINE(5), (uint8_t *)"distance front right %d\n", dkanan, CENTER_MODE);
- /* pc.printf("distance front left %d\n",dkiri);
- pc.printf("distance front right %d\n",dkanan);
- pc.printf("distance back left %d\n",bkiri);
- pc.printf("distance back left %d\n",bkanan);*/
- // 1 sec
- wait(0.3);
- /* if ((dkanan >=150) || (dkiri>=150))
- {
- led1 = 1;
- udhbelok = 1;
+void getHeading()
+{
+ heading_temp = (cmps.getAngle()/10 - heading0); //cari perubahan sudut badan
+ if(heading_temp > 180.0 && heading_temp <= 360.0) //kondisi agar pembacaan 0 - 180 derajat
+ heading = (heading_temp - 360.0 );
+ else if(heading_temp < -180.0 && heading_temp >= -360.0)
+ heading = (heading_temp + 360.0 );
+ else
+ heading = heading_temp;
+ heading = heading*(-1); //output heading
+}
+void hitungPIDTheta(double theta_sp)
+{
+ if (theta_sp>dThetaMax)
+ theta_sp=dThetaMax;
+ theta_error = theta_sp - theta;
+ if (theta_error > 180) {
+ theta_error = theta_error - 360;
+ } else if (theta_error < -179) {
+ theta_error = theta_error + 360;
+ }
+
+ sum_theta_error += (theta_error);
+ w =KP * theta_error + KI *sum_theta_error*TS;
+ speed = w;
+ theta_error_prev = theta_error;
+
+ if(speed >= PWM_MAX) {
+ pwm = PWM_MAX;
+ } else if (speed <= PWM_MIN) {
+ pwm = PWM_MIN;
+ } else
+ pwm = speed;
+}
+void gerakMotor()
+{
+ //if ((theta_error > 1.0 && (fabs(pwm) > 0.15)))// && (state!=0)))
+ motorSteer.speed(pwm);
+// else {
+// motorSteer.speed(0.0);
+// motorSteer.brake(BRAKE_HIGH);
+// }
+
+ tambahPWM();
+ if ( (state>0) && (fabs(speed_maju) > 0.15) && (ohstart)) {
+ motorKa.speed(speed_maju);
+ motorKi.speed(speed_maju);
+ } else {
+ motorKa.speed(0);
+ motorKi.speed(0);
+ motorKa.brake(1);
+ motorKi.brake(1);
+ }
+}
+
+void tambahPWM()
+{
+ if (millis() - lastPWM>50) {
+ if (speed_maju>pwm_maju) {
+// speed_maju -=0.05;
+ } else if (speed_maju<pwm_maju) {
+ speed_maju+=0.05;
}
- if ((udhbelok==1) && (bkanan >= 100))
- {
- led1 = 0;
- led3 = 1;
- } */
}
-}
\ No newline at end of file
+ lastPWM = millis();
+}
+void debug() //program utk cek konstanta derajat
+{
+ theta = encSteer.getPulses()*PULSE_TO_DEG;
+// if (!Ubutton)
+// motorKa.speed(0.8);
+// motorKi.speed(0.8);
+// else
+// motorKa.speed(0);
+// motorKi.speed(0);
+// if (temp>20.0){
+// belok = 1;
+// }
+// if (temp<-20.0){
+// belok=0;
+// }
+// if (millis() - lastCompass>3){
+// getHeading();
+// lastCompass=millis();
+// }
+//// if (!belok)
+//// motorSteer.speed(speed_maju);
+//// else
+//// motorSteer.speed(-1*speed_maju);
+// if (!Ubutton)
+// theta_sp=20.0;
+// else
+// theta_sp=-20.0;
+//
+// if (millis() - last_mt_printPID > 7){
+// if (!(fabs(theta_sp- theta) < TOLERANCET)){
+// hitungPIDTheta(theta_sp);
+// }
+// last_mt_printPID = millis();
+// }
+// gerakMotor();
+// //motorSteer.speed(pwm);
+// printf("pulse = %.2f\t theta = %.2f theta = %.2f pidT=%.2f pwm=%.2f\n",
+// theta, heading, theta_error, w,pwm);
+}
+
+
+void hitungOdometry()
+{
+ //Tolong isi program odometry utk pisisi robot terhadap lapangan
+ //berdasarkan geometry robot dan posisi ping (asumsi ping diletakan di tengah kaki bagian luar
+ //ukuran robot minta ama mekanik
+ /* POSISI PING utk di kaki depan
+ PING PING
+ #### ####
+ # # # #
+ # # # #
+ PING# # # # PING
+ # # # #
+ # # # #
+ #### ####
+ */
+}