Radio controlled Quadcopter, FRDM K64f, ZIgbee Radio Modules, ESCs
Dependencies: FXAS21000 FXLS8471Q FXOS8700Q MAG3110 MMA8652 MPL3115A2 kalman mbed-dsp mbed
Fork of Freescale_Multi-Sensor_Quadcopter by
main.cpp@8:8f3dfde6fa88, 2017-04-01 (annotated)
- Committer:
- impeccabletanu
- Date:
- Sat Apr 01 01:52:18 2017 +0000
- Revision:
- 8:8f3dfde6fa88
- Parent:
- 7:72e41680e5e0
RC Controlled Quadcopter
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
screamer | 0:bfb567985c64 | 1 | #include "mbed.h" |
screamer | 0:bfb567985c64 | 2 | #include "FXOS8700Q.h" |
screamer | 0:bfb567985c64 | 3 | #include "FXAS21000.h" |
julioefajardo | 3:58ebc00f1a68 | 4 | #include "kalman.c" |
julioefajardo | 6:d868495c1936 | 5 | #include "arm_math.h" |
screamer | 0:bfb567985c64 | 6 | |
vijeetgoel | 7:72e41680e5e0 | 7 | #define PI 3.14159265358979f |
julioefajardo | 6:d868495c1936 | 8 | #define Rad2Dree 57.295779513082320876798154814105f |
julioefajardo | 6:d868495c1936 | 9 | |
julioefajardo | 6:d868495c1936 | 10 | #define PID_ROLL_KP 0.0245f /* Proporcional */ //0.015f |
julioefajardo | 6:d868495c1936 | 11 | #define PID_ROLL_KI 0.000175f /* Integral */ |
julioefajardo | 6:d868495c1936 | 12 | #define PID_ROLL_KD 0.0f /* Derivative */ |
julioefajardo | 6:d868495c1936 | 13 | |
julioefajardo | 6:d868495c1936 | 14 | #define PID_PITCH_KP 0.0245f /* Proporcional */ //0.015f |
julioefajardo | 6:d868495c1936 | 15 | #define PID_PITCH_KI 0.000175f /* Integral */ |
julioefajardo | 6:d868495c1936 | 16 | #define PID_PITCH_KD 0.0f /* Derivative */ |
julioefajardo | 6:d868495c1936 | 17 | |
vijeetgoel | 7:72e41680e5e0 | 18 | #define PID_YAW_KP 0.0245f /* Proporcional */ //0.015f |
vijeetgoel | 7:72e41680e5e0 | 19 | #define PID_YAW_KI 0.000175f /* Integral */ |
vijeetgoel | 7:72e41680e5e0 | 20 | #define PID_YAW_KD 0.0f /* Derivative */ |
vijeetgoel | 7:72e41680e5e0 | 21 | |
julioefajardo | 6:d868495c1936 | 22 | #define ROLL_SP PI/2 |
julioefajardo | 6:d868495c1936 | 23 | #define PITCH_SP PI/2 |
vijeetgoel | 7:72e41680e5e0 | 24 | #define YAW_SP PI/2 |
vijeetgoel | 7:72e41680e5e0 | 25 | FXOS8700Q_acc combo_acc(D14,D15,FXOS8700CQ_SLAVE_ADDR0); |
vijeetgoel | 7:72e41680e5e0 | 26 | FXOS8700Q_mag combo_mag(D14,D15,FXOS8700CQ_SLAVE_ADDR0); |
vijeetgoel | 7:72e41680e5e0 | 27 | FXAS21000 gyro(D14,D15); |
julioefajardo | 5:74ca8be12359 | 28 | |
vijeetgoel | 7:72e41680e5e0 | 29 | AnalogIn ultra(A0); |
julioefajardo | 3:58ebc00f1a68 | 30 | Timer GlobalTime; |
julioefajardo | 3:58ebc00f1a68 | 31 | Timer ProgramTimer; |
julioefajardo | 3:58ebc00f1a68 | 32 | |
vijeetgoel | 7:72e41680e5e0 | 33 | PwmOut esc1(D10); |
vijeetgoel | 7:72e41680e5e0 | 34 | PwmOut esc2(D11); |
vijeetgoel | 7:72e41680e5e0 | 35 | PwmOut esc3(D12); |
vijeetgoel | 7:72e41680e5e0 | 36 | PwmOut esc4(D13); |
vijeetgoel | 7:72e41680e5e0 | 37 | DigitalOut reset1(D7); |
vijeetgoel | 7:72e41680e5e0 | 38 | |
screamer | 0:bfb567985c64 | 39 | |
julioefajardo | 3:58ebc00f1a68 | 40 | kalman filter_pitch; |
julioefajardo | 3:58ebc00f1a68 | 41 | kalman filter_roll; |
vijeetgoel | 7:72e41680e5e0 | 42 | kalman filter_yaw; |
vijeetgoel | 7:72e41680e5e0 | 43 | |
vijeetgoel | 7:72e41680e5e0 | 44 | Serial xbe(D1,D0); |
vijeetgoel | 7:72e41680e5e0 | 45 | |
vijeetgoel | 7:72e41680e5e0 | 46 | Serial pc(USBTX, USBRX); |
vijeetgoel | 7:72e41680e5e0 | 47 | // tx, rx |
julioefajardo | 3:58ebc00f1a68 | 48 | |
julioefajardo | 3:58ebc00f1a68 | 49 | float R; |
julioefajardo | 3:58ebc00f1a68 | 50 | double angle[3]; |
julioefajardo | 3:58ebc00f1a68 | 51 | unsigned long timer; |
julioefajardo | 3:58ebc00f1a68 | 52 | long loopStartTime; |
julioefajardo | 5:74ca8be12359 | 53 | char i; |
julioefajardo | 5:74ca8be12359 | 54 | char command = ' '; |
julioefajardo | 6:d868495c1936 | 55 | char sflag = 0; |
vijeetgoel | 7:72e41680e5e0 | 56 | float high; |
julioefajardo | 5:74ca8be12359 | 57 | |
vijeetgoel | 7:72e41680e5e0 | 58 | float roll_error; |
vijeetgoel | 7:72e41680e5e0 | 59 | float pitch_error; |
vijeetgoel | 7:72e41680e5e0 | 60 | float yaw_error; |
vijeetgoel | 7:72e41680e5e0 | 61 | |
vijeetgoel | 7:72e41680e5e0 | 62 | float roll; |
vijeetgoel | 7:72e41680e5e0 | 63 | float pitch; |
vijeetgoel | 7:72e41680e5e0 | 64 | float yaw; |
julioefajardo | 6:d868495c1936 | 65 | float ESC1 = 0.0006f; //pitch up |
julioefajardo | 6:d868495c1936 | 66 | float ESC2 = 0.0006f; //roll up |
julioefajardo | 6:d868495c1936 | 67 | float ESC3 = 0.0006f; //roll down |
julioefajardo | 6:d868495c1936 | 68 | float ESC4 = 0.0006f; //pitch down |
julioefajardo | 6:d868495c1936 | 69 | |
vijeetgoel | 7:72e41680e5e0 | 70 | int main() { |
vijeetgoel | 7:72e41680e5e0 | 71 | |
vijeetgoel | 7:72e41680e5e0 | 72 | char c; |
vijeetgoel | 7:72e41680e5e0 | 73 | float gyro_data[3]; |
screamer | 0:bfb567985c64 | 74 | MotionSensorDataUnits adata; |
screamer | 0:bfb567985c64 | 75 | MotionSensorDataUnits mdata; |
julioefajardo | 2:4bc4e25328cc | 76 | |
vijeetgoel | 7:72e41680e5e0 | 77 | arm_pid_instance_f32 RPID; |
julioefajardo | 6:d868495c1936 | 78 | arm_pid_instance_f32 PPID; |
vijeetgoel | 7:72e41680e5e0 | 79 | arm_pid_instance_f32 YPID; |
julioefajardo | 6:d868495c1936 | 80 | |
julioefajardo | 6:d868495c1936 | 81 | //Pitch |
julioefajardo | 6:d868495c1936 | 82 | PPID.Kp = PID_PITCH_KP/1000.0f; /* Proporcional */ |
julioefajardo | 6:d868495c1936 | 83 | PPID.Ki = PID_PITCH_KI/1000.0f; /* Integral */ |
julioefajardo | 6:d868495c1936 | 84 | PPID.Kd = PID_PITCH_KD/1000.0f; /* Derivative */ |
julioefajardo | 6:d868495c1936 | 85 | |
julioefajardo | 6:d868495c1936 | 86 | //Roll |
julioefajardo | 6:d868495c1936 | 87 | RPID.Kp = PID_ROLL_KP/1000.0f; /* Proporcional */ |
julioefajardo | 6:d868495c1936 | 88 | RPID.Ki = PID_ROLL_KI/1000.0f; /* Integral */ |
julioefajardo | 6:d868495c1936 | 89 | RPID.Kd = PID_ROLL_KD/1000.0f; /* Derivative */ |
julioefajardo | 6:d868495c1936 | 90 | |
vijeetgoel | 7:72e41680e5e0 | 91 | //yaw |
vijeetgoel | 7:72e41680e5e0 | 92 | YPID.Kp = PID_YAW_KP/1000.0f; /* Proporcional */ |
vijeetgoel | 7:72e41680e5e0 | 93 | YPID.Ki = PID_YAW_KI/1000.0f; /* Integral */ |
vijeetgoel | 7:72e41680e5e0 | 94 | YPID.Kd = PID_YAW_KD/1000.0f; /* Derivative */ |
vijeetgoel | 7:72e41680e5e0 | 95 | |
vijeetgoel | 7:72e41680e5e0 | 96 | |
julioefajardo | 6:d868495c1936 | 97 | arm_pid_init_f32(&RPID, 1); |
julioefajardo | 6:d868495c1936 | 98 | arm_pid_init_f32(&PPID, 1); |
vijeetgoel | 7:72e41680e5e0 | 99 | arm_pid_init_f32(&YPID, 1); |
julioefajardo | 6:d868495c1936 | 100 | |
vijeetgoel | 7:72e41680e5e0 | 101 | |
julioefajardo | 3:58ebc00f1a68 | 102 | |
vijeetgoel | 7:72e41680e5e0 | 103 | reset1=0; |
vijeetgoel | 7:72e41680e5e0 | 104 | xbe.baud(9600); |
vijeetgoel | 7:72e41680e5e0 | 105 | reset1=1; |
vijeetgoel | 7:72e41680e5e0 | 106 | |
vijeetgoel | 7:72e41680e5e0 | 107 | GlobalTime.start(); |
vijeetgoel | 7:72e41680e5e0 | 108 | |
vijeetgoel | 7:72e41680e5e0 | 109 | esc1.period(0.02f); |
vijeetgoel | 7:72e41680e5e0 | 110 | esc2.period(0.02f); |
vijeetgoel | 7:72e41680e5e0 | 111 | esc3.period(0.02f); |
vijeetgoel | 7:72e41680e5e0 | 112 | esc4.period(0.02f); //Comparten el mismo timer |
vijeetgoel | 7:72e41680e5e0 | 113 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 114 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 115 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 116 | esc4.pulsewidth(ESC4); |
julioefajardo | 2:4bc4e25328cc | 117 | |
screamer | 0:bfb567985c64 | 118 | combo_acc.enable(); |
screamer | 0:bfb567985c64 | 119 | combo_mag.enable(); |
screamer | 0:bfb567985c64 | 120 | printf("FXOS8700 Combo = %X\r\n", combo_acc.whoAmI()); |
screamer | 0:bfb567985c64 | 121 | printf("FXAS21000 Gyro = %X\r\n", gyro.getWhoAmI()); |
screamer | 0:bfb567985c64 | 122 | |
julioefajardo | 3:58ebc00f1a68 | 123 | kalman_init(&filter_pitch, R_matrix, Q_Gyro_matrix, Q_Accel_matrix); |
julioefajardo | 3:58ebc00f1a68 | 124 | kalman_init(&filter_roll, R_matrix, Q_Gyro_matrix, Q_Accel_matrix); |
vijeetgoel | 7:72e41680e5e0 | 125 | kalman_init(&filter_yaw, R_matrix, Q_Gyro_matrix, Q_Accel_matrix); |
vijeetgoel | 7:72e41680e5e0 | 126 | |
julioefajardo | 3:58ebc00f1a68 | 127 | |
vijeetgoel | 7:72e41680e5e0 | 128 | |
vijeetgoel | 7:72e41680e5e0 | 129 | |
vijeetgoel | 7:72e41680e5e0 | 130 | while(1) |
vijeetgoel | 7:72e41680e5e0 | 131 | { |
vijeetgoel | 7:72e41680e5e0 | 132 | |
vijeetgoel | 7:72e41680e5e0 | 133 | while(xbe.readable()) |
vijeetgoel | 7:72e41680e5e0 | 134 | |
vijeetgoel | 7:72e41680e5e0 | 135 | { |
vijeetgoel | 7:72e41680e5e0 | 136 | c = xbe.getc(); |
vijeetgoel | 7:72e41680e5e0 | 137 | |
vijeetgoel | 7:72e41680e5e0 | 138 | pc.printf("Value %c",c); |
vijeetgoel | 7:72e41680e5e0 | 139 | pc.printf("receving"); |
vijeetgoel | 7:72e41680e5e0 | 140 | |
vijeetgoel | 7:72e41680e5e0 | 141 | |
vijeetgoel | 7:72e41680e5e0 | 142 | if (c == 'u') |
vijeetgoel | 7:72e41680e5e0 | 143 | { |
vijeetgoel | 7:72e41680e5e0 | 144 | if (ESC1<0.001f) |
vijeetgoel | 7:72e41680e5e0 | 145 | { |
vijeetgoel | 7:72e41680e5e0 | 146 | ESC1 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 147 | ESC2 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 148 | ESC3 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 149 | ESC4 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 150 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 151 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 152 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 153 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 154 | wait_ms(1000); |
vijeetgoel | 7:72e41680e5e0 | 155 | pc.printf("Up"); |
vijeetgoel | 7:72e41680e5e0 | 156 | } |
vijeetgoel | 7:72e41680e5e0 | 157 | } |
vijeetgoel | 7:72e41680e5e0 | 158 | |
vijeetgoel | 7:72e41680e5e0 | 159 | |
vijeetgoel | 7:72e41680e5e0 | 160 | |
vijeetgoel | 7:72e41680e5e0 | 161 | else if (c == 'd') |
vijeetgoel | 7:72e41680e5e0 | 162 | { |
vijeetgoel | 7:72e41680e5e0 | 163 | if ((ESC1 > 0.0006f)||(ESC2 > 0.0006f)||(ESC3 > 0.0006f)||(ESC4 > 0.0006f)) |
vijeetgoel | 7:72e41680e5e0 | 164 | { |
vijeetgoel | 7:72e41680e5e0 | 165 | ESC1 -= 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 166 | ESC2 -= 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 167 | ESC3 -= 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 168 | ESC4 -= 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 169 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 170 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 171 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 172 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 173 | |
vijeetgoel | 7:72e41680e5e0 | 174 | pc.printf("down"); |
vijeetgoel | 7:72e41680e5e0 | 175 | } |
vijeetgoel | 7:72e41680e5e0 | 176 | |
vijeetgoel | 7:72e41680e5e0 | 177 | printf("%f\r\n", ESC1); |
vijeetgoel | 7:72e41680e5e0 | 178 | |
vijeetgoel | 7:72e41680e5e0 | 179 | |
vijeetgoel | 7:72e41680e5e0 | 180 | } |
vijeetgoel | 7:72e41680e5e0 | 181 | |
vijeetgoel | 7:72e41680e5e0 | 182 | else if(c=='r') |
vijeetgoel | 7:72e41680e5e0 | 183 | |
vijeetgoel | 7:72e41680e5e0 | 184 | |
vijeetgoel | 7:72e41680e5e0 | 185 | { |
vijeetgoel | 7:72e41680e5e0 | 186 | |
vijeetgoel | 7:72e41680e5e0 | 187 | ESC1 = 0.0006f; |
vijeetgoel | 7:72e41680e5e0 | 188 | ESC2 = 0.0006f; |
vijeetgoel | 7:72e41680e5e0 | 189 | ESC3 = 0.0006f; |
vijeetgoel | 7:72e41680e5e0 | 190 | ESC4 = 0.0006f; |
vijeetgoel | 7:72e41680e5e0 | 191 | pc.printf("still"); |
vijeetgoel | 7:72e41680e5e0 | 192 | |
vijeetgoel | 7:72e41680e5e0 | 193 | printf("%f\r\n", ESC1); |
vijeetgoel | 7:72e41680e5e0 | 194 | |
vijeetgoel | 7:72e41680e5e0 | 195 | |
vijeetgoel | 7:72e41680e5e0 | 196 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 197 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 198 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 199 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 200 | |
vijeetgoel | 7:72e41680e5e0 | 201 | |
vijeetgoel | 7:72e41680e5e0 | 202 | } |
vijeetgoel | 7:72e41680e5e0 | 203 | |
vijeetgoel | 7:72e41680e5e0 | 204 | |
vijeetgoel | 7:72e41680e5e0 | 205 | else if (c == 's') { |
vijeetgoel | 7:72e41680e5e0 | 206 | |
vijeetgoel | 7:72e41680e5e0 | 207 | pc.printf("flyingatSameSpeed"); |
vijeetgoel | 7:72e41680e5e0 | 208 | |
vijeetgoel | 7:72e41680e5e0 | 209 | |
vijeetgoel | 7:72e41680e5e0 | 210 | printf("%f\r\n", ESC1); |
vijeetgoel | 7:72e41680e5e0 | 211 | |
vijeetgoel | 7:72e41680e5e0 | 212 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 213 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 214 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 215 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 216 | } |
vijeetgoel | 7:72e41680e5e0 | 217 | |
vijeetgoel | 7:72e41680e5e0 | 218 | |
vijeetgoel | 7:72e41680e5e0 | 219 | |
vijeetgoel | 7:72e41680e5e0 | 220 | |
vijeetgoel | 7:72e41680e5e0 | 221 | else if (c =='g') { |
vijeetgoel | 7:72e41680e5e0 | 222 | |
vijeetgoel | 7:72e41680e5e0 | 223 | pc.printf("Moving left"); |
vijeetgoel | 7:72e41680e5e0 | 224 | |
vijeetgoel | 7:72e41680e5e0 | 225 | if(ESC3<0.01f) |
vijeetgoel | 7:72e41680e5e0 | 226 | { |
vijeetgoel | 7:72e41680e5e0 | 227 | ESC3 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 228 | ESC4 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 229 | |
vijeetgoel | 7:72e41680e5e0 | 230 | } |
vijeetgoel | 7:72e41680e5e0 | 231 | |
vijeetgoel | 7:72e41680e5e0 | 232 | printf("%f\r\n", ESC3); |
vijeetgoel | 7:72e41680e5e0 | 233 | |
vijeetgoel | 7:72e41680e5e0 | 234 | |
vijeetgoel | 7:72e41680e5e0 | 235 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 236 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 237 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 238 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 239 | } |
vijeetgoel | 7:72e41680e5e0 | 240 | |
vijeetgoel | 7:72e41680e5e0 | 241 | |
vijeetgoel | 7:72e41680e5e0 | 242 | |
vijeetgoel | 7:72e41680e5e0 | 243 | else if (c =='h') { |
vijeetgoel | 7:72e41680e5e0 | 244 | |
vijeetgoel | 7:72e41680e5e0 | 245 | pc.printf("Moving roght"); |
vijeetgoel | 7:72e41680e5e0 | 246 | |
vijeetgoel | 7:72e41680e5e0 | 247 | if(ESC2<0.01f) |
vijeetgoel | 7:72e41680e5e0 | 248 | { |
vijeetgoel | 7:72e41680e5e0 | 249 | ESC1 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 250 | ESC2 += 0.0001f; |
vijeetgoel | 7:72e41680e5e0 | 251 | |
vijeetgoel | 7:72e41680e5e0 | 252 | } |
vijeetgoel | 7:72e41680e5e0 | 253 | |
vijeetgoel | 7:72e41680e5e0 | 254 | printf("%f\r\n", ESC3); |
vijeetgoel | 7:72e41680e5e0 | 255 | |
vijeetgoel | 7:72e41680e5e0 | 256 | |
vijeetgoel | 7:72e41680e5e0 | 257 | esc1.pulsewidth(ESC1); |
vijeetgoel | 7:72e41680e5e0 | 258 | esc2.pulsewidth(ESC2); |
vijeetgoel | 7:72e41680e5e0 | 259 | esc3.pulsewidth(ESC3); |
vijeetgoel | 7:72e41680e5e0 | 260 | esc4.pulsewidth(ESC4); |
vijeetgoel | 7:72e41680e5e0 | 261 | } |
julioefajardo | 3:58ebc00f1a68 | 262 | ProgramTimer.start(); |
julioefajardo | 3:58ebc00f1a68 | 263 | loopStartTime = ProgramTimer.read_us(); |
julioefajardo | 3:58ebc00f1a68 | 264 | timer = loopStartTime; |
vijeetgoel | 7:72e41680e5e0 | 265 | high= (float)(ultra.read_u16()*2.75f/512.0f)*2.54f; |
julioefajardo | 5:74ca8be12359 | 266 | |
screamer | 0:bfb567985c64 | 267 | combo_acc.getAxis(adata); |
vijeetgoel | 7:72e41680e5e0 | 268 | combo_mag.getAxis(mdata);; |
julioefajardo | 3:58ebc00f1a68 | 269 | gyro.ReadXYZ(gyro_data); |
julioefajardo | 3:58ebc00f1a68 | 270 | |
julioefajardo | 3:58ebc00f1a68 | 271 | R = sqrt(std::pow(adata.x, 2) + std::pow(adata.y, 2) + std::pow(adata.z, 2)); |
screamer | 0:bfb567985c64 | 272 | |
julioefajardo | 3:58ebc00f1a68 | 273 | kalman_predict(&filter_pitch, gyro_data[0], (ProgramTimer.read_us() - timer)); |
julioefajardo | 3:58ebc00f1a68 | 274 | kalman_update(&filter_pitch, acos(adata.x/R)); |
julioefajardo | 3:58ebc00f1a68 | 275 | kalman_predict(&filter_roll, gyro_data[1], (ProgramTimer.read_us() - timer)); |
julioefajardo | 3:58ebc00f1a68 | 276 | kalman_update(&filter_roll, acos(adata.y/R)); |
vijeetgoel | 7:72e41680e5e0 | 277 | kalman_predict(&filter_yaw, gyro_data[2], (ProgramTimer.read_us() - timer)); |
vijeetgoel | 7:72e41680e5e0 | 278 | kalman_update(&filter_yaw, acos(adata.z/R)); |
vijeetgoel | 7:72e41680e5e0 | 279 | |
vijeetgoel | 7:72e41680e5e0 | 280 | angle[0] = kalman_get_angle(&filter_pitch); |
julioefajardo | 3:58ebc00f1a68 | 281 | angle[1] = kalman_get_angle(&filter_roll); |
vijeetgoel | 7:72e41680e5e0 | 282 | angle[2]=kalman_get_angle(&filter_yaw); |
julioefajardo | 3:58ebc00f1a68 | 283 | |
julioefajardo | 6:d868495c1936 | 284 | if (angle[0]>PI) angle[0] = PI; |
julioefajardo | 6:d868495c1936 | 285 | else if (angle[0]<0) angle[0] = 0.0f; |
julioefajardo | 6:d868495c1936 | 286 | else angle[0] += 0.0f; |
julioefajardo | 6:d868495c1936 | 287 | |
julioefajardo | 6:d868495c1936 | 288 | if (angle[1]>PI) angle[1] = PI; |
julioefajardo | 6:d868495c1936 | 289 | else if (angle[1]<0) angle[1] = 0.0f; |
julioefajardo | 6:d868495c1936 | 290 | else angle[1] += 0.0f; |
vijeetgoel | 7:72e41680e5e0 | 291 | |
vijeetgoel | 7:72e41680e5e0 | 292 | if (angle[2]>PI) angle[2] = PI; |
vijeetgoel | 7:72e41680e5e0 | 293 | else if (angle[2]<0) angle[2] = 0.0f; |
vijeetgoel | 7:72e41680e5e0 | 294 | else angle[2] += 0.0f; |
julioefajardo | 6:d868495c1936 | 295 | |
julioefajardo | 6:d868495c1936 | 296 | pitch_error = angle[0] - PITCH_SP; |
julioefajardo | 6:d868495c1936 | 297 | roll_error = angle[1] - ROLL_SP; |
vijeetgoel | 7:72e41680e5e0 | 298 | yaw_error = angle[2] - YAW_SP; |
julioefajardo | 6:d868495c1936 | 299 | |
julioefajardo | 6:d868495c1936 | 300 | pitch = arm_pid_f32(&PPID, pitch_error); |
julioefajardo | 6:d868495c1936 | 301 | roll = arm_pid_f32(&RPID, roll_error); |
vijeetgoel | 7:72e41680e5e0 | 302 | yaw = arm_pid_f32(&YPID, yaw_error); |
julioefajardo | 3:58ebc00f1a68 | 303 | timer = ProgramTimer.read_us(); |
julioefajardo | 6:d868495c1936 | 304 | |
vijeetgoel | 7:72e41680e5e0 | 305 | ESC1=ESC1-pitch+yaw; |
vijeetgoel | 7:72e41680e5e0 | 306 | ESC2=ESC2-roll +yaw; |
vijeetgoel | 7:72e41680e5e0 | 307 | ESC3=ESC3+roll-yaw; |
vijeetgoel | 7:72e41680e5e0 | 308 | ESC4=ESC3+pitch-yaw; |
vijeetgoel | 7:72e41680e5e0 | 309 | |
vijeetgoel | 7:72e41680e5e0 | 310 | if(ESC1>0.0014f) |
vijeetgoel | 7:72e41680e5e0 | 311 | { |
vijeetgoel | 7:72e41680e5e0 | 312 | ESC1=.00014f; |
vijeetgoel | 7:72e41680e5e0 | 313 | } |
vijeetgoel | 7:72e41680e5e0 | 314 | else if(ESC1<0.001f) |
vijeetgoel | 7:72e41680e5e0 | 315 | { |
vijeetgoel | 7:72e41680e5e0 | 316 | ESC1=0.001f; |
vijeetgoel | 7:72e41680e5e0 | 317 | } |
julioefajardo | 6:d868495c1936 | 318 | |
vijeetgoel | 7:72e41680e5e0 | 319 | else{ |
vijeetgoel | 7:72e41680e5e0 | 320 | pc.printf("no change"); |
vijeetgoel | 7:72e41680e5e0 | 321 | } |
vijeetgoel | 7:72e41680e5e0 | 322 | |
vijeetgoel | 7:72e41680e5e0 | 323 | |
vijeetgoel | 7:72e41680e5e0 | 324 | |
vijeetgoel | 7:72e41680e5e0 | 325 | |
vijeetgoel | 7:72e41680e5e0 | 326 | if(ESC2>0.0014f) |
vijeetgoel | 7:72e41680e5e0 | 327 | { |
vijeetgoel | 7:72e41680e5e0 | 328 | ESC2=.00014f; |
vijeetgoel | 7:72e41680e5e0 | 329 | } |
vijeetgoel | 7:72e41680e5e0 | 330 | else if(ESC2<0.001f) |
vijeetgoel | 7:72e41680e5e0 | 331 | { |
vijeetgoel | 7:72e41680e5e0 | 332 | ESC2=0.001f; |
vijeetgoel | 7:72e41680e5e0 | 333 | } |
vijeetgoel | 7:72e41680e5e0 | 334 | |
vijeetgoel | 7:72e41680e5e0 | 335 | else{ |
vijeetgoel | 7:72e41680e5e0 | 336 | pc.printf("no change"); |
vijeetgoel | 7:72e41680e5e0 | 337 | } |
vijeetgoel | 7:72e41680e5e0 | 338 | |
julioefajardo | 6:d868495c1936 | 339 | |
vijeetgoel | 7:72e41680e5e0 | 340 | if(ESC3>0.0014f) |
vijeetgoel | 7:72e41680e5e0 | 341 | { |
vijeetgoel | 7:72e41680e5e0 | 342 | ESC3=.00014f; |
vijeetgoel | 7:72e41680e5e0 | 343 | } |
vijeetgoel | 7:72e41680e5e0 | 344 | else if(ESC3<0.001f) |
vijeetgoel | 7:72e41680e5e0 | 345 | { |
vijeetgoel | 7:72e41680e5e0 | 346 | ESC3=0.001f; |
vijeetgoel | 7:72e41680e5e0 | 347 | } |
vijeetgoel | 7:72e41680e5e0 | 348 | |
vijeetgoel | 7:72e41680e5e0 | 349 | else{ |
vijeetgoel | 7:72e41680e5e0 | 350 | pc.printf("no change"); |
vijeetgoel | 7:72e41680e5e0 | 351 | } |
vijeetgoel | 7:72e41680e5e0 | 352 | |
vijeetgoel | 7:72e41680e5e0 | 353 | |
vijeetgoel | 7:72e41680e5e0 | 354 | if(ESC4>0.0014f) |
vijeetgoel | 7:72e41680e5e0 | 355 | { |
vijeetgoel | 7:72e41680e5e0 | 356 | ESC4=.00014f; |
vijeetgoel | 7:72e41680e5e0 | 357 | } |
vijeetgoel | 7:72e41680e5e0 | 358 | else if(ESC4<0.001f) |
vijeetgoel | 7:72e41680e5e0 | 359 | { |
vijeetgoel | 7:72e41680e5e0 | 360 | ESC4=0.001f; |
vijeetgoel | 7:72e41680e5e0 | 361 | } |
vijeetgoel | 7:72e41680e5e0 | 362 | |
vijeetgoel | 7:72e41680e5e0 | 363 | else{ |
vijeetgoel | 7:72e41680e5e0 | 364 | pc.printf("no change"); |
vijeetgoel | 7:72e41680e5e0 | 365 | } |
vijeetgoel | 7:72e41680e5e0 | 366 | |
vijeetgoel | 7:72e41680e5e0 | 367 | |
vijeetgoel | 7:72e41680e5e0 | 368 | pc.printf("FXOS8700 Acc: X:%6.3f Y:%6.3f Z:%6.3f\r\n", adata.x, adata.y, adata.z); |
vijeetgoel | 7:72e41680e5e0 | 369 | pc.printf("FXOS8700 Mag: X:%6.2f Y:%6.2f Z:%6.2f\r\n", mdata.x, mdata.y, mdata.z); |
vijeetgoel | 7:72e41680e5e0 | 370 | printf("FXAS21000 Gyro: X:%6.2f Y:%6.2f Z:%6.2f\r\n", gyro_data[0], gyro_data[1], gyro_data[2]); |
vijeetgoel | 7:72e41680e5e0 | 371 | pc.printf("Roll Angle X: %.6f Pitch Angle Y: %.6f \r\n YAW Angle Z: %.6f \r\n ", Rad2Dree * angle[1], Rad2Dree * angle[0], Rad2Dree * angle[2]); |
vijeetgoel | 7:72e41680e5e0 | 372 | pc.printf("roll = %.6f pitch = %.6f \r\n yaw = %.6f \r\n",roll,pitch,yaw); |
vijeetgoel | 7:72e41680e5e0 | 373 | pc.printf("ESC1 = %.6f ESC4 = %.6f \r\n", ESC1,ESC4); |
vijeetgoel | 7:72e41680e5e0 | 374 | pc.printf("ESC2 = %.6f ESC3 = %.6f \r\n", ESC2,ESC3); |
julioefajardo | 5:74ca8be12359 | 375 | //printf("dist = %.2f \r\n",dist); |
screamer | 0:bfb567985c64 | 376 | |
julioefajardo | 5:74ca8be12359 | 377 | wait(0.02f); |
vijeetgoel | 7:72e41680e5e0 | 378 | |
vijeetgoel | 7:72e41680e5e0 | 379 | |
vijeetgoel | 7:72e41680e5e0 | 380 | } |
vijeetgoel | 7:72e41680e5e0 | 381 | |
vijeetgoel | 7:72e41680e5e0 | 382 | // 20ms is the default period of the ESC pwm |
julioefajardo | 5:74ca8be12359 | 383 | } |
julioefajardo | 5:74ca8be12359 | 384 | } |