bla
Dependencies: mbed
Fork of PID by
main.cpp@2:a214cf60ce58, 2018-11-01 (annotated)
- Committer:
- arayhan878
- Date:
- Thu Nov 01 17:22:26 2018 +0000
- Revision:
- 2:a214cf60ce58
- Parent:
- 1:edd7f45256f9
yang baru
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
arayhan878 | 0:1d81f3296468 | 1 | #include "mbed.h" |
arayhan878 | 0:1d81f3296468 | 2 | |
arayhan878 | 0:1d81f3296468 | 3 | ///////////////////////PID/////////////////////// |
arayhan878 | 1:edd7f45256f9 | 4 | float e, integral, derivative, preError; |
arayhan878 | 1:edd7f45256f9 | 5 | float out, output; |
arayhan878 | 1:edd7f45256f9 | 6 | float Dt = 0.01; |
arayhan878 | 1:edd7f45256f9 | 7 | float Kp = 0.13; |
arayhan878 | 2:a214cf60ce58 | 8 | float Ki = 0.024; |
arayhan878 | 2:a214cf60ce58 | 9 | float Kd = 0.0014; |
arayhan878 | 2:a214cf60ce58 | 10 | int setpoint = 120; |
arayhan878 | 1:edd7f45256f9 | 11 | ////////////////////////////////////////////////// |
arayhan878 | 1:edd7f45256f9 | 12 | ////////////////////bluetooth//////////////////// |
arayhan878 | 0:1d81f3296468 | 13 | Serial pc(USBTX, USBRX); |
arayhan878 | 1:edd7f45256f9 | 14 | Serial bt(PB_6, PB_7); |
arayhan878 | 1:edd7f45256f9 | 15 | ///////////////////////////////////////////////// |
arayhan878 | 1:edd7f45256f9 | 16 | /////////////////////motor/////////////////////// |
arayhan878 | 1:edd7f45256f9 | 17 | DigitalOut dir5(PB_8); |
arayhan878 | 1:edd7f45256f9 | 18 | DigitalOut dir6(PB_9); |
arayhan878 | 1:edd7f45256f9 | 19 | DigitalOut dir3(PC_5); |
arayhan878 | 1:edd7f45256f9 | 20 | DigitalOut dir4(PC_8); |
arayhan878 | 1:edd7f45256f9 | 21 | DigitalOut dir1(PB_12); |
arayhan878 | 1:edd7f45256f9 | 22 | DigitalOut dir2(PA_12); |
arayhan878 | 1:edd7f45256f9 | 23 | PwmOut pwm3(PC_9); |
arayhan878 | 1:edd7f45256f9 | 24 | PwmOut pwm2(PC_6); |
arayhan878 | 1:edd7f45256f9 | 25 | PwmOut pwm1(PA_11); |
arayhan878 | 1:edd7f45256f9 | 26 | //////////////////////////////////////////////// |
arayhan878 | 0:1d81f3296468 | 27 | |
arayhan878 | 0:1d81f3296468 | 28 | int count = 0; |
arayhan878 | 0:1d81f3296468 | 29 | int pos1 = 0; |
arayhan878 | 0:1d81f3296468 | 30 | int pos2 = 0; |
arayhan878 | 1:edd7f45256f9 | 31 | int co, ch, ch1; |
arayhan878 | 0:1d81f3296468 | 32 | |
arayhan878 | 0:1d81f3296468 | 33 | float roda1, roda2, roda3; |
arayhan878 | 0:1d81f3296468 | 34 | float pw1,pw2,pw3; |
arayhan878 | 1:edd7f45256f9 | 35 | float pwma1, pwma2, pwma3; |
arayhan878 | 1:edd7f45256f9 | 36 | float abs_pwm1, abs_pwm2, abs_pwm3; |
arayhan878 | 0:1d81f3296468 | 37 | double dx, dy, dz; |
arayhan878 | 0:1d81f3296468 | 38 | |
arayhan878 | 1:edd7f45256f9 | 39 | //////////////////////inverse/////////////////////// |
arayhan878 | 1:edd7f45256f9 | 40 | void atur(float x, float y, float the) |
arayhan878 | 0:1d81f3296468 | 41 | { |
arayhan878 | 0:1d81f3296468 | 42 | double a = sqrt(3.); |
arayhan878 | 0:1d81f3296468 | 43 | roda1 = 1 * ((-0.5 * x) - (a / 2 * y)) + the; |
arayhan878 | 0:1d81f3296468 | 44 | roda2 = 1 * ((-0.5 * x) + (a / 2 * y)) + the; |
arayhan878 | 0:1d81f3296468 | 45 | roda3 = 1 * (x) + the; |
arayhan878 | 0:1d81f3296468 | 46 | |
arayhan878 | 0:1d81f3296468 | 47 | if (roda1 > 255) |
arayhan878 | 0:1d81f3296468 | 48 | {pwma1 = 255;} |
arayhan878 | 0:1d81f3296468 | 49 | else if (roda1 < -255) |
arayhan878 | 0:1d81f3296468 | 50 | {pwma1 = -255;} |
arayhan878 | 0:1d81f3296468 | 51 | else pwma1 = roda1; |
arayhan878 | 0:1d81f3296468 | 52 | |
arayhan878 | 0:1d81f3296468 | 53 | if (roda2 > 255) |
arayhan878 | 0:1d81f3296468 | 54 | {pwma2 = 255;} |
arayhan878 | 0:1d81f3296468 | 55 | else if (roda2 < -255) |
arayhan878 | 0:1d81f3296468 | 56 | {pwma2 = -255;} |
arayhan878 | 0:1d81f3296468 | 57 | else pwma2 = roda2; |
arayhan878 | 0:1d81f3296468 | 58 | |
arayhan878 | 0:1d81f3296468 | 59 | if (roda3 > 255) |
arayhan878 | 0:1d81f3296468 | 60 | {pwma3 = 255;} |
arayhan878 | 0:1d81f3296468 | 61 | else if (roda3 < -255) |
arayhan878 | 0:1d81f3296468 | 62 | {pwma3 = -255;} |
arayhan878 | 0:1d81f3296468 | 63 | else pwma3 = roda3; |
arayhan878 | 0:1d81f3296468 | 64 | |
arayhan878 | 0:1d81f3296468 | 65 | if (pwma1 < 0) { |
arayhan878 | 0:1d81f3296468 | 66 | abs_pwm1 = abs(pwma1); |
arayhan878 | 2:a214cf60ce58 | 67 | pw1=(float) abs_pwm1/200; |
arayhan878 | 0:1d81f3296468 | 68 | dir1 = 1; |
arayhan878 | 0:1d81f3296468 | 69 | dir2 = 0; |
arayhan878 | 0:1d81f3296468 | 70 | } |
arayhan878 | 0:1d81f3296468 | 71 | else { |
arayhan878 | 0:1d81f3296468 | 72 | abs_pwm1 = pwma1; |
arayhan878 | 2:a214cf60ce58 | 73 | pw1=(float) abs_pwm1/200; |
arayhan878 | 0:1d81f3296468 | 74 | dir1 = 0; |
arayhan878 | 0:1d81f3296468 | 75 | dir2 = 1; |
arayhan878 | 0:1d81f3296468 | 76 | } |
arayhan878 | 0:1d81f3296468 | 77 | if (pwma2 < 0) { |
arayhan878 | 0:1d81f3296468 | 78 | abs_pwm2 = abs(pwma2); |
arayhan878 | 2:a214cf60ce58 | 79 | pw2=(float) abs_pwm2/200; |
arayhan878 | 0:1d81f3296468 | 80 | dir3 = 1; |
arayhan878 | 0:1d81f3296468 | 81 | dir4 = 0; |
arayhan878 | 0:1d81f3296468 | 82 | } |
arayhan878 | 0:1d81f3296468 | 83 | else { |
arayhan878 | 0:1d81f3296468 | 84 | abs_pwm2 = pwma2; |
arayhan878 | 2:a214cf60ce58 | 85 | pw2=(float) abs_pwm2/200; |
arayhan878 | 0:1d81f3296468 | 86 | dir3 = 0; |
arayhan878 | 0:1d81f3296468 | 87 | dir4 = 1; |
arayhan878 | 0:1d81f3296468 | 88 | } |
arayhan878 | 0:1d81f3296468 | 89 | if (pwma3 < 0) { |
arayhan878 | 0:1d81f3296468 | 90 | abs_pwm3 = abs(pwma3); |
arayhan878 | 2:a214cf60ce58 | 91 | pw3=(float) abs_pwm3/200; |
arayhan878 | 1:edd7f45256f9 | 92 | dir5 = 1; |
arayhan878 | 1:edd7f45256f9 | 93 | dir6 = 0; |
arayhan878 | 0:1d81f3296468 | 94 | } |
arayhan878 | 0:1d81f3296468 | 95 | else { |
arayhan878 | 0:1d81f3296468 | 96 | abs_pwm3 = pwma3; |
arayhan878 | 2:a214cf60ce58 | 97 | pw3=(float) abs_pwm3/200; |
arayhan878 | 1:edd7f45256f9 | 98 | dir5 = 0; |
arayhan878 | 1:edd7f45256f9 | 99 | dir6 = 1; |
arayhan878 | 0:1d81f3296468 | 100 | } |
arayhan878 | 0:1d81f3296468 | 101 | } |
arayhan878 | 0:1d81f3296468 | 102 | |
arayhan878 | 0:1d81f3296468 | 103 | void berhenti() { |
arayhan878 | 0:1d81f3296468 | 104 | pwm1 = 0.5; |
arayhan878 | 0:1d81f3296468 | 105 | pwm2 = 0.5; |
arayhan878 | 0:1d81f3296468 | 106 | pwm3 = 0.5; |
arayhan878 | 0:1d81f3296468 | 107 | dir1 = 1; |
arayhan878 | 0:1d81f3296468 | 108 | dir2 = 1; |
arayhan878 | 0:1d81f3296468 | 109 | dir3 = 1; |
arayhan878 | 0:1d81f3296468 | 110 | dir4 = 1; |
arayhan878 | 0:1d81f3296468 | 111 | dir5 = 1; |
arayhan878 | 0:1d81f3296468 | 112 | dir6 = 1; |
arayhan878 | 0:1d81f3296468 | 113 | } |
arayhan878 | 1:edd7f45256f9 | 114 | //////////////////////////////////////////////// |
arayhan878 | 0:1d81f3296468 | 115 | |
arayhan878 | 0:1d81f3296468 | 116 | int main() |
arayhan878 | 0:1d81f3296468 | 117 | { |
arayhan878 | 0:1d81f3296468 | 118 | pc.baud(9600); |
arayhan878 | 0:1d81f3296468 | 119 | bt.baud(9600); |
arayhan878 | 1:edd7f45256f9 | 120 | pc.printf("starttttttt\n"); |
arayhan878 | 1:edd7f45256f9 | 121 | |
arayhan878 | 0:1d81f3296468 | 122 | /////////////////////////////////PID/////////////////////////////// |
arayhan878 | 0:1d81f3296468 | 123 | preError = 0; |
arayhan878 | 0:1d81f3296468 | 124 | integral = 0; |
arayhan878 | 1:edd7f45256f9 | 125 | //////////////////////////////////////////////////////////////////// |
arayhan878 | 0:1d81f3296468 | 126 | |
arayhan878 | 0:1d81f3296468 | 127 | while(1) { |
arayhan878 | 1:edd7f45256f9 | 128 | |
arayhan878 | 0:1d81f3296468 | 129 | if(bt.readable()) |
arayhan878 | 0:1d81f3296468 | 130 | { |
arayhan878 | 0:1d81f3296468 | 131 | ch1 = bt.getc(); |
arayhan878 | 2:a214cf60ce58 | 132 | ch = ch1; |
arayhan878 | 2:a214cf60ce58 | 133 | if(ch != 0) |
arayhan878 | 0:1d81f3296468 | 134 | { |
arayhan878 | 2:a214cf60ce58 | 135 | |
arayhan878 | 1:edd7f45256f9 | 136 | //////////////////////////////////PID/////////////////////////////// |
arayhan878 | 1:edd7f45256f9 | 137 | e = setpoint - ch; |
arayhan878 | 1:edd7f45256f9 | 138 | integral = integral + (e * Dt); |
arayhan878 | 1:edd7f45256f9 | 139 | derivative = (e - preError) / Dt; |
arayhan878 | 1:edd7f45256f9 | 140 | output = (Kp * e) + (Ki * integral) + (Kd * derivative); |
arayhan878 | 1:edd7f45256f9 | 141 | preError = e; |
arayhan878 | 1:edd7f45256f9 | 142 | //////////////////////////////////PID/////////////////////////////// |
arayhan878 | 2:a214cf60ce58 | 143 | |
arayhan878 | 2:a214cf60ce58 | 144 | out = (output*-1); |
arayhan878 | 2:a214cf60ce58 | 145 | |
arayhan878 | 2:a214cf60ce58 | 146 | if (e>20 || e<-20) |
arayhan878 | 2:a214cf60ce58 | 147 | { |
arayhan878 | 2:a214cf60ce58 | 148 | pc.printf(" PID"); |
arayhan878 | 2:a214cf60ce58 | 149 | pc.printf(" yapppp "); |
arayhan878 | 2:a214cf60ce58 | 150 | pc.printf(" sudut : %d",ch); |
arayhan878 | 2:a214cf60ce58 | 151 | pc.printf(" out : %f",out); |
arayhan878 | 2:a214cf60ce58 | 152 | pc.printf(" e : %f\n",e); |
arayhan878 | 2:a214cf60ce58 | 153 | atur(0, 0, out); |
arayhan878 | 2:a214cf60ce58 | 154 | pwm1.write(pw1); |
arayhan878 | 2:a214cf60ce58 | 155 | pwm2.write(pw2); |
arayhan878 | 2:a214cf60ce58 | 156 | pwm3.write(pw3); |
arayhan878 | 2:a214cf60ce58 | 157 | if (out > -10 && out < -1) |
arayhan878 | 2:a214cf60ce58 | 158 | { |
arayhan878 | 2:a214cf60ce58 | 159 | atur(0, 0, -10); |
arayhan878 | 2:a214cf60ce58 | 160 | pwm1.write(pw1); |
arayhan878 | 2:a214cf60ce58 | 161 | pwm2.write(pw2); |
arayhan878 | 2:a214cf60ce58 | 162 | pwm3.write(pw3); |
arayhan878 | 2:a214cf60ce58 | 163 | wait(0.1); |
arayhan878 | 2:a214cf60ce58 | 164 | } |
arayhan878 | 2:a214cf60ce58 | 165 | if (out < 10 && out > 1) |
arayhan878 | 2:a214cf60ce58 | 166 | { |
arayhan878 | 2:a214cf60ce58 | 167 | atur(0, 0, 10); |
arayhan878 | 2:a214cf60ce58 | 168 | pwm1.write(pw1); |
arayhan878 | 2:a214cf60ce58 | 169 | pwm2.write(pw2); |
arayhan878 | 2:a214cf60ce58 | 170 | pwm3.write(pw3); |
arayhan878 | 2:a214cf60ce58 | 171 | wait(0.1); |
arayhan878 | 2:a214cf60ce58 | 172 | } |
arayhan878 | 2:a214cf60ce58 | 173 | |
arayhan878 | 2:a214cf60ce58 | 174 | } |
arayhan878 | 2:a214cf60ce58 | 175 | if (e <20 && e>-20) |
arayhan878 | 2:a214cf60ce58 | 176 | { |
arayhan878 | 2:a214cf60ce58 | 177 | atur(0, -50, 0); |
arayhan878 | 2:a214cf60ce58 | 178 | pc.printf(" Maju"); |
arayhan878 | 2:a214cf60ce58 | 179 | pc.printf(" yapppp "); |
arayhan878 | 2:a214cf60ce58 | 180 | pc.printf(" sudut : %d",ch); |
arayhan878 | 2:a214cf60ce58 | 181 | pc.printf(" e : %f\n",e); |
arayhan878 | 2:a214cf60ce58 | 182 | pwm1.write(pw1); |
arayhan878 | 2:a214cf60ce58 | 183 | pwm2.write(pw2); |
arayhan878 | 2:a214cf60ce58 | 184 | pwm3.write(pw3); |
arayhan878 | 2:a214cf60ce58 | 185 | } |
arayhan878 | 2:a214cf60ce58 | 186 | // pc.printf(" out : %f",out); |
arayhan878 | 2:a214cf60ce58 | 187 | // pc.printf(" pw1 : %f",pw1); |
arayhan878 | 2:a214cf60ce58 | 188 | // pc.printf(" pw2 : %f",pw2); |
arayhan878 | 2:a214cf60ce58 | 189 | // pc.printf(" pw3 : %f",pw3); |
arayhan878 | 0:1d81f3296468 | 190 | |
arayhan878 | 2:a214cf60ce58 | 191 | // pc.printf(" I : %f",integral); |
arayhan878 | 2:a214cf60ce58 | 192 | // pc.printf(" D : %f",derivative); |
arayhan878 | 2:a214cf60ce58 | 193 | // pc.printf(" error : %f",e); |
arayhan878 | 1:edd7f45256f9 | 194 | //pc.printf(" pwm : %d",out); |
arayhan878 | 2:a214cf60ce58 | 195 | // pc.printf(" rod1 = %0.2f ", roda1 ); |
arayhan878 | 2:a214cf60ce58 | 196 | // pc.printf(" rod2 = %0.2f ", roda2 ); |
arayhan878 | 2:a214cf60ce58 | 197 | // pc.printf(" rod3 = %0.2f\n ", roda3 ); |
arayhan878 | 1:edd7f45256f9 | 198 | |
arayhan878 | 1:edd7f45256f9 | 199 | // wait(1); |
arayhan878 | 0:1d81f3296468 | 200 | } |
arayhan878 | 0:1d81f3296468 | 201 | else |
arayhan878 | 0:1d81f3296468 | 202 | { |
arayhan878 | 1:edd7f45256f9 | 203 | pc.printf("nope \n"); |
arayhan878 | 1:edd7f45256f9 | 204 | atur(0, 0, 0); |
arayhan878 | 1:edd7f45256f9 | 205 | pwm1.write(pw1); |
arayhan878 | 1:edd7f45256f9 | 206 | pwm2.write(pw2); |
arayhan878 | 1:edd7f45256f9 | 207 | pwm3.write(pw3); |
arayhan878 | 0:1d81f3296468 | 208 | } |
arayhan878 | 0:1d81f3296468 | 209 | } |
arayhan878 | 0:1d81f3296468 | 210 | |
arayhan878 | 0:1d81f3296468 | 211 | //atur(0, 150, 0); //mundur |
arayhan878 | 0:1d81f3296468 | 212 | //pc.printf("Mundur"); |
arayhan878 | 0:1d81f3296468 | 213 | // pc.printf("Kiri"); |
arayhan878 | 0:1d81f3296468 | 214 | // atur(-150, 0, 0); //kiri |
arayhan878 | 0:1d81f3296468 | 215 | // pwm1.write(pw1); |
arayhan878 | 0:1d81f3296468 | 216 | // pwm2.write(pw2); |
arayhan878 | 0:1d81f3296468 | 217 | // pwm3.write(pw3); |
arayhan878 | 0:1d81f3296468 | 218 | |
arayhan878 | 0:1d81f3296468 | 219 | //} |
arayhan878 | 0:1d81f3296468 | 220 | //else if (data == 'g') { |
arayhan878 | 0:1d81f3296468 | 221 | // pc.printf("Kiri"); |
arayhan878 | 0:1d81f3296468 | 222 | // atur(-60, 0, 0); //kiri |
arayhan878 | 0:1d81f3296468 | 223 | //} |
arayhan878 | 0:1d81f3296468 | 224 | //else if (data == 'i') { |
arayhan878 | 0:1d81f3296468 | 225 | // pc.printf("Kanan"); |
arayhan878 | 0:1d81f3296468 | 226 | // atur(60, 0, 0); //kanan |
arayhan878 | 0:1d81f3296468 | 227 | //} |
arayhan878 | 0:1d81f3296468 | 228 | |
arayhan878 | 0:1d81f3296468 | 229 | //else if (data == 'l') |
arayhan878 | 0:1d81f3296468 | 230 | //{ |
arayhan878 | 0:1d81f3296468 | 231 | // atur(0, 0, -45); //Putar |
arayhan878 | 0:1d81f3296468 | 232 | // pc.printf("Putar Kanan"); |
arayhan878 | 0:1d81f3296468 | 233 | // data = 0; |
arayhan878 | 0:1d81f3296468 | 234 | //} |
arayhan878 | 0:1d81f3296468 | 235 | //else if (data == 'j') |
arayhan878 | 0:1d81f3296468 | 236 | //{ |
arayhan878 | 0:1d81f3296468 | 237 | // atur(0, 0, 45); //Putar |
arayhan878 | 0:1d81f3296468 | 238 | // pc.printf("Putar Kiri"); |
arayhan878 | 0:1d81f3296468 | 239 | // data = 0; |
arayhan878 | 0:1d81f3296468 | 240 | //} |
arayhan878 | 0:1d81f3296468 | 241 | |
arayhan878 | 0:1d81f3296468 | 242 | } |
arayhan878 | 0:1d81f3296468 | 243 | } |