hari ini
Dependencies: DigitDisplay Motor PID Ping mbed millis
Fork of DagonFly__RoadToJapan_11Mei by
Diff: main.cpp
- Revision:
- 47:6cac4f1a3c8e
- Parent:
- 46:85169ae8659b
- Child:
- 48:3006386dc8df
--- a/main.cpp Mon Apr 24 14:12:08 2017 +0000 +++ b/main.cpp Sat May 13 05:47:10 2017 +0000 @@ -1,8 +1,8 @@ - +/*tuning motor baru untuk konstanta pid baru */ /****************************************************************************/ /* PROGRAM UNTUK PID CLOSED LOOP */ /* */ -/* Last Update : 16 April 2017 */ +/* Last Update : 16 April 2017 */ /* */ /* - Digunakan encoder autonics */ /* - Konfigurasi Motor dan Encoder sbb : */ @@ -56,9 +56,9 @@ // Variable Atas // indek 2 untuk motor depan, 1 untuk motor belakang double speed, speed2; -const double maxSpeed = 0.95, minSpeed = 0.0, Ts = 12.5; +const double maxSpeed = 0.95, minSpeed = -0.95, Ts = 12.5; const double kpA1=0.1478, kdA1=0.9295, kiA1=0.0004226; -const double kpA2=0.1293, kdA2=1.007, kiA2=0.0002986; +const double kpA2=0.13978, kdA2=0.9222, kiA2=0.00038636; double a1,b1,c1; double a2,b2,c2; double current_error1, previous_error1_1 = 0, previous_error1_2 = 0; @@ -67,23 +67,19 @@ double previous_speed2 = 0; float rpm, rpm2; -double target_rpm = 17.0, target_rpm2 = 17.0; // selisih 4 bagus, sama bagus +double target_rpm = 18.0, target_rpm2 = 18.0; // selisih 4 bagus, sama bagus const float maxRPM = 35, minRPM = 0; // Limit 25 atau 27 const float pwmPowerUp = 1.0; const float pwmPowerDown = -1.0; double jarak_ping=0; -double ping_target = 12; +double ping_target = 14; double ping_current_error, ping_previous_error1 = 0, ping_sum_error=0; -double ping_Kp = -0.13, ping_Kd =-0.049, ping_Ts=10; +double ping_Kp = -0.2747, ping_Kd =0, ping_Ts=10; double ping_pwm, ping_previous_pwm = 0; // Variable Bawah -float Vt; -float keliling_enc = PI*D_ENCODER; -float keliling_robot = PI*D_ROBOT; -float speedT = 0.2; float PIVOT = 0.17; // PWM Pivot Kanan, Pivot Kiri float tuneDpn = 1.0; // Tunning PWM motor Depan float tuneBlk = 1.0; // Tunning PWM motor belakang @@ -93,8 +89,8 @@ float tuneR = 1.0; float tuneL = 1.0; float serong = 0.4; -float rasio = 3.0; -float t_new = 0.25; +float rasio = 1.4545; +float t_new = 0.1; /* variable tunning */ float tunning_L; @@ -102,9 +98,6 @@ float tunning_Dpn; float tunning_Blk; -/* Variabel Encoder Bawah */ -float errTetha, Tetha; // Variabel yang didapatkan encoder - /* Deklarasi Variable Millis */ unsigned long int previousMillis = 0; // PID launcher unsigned long int currentMillis; @@ -121,6 +114,7 @@ bool isReload = false; bool ReloadOn = false; bool flag_Pneu = false; +bool flag_paku = false; bool ready = false; /*****************************************************/ @@ -132,8 +126,6 @@ void aktuator(); // Pergerakan aktuator berdasarkan case joystick int case_joystick(); // Mendapatkan case dari joystick //void speedKalibrasiMotor(); // Pertambahan target RPM motor atas melalui joystick -void setCenter(); // Prosedur reset encoder, posisi saat itu diset jadi titik (0,0) -float getTetha(); // Fungsi mendapatkan error Tetha /* Inisialisasi Pin TX-RX Joystik dan PC */ joysticknucleo joystick(PA_0,PA_1); @@ -154,12 +146,13 @@ Motor motorR (PB_8, PC_6, PC_5); //(PC_6, PB_4, PB_5); /* Deklarasi Motor Launcher */ -Motor launcherDpn(PA_5,PB_12,PA_11); // pwm ,fwd, rev +Motor launcherDpn(PA_5,PA_11,PB_12); // pwm ,fwd, rev Motor launcherBlk(PB_3, PC_4, PA_10); // pwm, fwd, rev Motor powerScrew(PB_10, PB_14, PB_13); // pwm, fwd, rev /* Deklarasi Penumatik Launcher */ DigitalOut pneumatik(PA_4, PullUp); +DigitalOut pneu_paku(PC_2, PullUp); /*Dekalrasi Limit Switch */ //DigitalIn infraAtas(PC_9, PullUp); @@ -320,6 +313,10 @@ // Power Screw Down caseJoystick = 12; } + else if (joystick.L3){ + // Paku Bumi ON/OFF + caseJoystick = 34; + } else { tuneAksel = 0.6; @@ -329,28 +326,6 @@ return(caseJoystick); } -float getTetha(){ -// Fungsi untuk mendapatkan nilai tetha - float busur, tetha; - busur = ((encoderBase.getPulses())/(float)(2000.0)*keliling_enc); - tetha = busur/keliling_robot*360; - - return -(tetha); -} - -float pidBase(float Kp, float Ki, float Kd) -{ - int errorP; - errorP = getTetha(); - if (errorP<3.5 && errorP>(-3.5)) - errorP = 0; - return (float)Kp*errorP; -} - -void setCenter(){ -// Fungsi untuk menentukan center dari robot - encoderBase.reset(); -} void init_rpm (){ if (target_rpm>maxRPM-2){ @@ -375,8 +350,8 @@ // Pivot Kanan motorDpn.speed(-PIVOT); motorBlk.speed(-PIVOT); - motorR.speed(-rasio*PIVOT); - motorL.speed(-rasio*PIVOT); + motorR.speed(-rasio*PIVOT-t_new); + motorL.speed(-rasio*PIVOT-t_new); break; } case (2): @@ -384,8 +359,8 @@ // Pivot Kiri motorDpn.speed(PIVOT); motorBlk.speed(PIVOT); - motorR.speed(rasio*PIVOT); - motorL.speed(rasio*PIVOT); + motorR.speed(rasio*PIVOT+t_new); + motorL.speed(rasio*PIVOT+t_new); break; } case (17): @@ -393,8 +368,8 @@ // Kanan + Rotasi Kanan motorDpn.speed(-PIVOT); motorBlk.speed(-PIVOT); - motorR.speed(-rasio*PIVOT); - motorL.speed(-rasio*PIVOT); + motorR.speed(-rasio*PIVOT-t_new); + motorL.speed(-rasio*PIVOT-t_new); break; } case (18): @@ -402,8 +377,8 @@ // Kanan + Rotasi Kiri motorDpn.speed(PIVOT); motorBlk.speed(PIVOT); - motorR.speed(rasio*PIVOT); - motorL.speed(rasio*PIVOT); + motorR.speed(rasio*PIVOT+t_new); + motorL.speed(rasio*PIVOT+t_new); break; } case (19): @@ -411,8 +386,8 @@ // Kiri + Rotasi Kanan motorDpn.speed(-PIVOT); motorBlk.speed(-PIVOT); - motorR.speed(-rasio*PIVOT); - motorL.speed(-rasio*PIVOT); + motorR.speed(-rasio*PIVOT-t_new); + motorL.speed(-rasio*PIVOT-t_new); break; } case (20): @@ -420,8 +395,8 @@ // Kiri + Rotasi Kiri motorDpn.speed(PIVOT); motorBlk.speed(PIVOT); - motorR.speed(rasio*PIVOT); - motorL.speed(rasio*PIVOT); + motorR.speed(rasio*PIVOT+t_new); + motorL.speed(rasio*PIVOT+t_new); break; } case (21): @@ -429,8 +404,8 @@ // Maju + Rotasi Kanan motorDpn.speed(-PIVOT); motorBlk.speed(-PIVOT); - motorR.speed(-rasio*PIVOT); - motorL.speed(-rasio*PIVOT); + motorR.speed(-rasio*PIVOT-t_new); + motorL.speed(-rasio*PIVOT-t_new); break; } case (22): @@ -438,8 +413,8 @@ // Maju + Rotasi Kiri motorDpn.speed(PIVOT); motorBlk.speed(PIVOT); - motorR.speed(rasio*PIVOT); - motorL.speed(rasio*PIVOT); + motorR.speed(rasio*PIVOT+t_new); + motorL.speed(rasio*PIVOT+t_new); break; } case (23): @@ -447,8 +422,8 @@ // Mundur + Rotasi Kanan motorDpn.speed(-PIVOT); motorBlk.speed(-PIVOT); - motorR.speed(-rasio*PIVOT); - motorL.speed(-rasio*PIVOT); + motorR.speed(-rasio*PIVOT-t_new); + motorL.speed(-rasio*PIVOT-t_new); break; } case (24): @@ -456,8 +431,8 @@ // Mundur + Rotasi Kiri motorDpn.speed(PIVOT); motorBlk.speed(PIVOT); - motorR.speed(rasio*PIVOT); - motorL.speed(rasio*PIVOT); + motorR.speed(rasio*PIVOT+t_new); + motorL.speed(rasio*PIVOT+t_new); break; } case (25): @@ -569,8 +544,8 @@ if (aksel>300) tuneAksel = 0.9; - motorR.speed(tuneAksel+t_new); - motorL.speed(-tuneAksel-t_new); + motorR.speed(tuneAksel); + motorL.speed(-tuneAksel); motorDpn.brake(1); motorBlk.brake(1); break; @@ -582,8 +557,8 @@ if (aksel>300) tuneAksel = 0.9; - motorR.speed(-tuneAksel-t_new); - motorL.speed(tuneAksel+t_new); + motorR.speed(-tuneAksel); + motorL.speed(tuneAksel); motorDpn.brake(1); motorBlk.brake(1); break; @@ -633,8 +608,8 @@ case (31) : { // start - target_rpm2 = 22; - target_rpm = 22; + target_rpm2 = 23; + target_rpm = 23; init_rpm(); break; } @@ -649,8 +624,8 @@ case (33) : { // R3 - target_rpm2 = 17; - target_rpm = 17; + target_rpm2 = 18; + target_rpm = 18; init_rpm(); break; } @@ -661,6 +636,15 @@ isReload = true; break; } + case (34) :{ + pneu_paku = !pneu_paku; + wait_ms(50); + if (pneu_paku == 1){ + PIVOT = 0.17; + }else{ + PIVOT = 0.8; + } + } default : { tuneAksel = 0.6; @@ -678,6 +662,7 @@ if(ReloadOn){ if(isReload){ powerScrew.speed(pwmPowerDown); + pc.printf("%.2f\n", jarak_ping); if((!limitBawah)||(!limitBawah1)){ isReload = false; ReloadOn = false; @@ -693,16 +678,12 @@ ping_sum_error += ping_current_error*ping_Ts; ping_pwm = (double) ping_Kp*ping_current_error + ping_Kd*(ping_current_error-ping_previous_error1)/ping_Ts; - if (ping_pwm>1) ping_pwm=1; - if (ping_pwm>0.049 && ping_pwm<0.5) ping_pwm = 0.5; - if (ping_pwm<-0.049 && ping_pwm>-0.5) ping_pwm = -0.5; - if (ping_pwm<-1) ping_pwm=-1; - + pc.printf("%.2f\n", jarak_ping); powerScrew.speed(ping_pwm); ping_previous_error1 = ping_current_error; } - if ((jarak_ping>(ping_target-3))&&(jarak_ping<(ping_target+3))){ + if ((jarak_ping>(ping_target-2))&&(jarak_ping<(ping_target+2))){ ready = true; }else{ ready = false; @@ -772,7 +753,7 @@ encLauncherDpn.reset(); previousMillis2 = currentMillis2; } - pc.printf("%.2f\t%.2f\n",rpm,rpm2); + //pc.printf("%.2f\t%.2f\n",rpm,rpm2); } else { @@ -802,8 +783,6 @@ // initializing encoder pneumatik =1; - setCenter(); - wait_ms(500); //initializing PING