lololololol
Dependencies: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
main.cpp@26:088e397ec26f, 2019-10-29 (annotated)
- Committer:
- SjorsdeBruin
- Date:
- Tue Oct 29 11:13:15 2019 +0000
- Revision:
- 26:088e397ec26f
- Parent:
- 24:a9ec9b836fd9
- Child:
- 27:d37b3a0e0f2b
aids emg werkt niet, reden onbekend
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Hendrikvg | 17:cacf9e75eda7 | 1 | #include "QEI.h" |
Hendrikvg | 15:80b3ac2b8448 | 2 | #include "mbed.h" |
Hendrikvg | 20:ac1b4ffa3323 | 3 | #include "BiQuad.h" |
Hendrikvg | 14:20f11bb58244 | 4 | #include "FastPWM.h" |
Hendrikvg | 17:cacf9e75eda7 | 5 | #include "HIDScope.h" |
Hendrikvg | 16:40183eeadb6d | 6 | #include "MODSERIAL.h" |
Hendrikvg | 9:12b9865e7373 | 7 | |
Hendrikvg | 21:394a7a1deb73 | 8 | // Pins |
Hendrikvg | 21:394a7a1deb73 | 9 | MODSERIAL pc(USBTX, USBRX); |
SjorsdeBruin | 26:088e397ec26f | 10 | |
SjorsdeBruin | 26:088e397ec26f | 11 | QEI encoder_1(D10,D11,NC,8400,QEI::X4_ENCODING); |
SjorsdeBruin | 26:088e397ec26f | 12 | QEI encoder_2(D12,D13,NC,8400,QEI::X4_ENCODING); |
Hendrikvg | 24:a9ec9b836fd9 | 13 | |
Hendrikvg | 21:394a7a1deb73 | 14 | FastPWM PWM_motor_1(D6); |
Hendrikvg | 23:78898ddfb103 | 15 | FastPWM PWM_motor_2(D5); |
Hendrikvg | 24:a9ec9b836fd9 | 16 | |
Hendrikvg | 20:ac1b4ffa3323 | 17 | DigitalOut direction_motor_1(D7); |
Hendrikvg | 23:78898ddfb103 | 18 | DigitalOut direction_motor_2(D4); |
SjorsdeBruin | 26:088e397ec26f | 19 | |
Hendrikvg | 24:a9ec9b836fd9 | 20 | DigitalOut led_red(LED1); |
Hendrikvg | 24:a9ec9b836fd9 | 21 | DigitalOut led_green(LED2); |
Hendrikvg | 24:a9ec9b836fd9 | 22 | DigitalOut led_blue(LED3); |
Hendrikvg | 24:a9ec9b836fd9 | 23 | |
SjorsdeBruin | 26:088e397ec26f | 24 | AnalogIn emg_bl(A0); |
SjorsdeBruin | 26:088e397ec26f | 25 | AnalogIn emg_br(A1); |
SjorsdeBruin | 26:088e397ec26f | 26 | AnalogIn emg_leg(A2); |
Hendrikvg | 24:a9ec9b836fd9 | 27 | |
Hendrikvg | 21:394a7a1deb73 | 28 | InterruptIn button_1(SW2); |
Hendrikvg | 21:394a7a1deb73 | 29 | InterruptIn button_2(SW3); |
Hendrikvg | 17:cacf9e75eda7 | 30 | |
Hendrikvg | 24:a9ec9b836fd9 | 31 | |
Hendrikvg | 15:80b3ac2b8448 | 32 | // variables |
Hendrikvg | 21:394a7a1deb73 | 33 | Ticker TickerStateMachine; |
Hendrikvg | 23:78898ddfb103 | 34 | Ticker motor_control; |
Hendrikvg | 23:78898ddfb103 | 35 | Ticker write_scope; |
Hendrikvg | 21:394a7a1deb73 | 36 | Timer sinus_time; |
Hendrikvg | 24:a9ec9b836fd9 | 37 | Timeout rest_timeout; |
Hendrikvg | 24:a9ec9b836fd9 | 38 | Timeout mvc_timeout; |
SjorsdeBruin | 26:088e397ec26f | 39 | Timeout led_timeout; |
Hendrikvg | 21:394a7a1deb73 | 40 | enum states {start, motor_calibration, demo_mode, emg_calibration, vertical_movement, horizontal_movement}; |
Hendrikvg | 21:394a7a1deb73 | 41 | states CurrentState = start; |
Hendrikvg | 21:394a7a1deb73 | 42 | bool StateChanged = true; |
Hendrikvg | 24:a9ec9b836fd9 | 43 | enum substates {rest_biceps_left, mvc_biceps_left, rest_biceps_right, mvc_biceps_right, rest_biceps_leg, mvc_biceps_leg}; |
Hendrikvg | 24:a9ec9b836fd9 | 44 | substates CurrentSubstate = rest_biceps_left; |
Hendrikvg | 24:a9ec9b836fd9 | 45 | bool SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 46 | volatile bool pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 47 | volatile bool pressed_2 = false; |
Hendrikvg | 21:394a7a1deb73 | 48 | HIDScope scope(3); |
SjorsdeBruin | 26:088e397ec26f | 49 | |
SjorsdeBruin | 26:088e397ec26f | 50 | volatile float theta_1; |
Hendrikvg | 23:78898ddfb103 | 51 | //volatile float theta_error_1; |
Hendrikvg | 22:6cc93216b323 | 52 | volatile float theta_reference_1; |
SjorsdeBruin | 26:088e397ec26f | 53 | volatile float theta_2; |
Hendrikvg | 23:78898ddfb103 | 54 | //volatile float theta_error_2; |
Hendrikvg | 23:78898ddfb103 | 55 | volatile float theta_reference_2; |
SjorsdeBruin | 26:088e397ec26f | 56 | float Ts = 0.01; |
Hendrikvg | 23:78898ddfb103 | 57 | float Kp; |
Hendrikvg | 23:78898ddfb103 | 58 | float Ki; |
Hendrikvg | 23:78898ddfb103 | 59 | float Kd; |
Hendrikvg | 20:ac1b4ffa3323 | 60 | |
SjorsdeBruin | 26:088e397ec26f | 61 | |
SjorsdeBruin | 26:088e397ec26f | 62 | BiQuad Lowpass ( 1.55148e-04, 3.10297e-04, 1.55148e-04, -1.96446e+00, 9.65081e-01 ); |
SjorsdeBruin | 26:088e397ec26f | 63 | BiQuad Highpass ( 9.40809e-01, -9.40809e-01, 0.00000e+00, -8.81619e-01, 0.00000e+00); |
SjorsdeBruin | 26:088e397ec26f | 64 | BiQuad notch (9.98432e-01, -1.89913e+00, 9.98432e-01, -1.89913e+00, 9.96886e-01); |
SjorsdeBruin | 26:088e397ec26f | 65 | |
Hendrikvg | 24:a9ec9b836fd9 | 66 | int n = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 67 | |
SjorsdeBruin | 26:088e397ec26f | 68 | float emgFiltered_bl; |
SjorsdeBruin | 26:088e397ec26f | 69 | float emgFiltered_br; |
SjorsdeBruin | 26:088e397ec26f | 70 | float emgFiltered_leg; |
SjorsdeBruin | 26:088e397ec26f | 71 | float emg; |
SjorsdeBruin | 26:088e397ec26f | 72 | float xmvc_value = 1e-11; |
Hendrikvg | 24:a9ec9b836fd9 | 73 | |
Hendrikvg | 24:a9ec9b836fd9 | 74 | float sum = 0; |
SjorsdeBruin | 26:088e397ec26f | 75 | float xrest_value; |
Hendrikvg | 24:a9ec9b836fd9 | 76 | float rest_value_bl; |
Hendrikvg | 24:a9ec9b836fd9 | 77 | float rest_value_br; |
Hendrikvg | 24:a9ec9b836fd9 | 78 | float rest_value_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 79 | |
Hendrikvg | 24:a9ec9b836fd9 | 80 | float mvc_value_bl; |
Hendrikvg | 24:a9ec9b836fd9 | 81 | float mvc_value_br; |
Hendrikvg | 24:a9ec9b836fd9 | 82 | float mvc_value_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 83 | |
Hendrikvg | 21:394a7a1deb73 | 84 | // functies |
SjorsdeBruin | 26:088e397ec26f | 85 | void ledred() |
SjorsdeBruin | 26:088e397ec26f | 86 | { |
SjorsdeBruin | 26:088e397ec26f | 87 | led_red = 0; |
SjorsdeBruin | 26:088e397ec26f | 88 | led_green = 1; |
SjorsdeBruin | 26:088e397ec26f | 89 | led_blue = 1; |
SjorsdeBruin | 26:088e397ec26f | 90 | } |
SjorsdeBruin | 26:088e397ec26f | 91 | void ledgreen() |
SjorsdeBruin | 26:088e397ec26f | 92 | { |
SjorsdeBruin | 26:088e397ec26f | 93 | led_green=0; |
SjorsdeBruin | 26:088e397ec26f | 94 | led_blue=1; |
SjorsdeBruin | 26:088e397ec26f | 95 | led_red=1; |
SjorsdeBruin | 26:088e397ec26f | 96 | } |
SjorsdeBruin | 26:088e397ec26f | 97 | void ledblue() |
SjorsdeBruin | 26:088e397ec26f | 98 | { |
SjorsdeBruin | 26:088e397ec26f | 99 | led_green=1; |
SjorsdeBruin | 26:088e397ec26f | 100 | led_blue=0; |
SjorsdeBruin | 26:088e397ec26f | 101 | led_red=1; |
SjorsdeBruin | 26:088e397ec26f | 102 | } |
SjorsdeBruin | 26:088e397ec26f | 103 | void ledyellow() |
SjorsdeBruin | 26:088e397ec26f | 104 | { |
SjorsdeBruin | 26:088e397ec26f | 105 | led_green=0; |
SjorsdeBruin | 26:088e397ec26f | 106 | led_blue=1; |
SjorsdeBruin | 26:088e397ec26f | 107 | led_red=0; |
SjorsdeBruin | 26:088e397ec26f | 108 | } |
SjorsdeBruin | 26:088e397ec26f | 109 | void ledmagenta() |
SjorsdeBruin | 26:088e397ec26f | 110 | { |
SjorsdeBruin | 26:088e397ec26f | 111 | led_green=1; |
SjorsdeBruin | 26:088e397ec26f | 112 | led_blue=0; |
SjorsdeBruin | 26:088e397ec26f | 113 | led_red=0; |
SjorsdeBruin | 26:088e397ec26f | 114 | } |
SjorsdeBruin | 26:088e397ec26f | 115 | void ledcyan() |
SjorsdeBruin | 26:088e397ec26f | 116 | { |
SjorsdeBruin | 26:088e397ec26f | 117 | led_green=0; |
SjorsdeBruin | 26:088e397ec26f | 118 | led_blue=0; |
SjorsdeBruin | 26:088e397ec26f | 119 | led_red=1; |
SjorsdeBruin | 26:088e397ec26f | 120 | } |
SjorsdeBruin | 26:088e397ec26f | 121 | void ledwhite() |
SjorsdeBruin | 26:088e397ec26f | 122 | { |
SjorsdeBruin | 26:088e397ec26f | 123 | led_green=0; |
SjorsdeBruin | 26:088e397ec26f | 124 | led_blue=0; |
SjorsdeBruin | 26:088e397ec26f | 125 | led_red=0; |
SjorsdeBruin | 26:088e397ec26f | 126 | } |
SjorsdeBruin | 26:088e397ec26f | 127 | void ledoff() |
SjorsdeBruin | 26:088e397ec26f | 128 | { |
SjorsdeBruin | 26:088e397ec26f | 129 | led_green=1; |
SjorsdeBruin | 26:088e397ec26f | 130 | led_blue=1; |
SjorsdeBruin | 26:088e397ec26f | 131 | led_red=1; |
SjorsdeBruin | 26:088e397ec26f | 132 | } |
SjorsdeBruin | 26:088e397ec26f | 133 | |
SjorsdeBruin | 26:088e397ec26f | 134 | |
Hendrikvg | 22:6cc93216b323 | 135 | float CalculateError(float theta_reference,float theta) |
Hendrikvg | 21:394a7a1deb73 | 136 | { |
Hendrikvg | 22:6cc93216b323 | 137 | float theta_error = theta_reference-theta; |
Hendrikvg | 21:394a7a1deb73 | 138 | return theta_error; |
Hendrikvg | 21:394a7a1deb73 | 139 | } |
Hendrikvg | 20:ac1b4ffa3323 | 140 | |
Hendrikvg | 23:78898ddfb103 | 141 | float Controller(float theta_error, bool motor) |
Hendrikvg | 21:394a7a1deb73 | 142 | { |
Hendrikvg | 24:a9ec9b836fd9 | 143 | if (motor == false) { |
Hendrikvg | 23:78898ddfb103 | 144 | float K = 1; |
Hendrikvg | 23:78898ddfb103 | 145 | float ti = 0.1; |
Hendrikvg | 23:78898ddfb103 | 146 | float td = 10; |
Hendrikvg | 23:78898ddfb103 | 147 | Kp = K*(1+td/ti); |
Hendrikvg | 23:78898ddfb103 | 148 | Ki = K/ti; |
Hendrikvg | 23:78898ddfb103 | 149 | Kd = K*td; |
Hendrikvg | 24:a9ec9b836fd9 | 150 | } else { |
Hendrikvg | 23:78898ddfb103 | 151 | float K = 1; |
Hendrikvg | 23:78898ddfb103 | 152 | float ti = 0.1; |
Hendrikvg | 23:78898ddfb103 | 153 | float td = 10; |
Hendrikvg | 23:78898ddfb103 | 154 | Kp = K*(1+td/ti); |
Hendrikvg | 23:78898ddfb103 | 155 | Ki = K/ti; |
Hendrikvg | 23:78898ddfb103 | 156 | Kd = K*td; |
Hendrikvg | 23:78898ddfb103 | 157 | } |
Hendrikvg | 21:394a7a1deb73 | 158 | static float error_integral = 0; |
Hendrikvg | 21:394a7a1deb73 | 159 | static float error_prev = 0; |
Hendrikvg | 21:394a7a1deb73 | 160 | static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); |
Hendrikvg | 24:a9ec9b836fd9 | 161 | |
Hendrikvg | 20:ac1b4ffa3323 | 162 | // Proportional part: |
Hendrikvg | 20:ac1b4ffa3323 | 163 | float torque_p = Kp * theta_error; |
Hendrikvg | 24:a9ec9b836fd9 | 164 | |
Hendrikvg | 20:ac1b4ffa3323 | 165 | // Integral part: |
Hendrikvg | 21:394a7a1deb73 | 166 | error_integral = error_integral + theta_error * Ts; |
Hendrikvg | 21:394a7a1deb73 | 167 | float torque_i = Ki * error_integral; |
Hendrikvg | 24:a9ec9b836fd9 | 168 | |
Hendrikvg | 20:ac1b4ffa3323 | 169 | // Derivative part: |
Hendrikvg | 21:394a7a1deb73 | 170 | float error_derivative = (theta_error - error_prev)/Ts; |
Hendrikvg | 21:394a7a1deb73 | 171 | float filtered_error_derivative = LowPassFilter.step(error_derivative); |
Hendrikvg | 21:394a7a1deb73 | 172 | float torque_d = Kd * filtered_error_derivative; |
Hendrikvg | 21:394a7a1deb73 | 173 | error_prev = theta_error; |
Hendrikvg | 24:a9ec9b836fd9 | 174 | |
Hendrikvg | 20:ac1b4ffa3323 | 175 | // Sum all parts and return it |
Hendrikvg | 21:394a7a1deb73 | 176 | float torque = torque_p + torque_i + torque_d; |
Hendrikvg | 21:394a7a1deb73 | 177 | return torque; |
Hendrikvg | 21:394a7a1deb73 | 178 | } |
Hendrikvg | 16:40183eeadb6d | 179 | |
Hendrikvg | 24:a9ec9b836fd9 | 180 | void CalculateDirectionMotor() |
Hendrikvg | 21:394a7a1deb73 | 181 | { |
Hendrikvg | 23:78898ddfb103 | 182 | direction_motor_1 = Controller(CalculateError(theta_reference_1,theta_1),0) <= 0.0f; |
Hendrikvg | 23:78898ddfb103 | 183 | direction_motor_2 = Controller(CalculateError(theta_reference_2,theta_2),1) <= 0.0f; |
Hendrikvg | 21:394a7a1deb73 | 184 | } |
Hendrikvg | 20:ac1b4ffa3323 | 185 | |
Hendrikvg | 23:78898ddfb103 | 186 | void ReadEncoder() |
Hendrikvg | 23:78898ddfb103 | 187 | { |
Hendrikvg | 23:78898ddfb103 | 188 | theta_1 = ((360.0f/64.0f)*(float)encoder_1.getPulses())/131.25f; // 360/64 voor de 64 CPR Encoder, 131.25 omdat de gear ratio 131.25:1 is. Hiermee is 1 omwenteling 360. |
Hendrikvg | 23:78898ddfb103 | 189 | theta_2 = ((360.0f/64.0f)*(float)encoder_2.getPulses())/131.25f; |
Hendrikvg | 23:78898ddfb103 | 190 | } |
Hendrikvg | 16:40183eeadb6d | 191 | |
Hendrikvg | 24:a9ec9b836fd9 | 192 | void MotorControl() |
Hendrikvg | 23:78898ddfb103 | 193 | { |
Hendrikvg | 21:394a7a1deb73 | 194 | ReadEncoder(); |
SjorsdeBruin | 26:088e397ec26f | 195 | theta_reference_1 = 360.0f*sin(0.1f*sinus_time.read()*2.0f*3.14f); // voor test, moet weg in eindscript |
Hendrikvg | 22:6cc93216b323 | 196 | CalculateDirectionMotor(); |
Hendrikvg | 23:78898ddfb103 | 197 | PWM_motor_1.write(fabs(Controller(CalculateError(theta_reference_1,theta_1),0)/360.0f)); |
Hendrikvg | 23:78898ddfb103 | 198 | PWM_motor_2.write(fabs(Controller(CalculateError(theta_reference_2,theta_2),1)/360.0f)); |
Hendrikvg | 21:394a7a1deb73 | 199 | } |
Hendrikvg | 21:394a7a1deb73 | 200 | |
Hendrikvg | 21:394a7a1deb73 | 201 | void go_next_1() |
Hendrikvg | 21:394a7a1deb73 | 202 | { |
Hendrikvg | 24:a9ec9b836fd9 | 203 | pressed_1 = !pressed_1; |
Hendrikvg | 21:394a7a1deb73 | 204 | } |
Hendrikvg | 21:394a7a1deb73 | 205 | |
Hendrikvg | 21:394a7a1deb73 | 206 | void go_next_2() |
Hendrikvg | 21:394a7a1deb73 | 207 | { |
Hendrikvg | 24:a9ec9b836fd9 | 208 | pressed_2 = !pressed_2; |
Hendrikvg | 24:a9ec9b836fd9 | 209 | } |
Hendrikvg | 24:a9ec9b836fd9 | 210 | |
SjorsdeBruin | 26:088e397ec26f | 211 | float EmgCalibration(float emgFiltered, float mvc_value, float rest_value) |
Hendrikvg | 24:a9ec9b836fd9 | 212 | { |
Hendrikvg | 24:a9ec9b836fd9 | 213 | float emgCalibrated; |
Hendrikvg | 24:a9ec9b836fd9 | 214 | if (emgFiltered <= rest_value) { |
Hendrikvg | 24:a9ec9b836fd9 | 215 | emgCalibrated = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 216 | } |
Hendrikvg | 24:a9ec9b836fd9 | 217 | if (emgFiltered >= mvc_value) { |
Hendrikvg | 24:a9ec9b836fd9 | 218 | emgCalibrated = 1; |
Hendrikvg | 24:a9ec9b836fd9 | 219 | } else { |
Hendrikvg | 24:a9ec9b836fd9 | 220 | emgCalibrated = (emgFiltered-rest_value)/(mvc_value-rest_value); |
Hendrikvg | 24:a9ec9b836fd9 | 221 | } |
Hendrikvg | 24:a9ec9b836fd9 | 222 | return emgCalibrated; |
Hendrikvg | 24:a9ec9b836fd9 | 223 | } |
Hendrikvg | 24:a9ec9b836fd9 | 224 | |
Hendrikvg | 24:a9ec9b836fd9 | 225 | void emgsample() |
Hendrikvg | 24:a9ec9b836fd9 | 226 | { |
SjorsdeBruin | 26:088e397ec26f | 227 | emgFiltered_bl = Highpass.step(emg_bl.read()); |
SjorsdeBruin | 26:088e397ec26f | 228 | emgFiltered_bl = notch.step(emgFiltered_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 229 | emgFiltered_bl = fabs(emgFiltered_bl); |
SjorsdeBruin | 26:088e397ec26f | 230 | emgFiltered_bl = Lowpass.step(emgFiltered_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 231 | |
SjorsdeBruin | 26:088e397ec26f | 232 | emgFiltered_br = Highpass.step(emg_br.read()); |
SjorsdeBruin | 26:088e397ec26f | 233 | emgFiltered_br = notch.step(emgFiltered_br); |
Hendrikvg | 24:a9ec9b836fd9 | 234 | emgFiltered_br = fabs(emgFiltered_br); |
SjorsdeBruin | 26:088e397ec26f | 235 | emgFiltered_br = Lowpass.step(emgFiltered_br); |
Hendrikvg | 24:a9ec9b836fd9 | 236 | |
SjorsdeBruin | 26:088e397ec26f | 237 | emgFiltered_leg = Highpass.step(emg_leg.read()); |
SjorsdeBruin | 26:088e397ec26f | 238 | emgFiltered_leg = notch.step(emgFiltered_leg); |
Hendrikvg | 24:a9ec9b836fd9 | 239 | emgFiltered_leg = fabs(emgFiltered_leg); |
SjorsdeBruin | 26:088e397ec26f | 240 | emgFiltered_leg = Lowpass.step(emgFiltered_leg); |
Hendrikvg | 24:a9ec9b836fd9 | 241 | } |
Hendrikvg | 24:a9ec9b836fd9 | 242 | |
Hendrikvg | 24:a9ec9b836fd9 | 243 | void rest() |
Hendrikvg | 24:a9ec9b836fd9 | 244 | { |
SjorsdeBruin | 26:088e397ec26f | 245 | if (CurrentSubstate == rest_biceps_left) { |
Hendrikvg | 24:a9ec9b836fd9 | 246 | emg = emgFiltered_bl; |
SjorsdeBruin | 26:088e397ec26f | 247 | //pc.printf("emg: %f \n\r",emgFiltered_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 248 | } |
SjorsdeBruin | 26:088e397ec26f | 249 | if (CurrentSubstate == rest_biceps_right) { |
Hendrikvg | 24:a9ec9b836fd9 | 250 | emg = emgFiltered_br; |
Hendrikvg | 24:a9ec9b836fd9 | 251 | } |
SjorsdeBruin | 26:088e397ec26f | 252 | if (CurrentSubstate == rest_biceps_leg) { |
Hendrikvg | 24:a9ec9b836fd9 | 253 | emg = emgFiltered_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 254 | } |
SjorsdeBruin | 26:088e397ec26f | 255 | if (n < 500) { |
SjorsdeBruin | 26:088e397ec26f | 256 | ledred(); |
Hendrikvg | 24:a9ec9b836fd9 | 257 | sum = sum + emg; |
SjorsdeBruin | 26:088e397ec26f | 258 | //pc.printf("sum: %f \n\r",sum); |
Hendrikvg | 24:a9ec9b836fd9 | 259 | n++; |
SjorsdeBruin | 26:088e397ec26f | 260 | rest_timeout.attach(rest,0.001f); |
Hendrikvg | 24:a9ec9b836fd9 | 261 | } |
SjorsdeBruin | 26:088e397ec26f | 262 | if (n == 500) { |
Hendrikvg | 24:a9ec9b836fd9 | 263 | sum = sum + emg; |
SjorsdeBruin | 26:088e397ec26f | 264 | //pc.printf("sum: %f \n\r",sum); |
Hendrikvg | 24:a9ec9b836fd9 | 265 | n++; |
SjorsdeBruin | 26:088e397ec26f | 266 | xrest_value = float (sum/n); |
SjorsdeBruin | 26:088e397ec26f | 267 | if (CurrentSubstate == rest_biceps_left) { |
SjorsdeBruin | 26:088e397ec26f | 268 | rest_value_bl = xrest_value; |
SjorsdeBruin | 26:088e397ec26f | 269 | pc.printf("rest_value_bl %f \n\r", rest_value_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 270 | CurrentSubstate = mvc_biceps_left; |
Hendrikvg | 24:a9ec9b836fd9 | 271 | SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 272 | ledblue(); |
SjorsdeBruin | 26:088e397ec26f | 273 | |
Hendrikvg | 24:a9ec9b836fd9 | 274 | } |
SjorsdeBruin | 26:088e397ec26f | 275 | if (CurrentSubstate == rest_biceps_right) { |
SjorsdeBruin | 26:088e397ec26f | 276 | rest_value_br = xrest_value; |
SjorsdeBruin | 26:088e397ec26f | 277 | pc.printf("rest_value_br %f \n\r", rest_value_br); |
Hendrikvg | 24:a9ec9b836fd9 | 278 | CurrentSubstate = mvc_biceps_right; |
Hendrikvg | 24:a9ec9b836fd9 | 279 | SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 280 | ledmagenta(); |
Hendrikvg | 24:a9ec9b836fd9 | 281 | } |
SjorsdeBruin | 26:088e397ec26f | 282 | if (CurrentSubstate == rest_biceps_leg) { |
SjorsdeBruin | 26:088e397ec26f | 283 | rest_value_leg = xrest_value; |
SjorsdeBruin | 26:088e397ec26f | 284 | pc.printf("rest_value_leg %f \n\r", rest_value_leg); |
SjorsdeBruin | 26:088e397ec26f | 285 | pc.printf("rest_value_bl %f \n\r", rest_value_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 286 | CurrentSubstate = mvc_biceps_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 287 | SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 288 | ledwhite(); |
Hendrikvg | 24:a9ec9b836fd9 | 289 | } |
Hendrikvg | 24:a9ec9b836fd9 | 290 | } |
Hendrikvg | 24:a9ec9b836fd9 | 291 | } |
Hendrikvg | 24:a9ec9b836fd9 | 292 | |
Hendrikvg | 24:a9ec9b836fd9 | 293 | void mvc() |
Hendrikvg | 24:a9ec9b836fd9 | 294 | { |
SjorsdeBruin | 26:088e397ec26f | 295 | if (CurrentSubstate == mvc_biceps_left) { |
Hendrikvg | 24:a9ec9b836fd9 | 296 | emg = emgFiltered_bl; |
Hendrikvg | 24:a9ec9b836fd9 | 297 | } |
SjorsdeBruin | 26:088e397ec26f | 298 | if (CurrentSubstate == mvc_biceps_right) { |
Hendrikvg | 24:a9ec9b836fd9 | 299 | emg = emgFiltered_br; |
Hendrikvg | 24:a9ec9b836fd9 | 300 | } |
SjorsdeBruin | 26:088e397ec26f | 301 | if (CurrentSubstate == mvc_biceps_leg) { |
Hendrikvg | 24:a9ec9b836fd9 | 302 | emg = emgFiltered_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 303 | } |
SjorsdeBruin | 26:088e397ec26f | 304 | if (emg >= xmvc_value) { |
Hendrikvg | 24:a9ec9b836fd9 | 305 | xmvc_value = emg; |
SjorsdeBruin | 26:088e397ec26f | 306 | } |
Hendrikvg | 24:a9ec9b836fd9 | 307 | n++; |
SjorsdeBruin | 26:088e397ec26f | 308 | if (n < 1000) { |
SjorsdeBruin | 26:088e397ec26f | 309 | mvc_timeout.attach(mvc,0.001f); |
SjorsdeBruin | 26:088e397ec26f | 310 | ledred(); |
Hendrikvg | 24:a9ec9b836fd9 | 311 | } |
SjorsdeBruin | 26:088e397ec26f | 312 | if (n == 1000) { |
SjorsdeBruin | 26:088e397ec26f | 313 | if (CurrentSubstate == mvc_biceps_left) { |
Hendrikvg | 24:a9ec9b836fd9 | 314 | mvc_value_bl = xmvc_value; |
SjorsdeBruin | 26:088e397ec26f | 315 | pc.printf("mvc_value_bl %f \n\r", mvc_value_bl); |
Hendrikvg | 24:a9ec9b836fd9 | 316 | CurrentSubstate = rest_biceps_right; |
Hendrikvg | 24:a9ec9b836fd9 | 317 | SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 318 | ledyellow(); |
Hendrikvg | 24:a9ec9b836fd9 | 319 | } |
SjorsdeBruin | 26:088e397ec26f | 320 | if (CurrentSubstate == mvc_biceps_right) { |
Hendrikvg | 24:a9ec9b836fd9 | 321 | mvc_value_br = xmvc_value; |
SjorsdeBruin | 26:088e397ec26f | 322 | pc.printf("mvc_value_br %f \n\r", mvc_value_br); |
Hendrikvg | 24:a9ec9b836fd9 | 323 | CurrentSubstate = rest_biceps_leg; |
Hendrikvg | 24:a9ec9b836fd9 | 324 | SubstateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 325 | ledcyan(); |
Hendrikvg | 24:a9ec9b836fd9 | 326 | } |
SjorsdeBruin | 26:088e397ec26f | 327 | if (CurrentSubstate == mvc_biceps_leg) { |
Hendrikvg | 24:a9ec9b836fd9 | 328 | mvc_value_leg = xmvc_value; |
SjorsdeBruin | 26:088e397ec26f | 329 | pc.printf("mvc_value_leg %f \n\r", mvc_value_leg); |
Hendrikvg | 24:a9ec9b836fd9 | 330 | CurrentState = vertical_movement; |
Hendrikvg | 24:a9ec9b836fd9 | 331 | StateChanged = true; |
SjorsdeBruin | 26:088e397ec26f | 332 | ledoff(); |
Hendrikvg | 24:a9ec9b836fd9 | 333 | } |
Hendrikvg | 24:a9ec9b836fd9 | 334 | xmvc_value = 1e-11; |
Hendrikvg | 24:a9ec9b836fd9 | 335 | } |
Hendrikvg | 24:a9ec9b836fd9 | 336 | } |
Hendrikvg | 24:a9ec9b836fd9 | 337 | |
SjorsdeBruin | 26:088e397ec26f | 338 | float emgCalibrated_bl; |
SjorsdeBruin | 26:088e397ec26f | 339 | float emgCalibrated_br; |
SjorsdeBruin | 26:088e397ec26f | 340 | float emgCalibrated_leg; |
SjorsdeBruin | 26:088e397ec26f | 341 | |
Hendrikvg | 24:a9ec9b836fd9 | 342 | void WriteScope() |
Hendrikvg | 24:a9ec9b836fd9 | 343 | { |
SjorsdeBruin | 26:088e397ec26f | 344 | emgsample(); |
SjorsdeBruin | 26:088e397ec26f | 345 | /* |
SjorsdeBruin | 26:088e397ec26f | 346 | if (emgFiltered_bl <= rest_value_bl) { |
SjorsdeBruin | 26:088e397ec26f | 347 | emgCalibrated_bl = 0; |
SjorsdeBruin | 26:088e397ec26f | 348 | } |
SjorsdeBruin | 26:088e397ec26f | 349 | if (emgFiltered_bl >= mvc_value_bl) { |
SjorsdeBruin | 26:088e397ec26f | 350 | emgCalibrated_bl = 1; |
SjorsdeBruin | 26:088e397ec26f | 351 | } else { |
SjorsdeBruin | 26:088e397ec26f | 352 | emgCalibrated_bl = (emgFiltered_bl - rest_value_bl) / (mvc_value_bl - rest_value_bl); |
SjorsdeBruin | 26:088e397ec26f | 353 | } |
SjorsdeBruin | 26:088e397ec26f | 354 | if (emgFiltered_br <= rest_value_br) { |
SjorsdeBruin | 26:088e397ec26f | 355 | emgCalibrated_br = 0; |
SjorsdeBruin | 26:088e397ec26f | 356 | } |
SjorsdeBruin | 26:088e397ec26f | 357 | if (emgFiltered_br >= mvc_value_br) { |
SjorsdeBruin | 26:088e397ec26f | 358 | emgCalibrated_br = 1; |
SjorsdeBruin | 26:088e397ec26f | 359 | } else { |
SjorsdeBruin | 26:088e397ec26f | 360 | emgCalibrated_br = (emgFiltered_br - rest_value_br) / (mvc_value_br - rest_value_br); |
SjorsdeBruin | 26:088e397ec26f | 361 | } |
SjorsdeBruin | 26:088e397ec26f | 362 | if (emgFiltered_leg <= rest_value_leg) { |
SjorsdeBruin | 26:088e397ec26f | 363 | emgCalibrated_leg = 0; |
SjorsdeBruin | 26:088e397ec26f | 364 | } |
SjorsdeBruin | 26:088e397ec26f | 365 | if (emgFiltered_leg >= mvc_value_leg) { |
SjorsdeBruin | 26:088e397ec26f | 366 | emgCalibrated_leg = 1; |
SjorsdeBruin | 26:088e397ec26f | 367 | } else { |
SjorsdeBruin | 26:088e397ec26f | 368 | emgCalibrated_leg = (emgFiltered_leg - rest_value_leg) / (mvc_value_leg - rest_value_leg); |
SjorsdeBruin | 26:088e397ec26f | 369 | } |
SjorsdeBruin | 26:088e397ec26f | 370 | */ |
SjorsdeBruin | 26:088e397ec26f | 371 | /* |
Hendrikvg | 24:a9ec9b836fd9 | 372 | scope.set(0, EmgCalibration(emgFiltered_bl, mvc_value_bl, rest_value_bl)); |
SjorsdeBruin | 26:088e397ec26f | 373 | scope.set(1, EmgCalibration(emgFiltered_br, mvc_value_br, rest_value_br)); |
Hendrikvg | 24:a9ec9b836fd9 | 374 | scope.set(2, EmgCalibration(emgFiltered_leg, mvc_value_leg, rest_value_leg)); |
SjorsdeBruin | 26:088e397ec26f | 375 | */ |
SjorsdeBruin | 26:088e397ec26f | 376 | /* |
SjorsdeBruin | 26:088e397ec26f | 377 | scope.set(0, emgCalibrated_bl); |
SjorsdeBruin | 26:088e397ec26f | 378 | scope.set(1, emgCalibrated_br); |
SjorsdeBruin | 26:088e397ec26f | 379 | scope.set(2, emgCalibrated_leg); |
SjorsdeBruin | 26:088e397ec26f | 380 | */ |
SjorsdeBruin | 26:088e397ec26f | 381 | scope.set(0, emg_bl.read()); |
SjorsdeBruin | 26:088e397ec26f | 382 | scope.set(1, emgCalibrated_bl); |
SjorsdeBruin | 26:088e397ec26f | 383 | scope.set(2, EmgCalibration(emgFiltered_bl, mvc_value_bl, rest_value_bl)); |
Hendrikvg | 24:a9ec9b836fd9 | 384 | scope.send(); |
Hendrikvg | 24:a9ec9b836fd9 | 385 | } |
Hendrikvg | 24:a9ec9b836fd9 | 386 | |
Hendrikvg | 24:a9ec9b836fd9 | 387 | void SubstateTransition() |
Hendrikvg | 24:a9ec9b836fd9 | 388 | { |
SjorsdeBruin | 26:088e397ec26f | 389 | if (SubstateChanged == true) { |
SjorsdeBruin | 26:088e397ec26f | 390 | SubstateChanged = false; |
SjorsdeBruin | 26:088e397ec26f | 391 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 392 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 393 | if (CurrentSubstate == rest_biceps_left) { |
SjorsdeBruin | 26:088e397ec26f | 394 | ledgreen(); |
SjorsdeBruin | 26:088e397ec26f | 395 | pc.printf("groen \n\r"); |
SjorsdeBruin | 26:088e397ec26f | 396 | pc.printf("Initiating rest_biceps_left\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 397 | } |
SjorsdeBruin | 26:088e397ec26f | 398 | if (CurrentSubstate == mvc_biceps_left) { |
SjorsdeBruin | 26:088e397ec26f | 399 | //ledblue(); |
SjorsdeBruin | 26:088e397ec26f | 400 | pc.printf("Initiating mvc_biceps_left\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 401 | } |
SjorsdeBruin | 26:088e397ec26f | 402 | if (CurrentSubstate == rest_biceps_right) { |
SjorsdeBruin | 26:088e397ec26f | 403 | //ledyellow(); |
SjorsdeBruin | 26:088e397ec26f | 404 | pc.printf("Initiating rest_biceps_right\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 405 | } |
SjorsdeBruin | 26:088e397ec26f | 406 | if (CurrentSubstate == mvc_biceps_right) { |
SjorsdeBruin | 26:088e397ec26f | 407 | //ledmagenta(); |
SjorsdeBruin | 26:088e397ec26f | 408 | pc.printf("Initiating mvc_biceps_right\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 409 | } |
SjorsdeBruin | 26:088e397ec26f | 410 | if (CurrentSubstate == rest_biceps_leg) { |
SjorsdeBruin | 26:088e397ec26f | 411 | //ledcyan(); |
SjorsdeBruin | 26:088e397ec26f | 412 | pc.printf("Initiating rest_biceps_leg\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 413 | } |
SjorsdeBruin | 26:088e397ec26f | 414 | if (CurrentSubstate == mvc_biceps_leg) { |
SjorsdeBruin | 26:088e397ec26f | 415 | //ledwhite(); |
SjorsdeBruin | 26:088e397ec26f | 416 | pc.printf("Initiating mvc_biceps_leg\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 417 | } |
SjorsdeBruin | 26:088e397ec26f | 418 | } |
Hendrikvg | 21:394a7a1deb73 | 419 | } |
Hendrikvg | 21:394a7a1deb73 | 420 | |
Hendrikvg | 21:394a7a1deb73 | 421 | void while_start() |
Hendrikvg | 21:394a7a1deb73 | 422 | { |
Hendrikvg | 21:394a7a1deb73 | 423 | // Do startup stuff |
Hendrikvg | 21:394a7a1deb73 | 424 | CurrentState = motor_calibration; |
Hendrikvg | 21:394a7a1deb73 | 425 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 426 | } |
Hendrikvg | 21:394a7a1deb73 | 427 | |
Hendrikvg | 21:394a7a1deb73 | 428 | void while_motor_calibration() |
Hendrikvg | 21:394a7a1deb73 | 429 | { |
Hendrikvg | 21:394a7a1deb73 | 430 | // Do motor calibration stuff |
Hendrikvg | 24:a9ec9b836fd9 | 431 | if (pressed_1) { // bool aanmaken voor demo (switch oid aanmaken) |
Hendrikvg | 21:394a7a1deb73 | 432 | CurrentState = demo_mode; |
Hendrikvg | 21:394a7a1deb73 | 433 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 434 | } |
Hendrikvg | 24:a9ec9b836fd9 | 435 | if (pressed_2) { // bool aanmaken voor EMG (switch oid aanmaken) |
Hendrikvg | 21:394a7a1deb73 | 436 | CurrentState = emg_calibration; |
Hendrikvg | 21:394a7a1deb73 | 437 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 438 | } |
Hendrikvg | 21:394a7a1deb73 | 439 | } |
Hendrikvg | 21:394a7a1deb73 | 440 | |
Hendrikvg | 21:394a7a1deb73 | 441 | void while_demo_mode() |
Hendrikvg | 21:394a7a1deb73 | 442 | { |
Hendrikvg | 21:394a7a1deb73 | 443 | // Do demo mode stuff |
SjorsdeBruin | 26:088e397ec26f | 444 | if ((pressed_1) || (pressed_2)) { |
Hendrikvg | 21:394a7a1deb73 | 445 | CurrentState = emg_calibration; |
Hendrikvg | 21:394a7a1deb73 | 446 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 447 | } |
Hendrikvg | 21:394a7a1deb73 | 448 | } |
Hendrikvg | 21:394a7a1deb73 | 449 | |
Hendrikvg | 21:394a7a1deb73 | 450 | void while_emg_calibration() |
Hendrikvg | 21:394a7a1deb73 | 451 | { |
Hendrikvg | 21:394a7a1deb73 | 452 | // Do emg calibration stuff |
Hendrikvg | 24:a9ec9b836fd9 | 453 | switch (CurrentSubstate) { |
Hendrikvg | 24:a9ec9b836fd9 | 454 | case rest_biceps_left: |
Hendrikvg | 24:a9ec9b836fd9 | 455 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 456 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 457 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 458 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 459 | n = 0; |
SjorsdeBruin | 26:088e397ec26f | 460 | sum = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 461 | rest(); |
Hendrikvg | 24:a9ec9b836fd9 | 462 | } |
Hendrikvg | 24:a9ec9b836fd9 | 463 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 464 | case mvc_biceps_left: |
Hendrikvg | 24:a9ec9b836fd9 | 465 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 466 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 467 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 468 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 469 | n = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 470 | mvc(); |
Hendrikvg | 24:a9ec9b836fd9 | 471 | } |
Hendrikvg | 24:a9ec9b836fd9 | 472 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 473 | case rest_biceps_right: |
Hendrikvg | 24:a9ec9b836fd9 | 474 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 475 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 476 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 477 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 478 | n = 0; |
SjorsdeBruin | 26:088e397ec26f | 479 | sum = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 480 | rest(); |
Hendrikvg | 24:a9ec9b836fd9 | 481 | } |
Hendrikvg | 24:a9ec9b836fd9 | 482 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 483 | case mvc_biceps_right: |
Hendrikvg | 24:a9ec9b836fd9 | 484 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 485 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 486 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 487 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 488 | n = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 489 | mvc(); |
Hendrikvg | 24:a9ec9b836fd9 | 490 | } |
Hendrikvg | 24:a9ec9b836fd9 | 491 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 492 | case rest_biceps_leg: |
Hendrikvg | 24:a9ec9b836fd9 | 493 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 494 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 495 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 496 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 497 | n = 0; |
SjorsdeBruin | 26:088e397ec26f | 498 | sum = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 499 | rest(); |
Hendrikvg | 24:a9ec9b836fd9 | 500 | } |
Hendrikvg | 24:a9ec9b836fd9 | 501 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 502 | case mvc_biceps_leg: |
Hendrikvg | 24:a9ec9b836fd9 | 503 | SubstateTransition(); |
SjorsdeBruin | 26:088e397ec26f | 504 | if ((pressed_1) || (pressed_2)) { |
SjorsdeBruin | 26:088e397ec26f | 505 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 506 | pressed_2 = false; |
SjorsdeBruin | 26:088e397ec26f | 507 | n = 0; |
Hendrikvg | 24:a9ec9b836fd9 | 508 | mvc(); |
Hendrikvg | 24:a9ec9b836fd9 | 509 | } |
Hendrikvg | 24:a9ec9b836fd9 | 510 | break; |
Hendrikvg | 24:a9ec9b836fd9 | 511 | default: |
Hendrikvg | 24:a9ec9b836fd9 | 512 | pc.printf("Unknown or unimplemented state reached!\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 513 | } |
Hendrikvg | 21:394a7a1deb73 | 514 | } |
Hendrikvg | 21:394a7a1deb73 | 515 | |
Hendrikvg | 21:394a7a1deb73 | 516 | void while_vertical_movement() |
Hendrikvg | 21:394a7a1deb73 | 517 | { |
Hendrikvg | 21:394a7a1deb73 | 518 | // Do vertical movement stuff |
SjorsdeBruin | 26:088e397ec26f | 519 | if ((pressed_1) || (pressed_2)) { // EMG gebaseerde threshold aanmaken |
Hendrikvg | 21:394a7a1deb73 | 520 | CurrentState = horizontal_movement; |
Hendrikvg | 21:394a7a1deb73 | 521 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 522 | } |
Hendrikvg | 21:394a7a1deb73 | 523 | } |
Hendrikvg | 17:cacf9e75eda7 | 524 | |
Hendrikvg | 21:394a7a1deb73 | 525 | void while_horizontal_movement() |
Hendrikvg | 21:394a7a1deb73 | 526 | { |
Hendrikvg | 21:394a7a1deb73 | 527 | // Do horizontal movement stuff |
SjorsdeBruin | 26:088e397ec26f | 528 | if ((pressed_1) || (pressed_2)) { // EMG gebaseerde threshold aanmaken |
Hendrikvg | 21:394a7a1deb73 | 529 | CurrentState = vertical_movement; |
Hendrikvg | 21:394a7a1deb73 | 530 | StateChanged = true; |
Hendrikvg | 21:394a7a1deb73 | 531 | } |
Hendrikvg | 21:394a7a1deb73 | 532 | } |
Hendrikvg | 21:394a7a1deb73 | 533 | |
Hendrikvg | 21:394a7a1deb73 | 534 | void StateTransition() |
Hendrikvg | 21:394a7a1deb73 | 535 | { |
Hendrikvg | 24:a9ec9b836fd9 | 536 | if (StateChanged) { |
SjorsdeBruin | 26:088e397ec26f | 537 | pressed_1 = false; |
SjorsdeBruin | 26:088e397ec26f | 538 | pressed_2 = false; |
Hendrikvg | 24:a9ec9b836fd9 | 539 | if (CurrentState == start) { |
Hendrikvg | 21:394a7a1deb73 | 540 | pc.printf("Initiating start.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 541 | } |
Hendrikvg | 24:a9ec9b836fd9 | 542 | if (CurrentState == motor_calibration) { |
Hendrikvg | 21:394a7a1deb73 | 543 | pc.printf("Initiating motor_calibration.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 544 | } |
Hendrikvg | 24:a9ec9b836fd9 | 545 | if (CurrentState == demo_mode) { |
Hendrikvg | 21:394a7a1deb73 | 546 | pc.printf("Initiating demo_mode.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 547 | } |
Hendrikvg | 24:a9ec9b836fd9 | 548 | if (CurrentState == emg_calibration) { |
Hendrikvg | 21:394a7a1deb73 | 549 | pc.printf("Initiating emg_calibration.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 550 | } |
Hendrikvg | 24:a9ec9b836fd9 | 551 | if (CurrentState == vertical_movement) { |
Hendrikvg | 21:394a7a1deb73 | 552 | pc.printf("Initiating vertical_movement.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 553 | } |
Hendrikvg | 24:a9ec9b836fd9 | 554 | if (CurrentState == horizontal_movement) { |
Hendrikvg | 21:394a7a1deb73 | 555 | pc.printf("Initiating horizontal_movement.\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 556 | } |
Hendrikvg | 21:394a7a1deb73 | 557 | StateChanged = false; |
Hendrikvg | 21:394a7a1deb73 | 558 | } |
Hendrikvg | 21:394a7a1deb73 | 559 | } |
Hendrikvg | 21:394a7a1deb73 | 560 | |
Hendrikvg | 21:394a7a1deb73 | 561 | void StateMachine() |
Hendrikvg | 21:394a7a1deb73 | 562 | { |
Hendrikvg | 24:a9ec9b836fd9 | 563 | switch(CurrentState) { |
Hendrikvg | 21:394a7a1deb73 | 564 | case start: |
Hendrikvg | 21:394a7a1deb73 | 565 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 566 | while_start(); |
Hendrikvg | 21:394a7a1deb73 | 567 | break; |
Hendrikvg | 21:394a7a1deb73 | 568 | case motor_calibration: |
Hendrikvg | 21:394a7a1deb73 | 569 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 570 | while_motor_calibration(); |
Hendrikvg | 21:394a7a1deb73 | 571 | break; |
Hendrikvg | 21:394a7a1deb73 | 572 | case demo_mode: |
Hendrikvg | 21:394a7a1deb73 | 573 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 574 | while_demo_mode(); |
Hendrikvg | 21:394a7a1deb73 | 575 | break; |
Hendrikvg | 21:394a7a1deb73 | 576 | case emg_calibration: |
Hendrikvg | 21:394a7a1deb73 | 577 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 578 | while_emg_calibration(); |
Hendrikvg | 21:394a7a1deb73 | 579 | break; |
Hendrikvg | 21:394a7a1deb73 | 580 | case vertical_movement: |
Hendrikvg | 21:394a7a1deb73 | 581 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 582 | while_vertical_movement(); |
Hendrikvg | 21:394a7a1deb73 | 583 | break; |
Hendrikvg | 21:394a7a1deb73 | 584 | case horizontal_movement: |
Hendrikvg | 21:394a7a1deb73 | 585 | StateTransition(); |
Hendrikvg | 21:394a7a1deb73 | 586 | while_horizontal_movement(); |
Hendrikvg | 21:394a7a1deb73 | 587 | break; |
Hendrikvg | 21:394a7a1deb73 | 588 | default: |
Hendrikvg | 21:394a7a1deb73 | 589 | pc.printf("Unknown or unimplemented state reached!\n\r"); |
Hendrikvg | 21:394a7a1deb73 | 590 | } |
Hendrikvg | 21:394a7a1deb73 | 591 | } |
Hendrikvg | 21:394a7a1deb73 | 592 | |
Hendrikvg | 15:80b3ac2b8448 | 593 | // main |
Hendrikvg | 24:a9ec9b836fd9 | 594 | int main() |
Hendrikvg | 24:a9ec9b836fd9 | 595 | { |
RobertoO | 0:67c50348f842 | 596 | pc.baud(115200); |
Hendrikvg | 17:cacf9e75eda7 | 597 | pc.printf("Hello World!\n\r"); |
SjorsdeBruin | 26:088e397ec26f | 598 | ledoff(); |
Hendrikvg | 21:394a7a1deb73 | 599 | button_1.fall(go_next_1); |
Hendrikvg | 21:394a7a1deb73 | 600 | button_2.fall(go_next_2); |
SjorsdeBruin | 26:088e397ec26f | 601 | //sinus_time.start(); |
SjorsdeBruin | 26:088e397ec26f | 602 | //PWM_motor_1.period_ms(10); |
SjorsdeBruin | 26:088e397ec26f | 603 | //motor_control.attach(&MotorControl, Ts); |
SjorsdeBruin | 26:088e397ec26f | 604 | write_scope.attach(&WriteScope, 0.001); |
Hendrikvg | 21:394a7a1deb73 | 605 | //TickerStateMachine.attach(StateMachine,1.00f); |
Hendrikvg | 21:394a7a1deb73 | 606 | while(true) { |
Hendrikvg | 21:394a7a1deb73 | 607 | StateMachine(); |
Hendrikvg | 21:394a7a1deb73 | 608 | } |
SjorsdeBruin | 26:088e397ec26f | 609 | } |