lololololol

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Committer:
sembert
Date:
Thu Oct 31 21:49:14 2019 +0000
Revision:
36:66f500e387c4
Parent:
35:ab9b1c9b6d08
lololol;

Who changed what in which revision?

UserRevisionLine numberNew 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
SjorsdeBruin 31:465a6e1e1db6 33 int m = 0;
SjorsdeBruin 31:465a6e1e1db6 34
sembert 36:66f500e387c4 35 const float pi = 3.1416f;
sembert 36:66f500e387c4 36 const float l = 0.535f;
Hendrikvg 21:394a7a1deb73 37 Ticker TickerStateMachine;
Hendrikvg 23:78898ddfb103 38 Ticker motor_control;
Hendrikvg 23:78898ddfb103 39 Ticker write_scope;
Hendrikvg 21:394a7a1deb73 40 Timer sinus_time;
Hendrikvg 24:a9ec9b836fd9 41 Timeout rest_timeout;
Hendrikvg 24:a9ec9b836fd9 42 Timeout mvc_timeout;
SjorsdeBruin 26:088e397ec26f 43 Timeout led_timeout;
Hendrikvg 21:394a7a1deb73 44 enum states {start, motor_calibration, demo_mode, emg_calibration, vertical_movement, horizontal_movement};
Hendrikvg 21:394a7a1deb73 45 states CurrentState = start;
Hendrikvg 21:394a7a1deb73 46 bool StateChanged = true;
Hendrikvg 24:a9ec9b836fd9 47 enum substates {rest_biceps_left, mvc_biceps_left, rest_biceps_right, mvc_biceps_right, rest_biceps_leg, mvc_biceps_leg};
Hendrikvg 24:a9ec9b836fd9 48 substates CurrentSubstate = rest_biceps_left;
Hendrikvg 24:a9ec9b836fd9 49 bool SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 50 volatile bool pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 51 volatile bool pressed_2 = false;
SjorsdeBruin 27:d37b3a0e0f2b 52 HIDScope scope(6);
SjorsdeBruin 26:088e397ec26f 53
sembert 36:66f500e387c4 54 volatile float theta_ref1 = 0.5f*pi;
sembert 36:66f500e387c4 55 volatile float theta_ref2 = 3.0f*pi/4.0f;
sembert 36:66f500e387c4 56 float Ts = 0.1f;
sembert 35:ab9b1c9b6d08 57 float Kp0;
sembert 35:ab9b1c9b6d08 58 float Ki0;
sembert 35:ab9b1c9b6d08 59 float Kd0;
sembert 35:ab9b1c9b6d08 60 float Kp1;
sembert 35:ab9b1c9b6d08 61 float Ki1;
sembert 35:ab9b1c9b6d08 62 float Kd1;
sembert 36:66f500e387c4 63 float theta_1;
sembert 36:66f500e387c4 64 float theta_2;
SjorsdeBruin 29:5a846abba59e 65 float theta_error1;
SjorsdeBruin 29:5a846abba59e 66 float theta_error2;
SjorsdeBruin 29:5a846abba59e 67 float torque_1;
SjorsdeBruin 29:5a846abba59e 68 float torque_2;
SjorsdeBruin 28:8c90a46b613e 69 float x;
SjorsdeBruin 28:8c90a46b613e 70 float y;
SjorsdeBruin 33:1da600f06862 71 volatile float EMGx_velocity = 0.0f;
SjorsdeBruin 33:1da600f06862 72 volatile float EMGy_velocity = 0.0f;
SjorsdeBruin 30:a16519224d58 73
SjorsdeBruin 27:d37b3a0e0f2b 74 BiQuad Lowpass_bl ( 1.55148e-04, 3.10297e-04, 1.55148e-04, -1.96446e+00, 9.65081e-01 );
SjorsdeBruin 27:d37b3a0e0f2b 75 BiQuad Highpass_bl ( 9.40809e-01, -9.40809e-01, 0.00000e+00, -8.81619e-01, 0.00000e+00);
SjorsdeBruin 27:d37b3a0e0f2b 76 BiQuad notch_bl (9.98432e-01, -1.89913e+00, 9.98432e-01, -1.89913e+00, 9.96886e-01);
SjorsdeBruin 27:d37b3a0e0f2b 77 BiQuad Lowpass_br ( 1.55148e-04, 3.10297e-04, 1.55148e-04, -1.96446e+00, 9.65081e-01 );
SjorsdeBruin 27:d37b3a0e0f2b 78 BiQuad Highpass_br ( 9.40809e-01, -9.40809e-01, 0.00000e+00, -8.81619e-01, 0.00000e+00);
SjorsdeBruin 27:d37b3a0e0f2b 79 BiQuad notch_br (9.98432e-01, -1.89913e+00, 9.98432e-01, -1.89913e+00, 9.96886e-01);
SjorsdeBruin 27:d37b3a0e0f2b 80 BiQuad Lowpass_leg ( 1.55148e-04, 3.10297e-04, 1.55148e-04, -1.96446e+00, 9.65081e-01 );
SjorsdeBruin 27:d37b3a0e0f2b 81 BiQuad Highpass_leg ( 9.40809e-01, -9.40809e-01, 0.00000e+00, -8.81619e-01, 0.00000e+00);
SjorsdeBruin 27:d37b3a0e0f2b 82 BiQuad notch_leg (9.98432e-01, -1.89913e+00, 9.98432e-01, -1.89913e+00, 9.96886e-01);
SjorsdeBruin 26:088e397ec26f 83
Hendrikvg 24:a9ec9b836fd9 84 int n = 0;
Hendrikvg 24:a9ec9b836fd9 85
SjorsdeBruin 26:088e397ec26f 86 float emgFiltered_bl;
SjorsdeBruin 26:088e397ec26f 87 float emgFiltered_br;
SjorsdeBruin 26:088e397ec26f 88 float emgFiltered_leg;
SjorsdeBruin 26:088e397ec26f 89 float emg;
SjorsdeBruin 26:088e397ec26f 90 float xmvc_value = 1e-11;
Hendrikvg 24:a9ec9b836fd9 91
Hendrikvg 24:a9ec9b836fd9 92 float sum = 0;
SjorsdeBruin 26:088e397ec26f 93 float xrest_value;
Hendrikvg 24:a9ec9b836fd9 94 float rest_value_bl;
Hendrikvg 24:a9ec9b836fd9 95 float rest_value_br;
Hendrikvg 24:a9ec9b836fd9 96 float rest_value_leg;
Hendrikvg 24:a9ec9b836fd9 97
Hendrikvg 24:a9ec9b836fd9 98 float mvc_value_bl;
Hendrikvg 24:a9ec9b836fd9 99 float mvc_value_br;
Hendrikvg 24:a9ec9b836fd9 100 float mvc_value_leg;
Hendrikvg 24:a9ec9b836fd9 101
SjorsdeBruin 28:8c90a46b613e 102 float treshold_bl = 0.5;
SjorsdeBruin 28:8c90a46b613e 103 float treshold_br = 0.5;
SjorsdeBruin 28:8c90a46b613e 104 float treshold_leg = 0.5;
SjorsdeBruin 28:8c90a46b613e 105
SjorsdeBruin 28:8c90a46b613e 106 bool previous_value_emg_leg;
SjorsdeBruin 28:8c90a46b613e 107 bool current_value_emg_leg;
SjorsdeBruin 28:8c90a46b613e 108
SjorsdeBruin 33:1da600f06862 109 volatile char command;
sembert 36:66f500e387c4 110
Hendrikvg 21:394a7a1deb73 111 // functies
SjorsdeBruin 26:088e397ec26f 112 void ledred()
SjorsdeBruin 26:088e397ec26f 113 {
SjorsdeBruin 26:088e397ec26f 114 led_red = 0;
SjorsdeBruin 26:088e397ec26f 115 led_green = 1;
SjorsdeBruin 26:088e397ec26f 116 led_blue = 1;
SjorsdeBruin 26:088e397ec26f 117 }
SjorsdeBruin 26:088e397ec26f 118 void ledgreen()
SjorsdeBruin 26:088e397ec26f 119 {
SjorsdeBruin 26:088e397ec26f 120 led_green=0;
SjorsdeBruin 26:088e397ec26f 121 led_blue=1;
SjorsdeBruin 26:088e397ec26f 122 led_red=1;
SjorsdeBruin 26:088e397ec26f 123 }
SjorsdeBruin 26:088e397ec26f 124 void ledblue()
SjorsdeBruin 26:088e397ec26f 125 {
SjorsdeBruin 26:088e397ec26f 126 led_green=1;
SjorsdeBruin 26:088e397ec26f 127 led_blue=0;
SjorsdeBruin 26:088e397ec26f 128 led_red=1;
SjorsdeBruin 26:088e397ec26f 129 }
SjorsdeBruin 26:088e397ec26f 130 void ledyellow()
SjorsdeBruin 26:088e397ec26f 131 {
SjorsdeBruin 26:088e397ec26f 132 led_green=0;
SjorsdeBruin 26:088e397ec26f 133 led_blue=1;
SjorsdeBruin 26:088e397ec26f 134 led_red=0;
SjorsdeBruin 26:088e397ec26f 135 }
SjorsdeBruin 26:088e397ec26f 136 void ledmagenta()
SjorsdeBruin 26:088e397ec26f 137 {
SjorsdeBruin 26:088e397ec26f 138 led_green=1;
SjorsdeBruin 26:088e397ec26f 139 led_blue=0;
SjorsdeBruin 26:088e397ec26f 140 led_red=0;
SjorsdeBruin 26:088e397ec26f 141 }
SjorsdeBruin 26:088e397ec26f 142 void ledcyan()
SjorsdeBruin 26:088e397ec26f 143 {
SjorsdeBruin 26:088e397ec26f 144 led_green=0;
SjorsdeBruin 26:088e397ec26f 145 led_blue=0;
SjorsdeBruin 26:088e397ec26f 146 led_red=1;
SjorsdeBruin 26:088e397ec26f 147 }
SjorsdeBruin 26:088e397ec26f 148 void ledwhite()
SjorsdeBruin 26:088e397ec26f 149 {
SjorsdeBruin 26:088e397ec26f 150 led_green=0;
SjorsdeBruin 26:088e397ec26f 151 led_blue=0;
SjorsdeBruin 26:088e397ec26f 152 led_red=0;
SjorsdeBruin 26:088e397ec26f 153 }
SjorsdeBruin 26:088e397ec26f 154 void ledoff()
SjorsdeBruin 26:088e397ec26f 155 {
SjorsdeBruin 26:088e397ec26f 156 led_green=1;
SjorsdeBruin 26:088e397ec26f 157 led_blue=1;
SjorsdeBruin 26:088e397ec26f 158 led_red=1;
SjorsdeBruin 26:088e397ec26f 159 }
SjorsdeBruin 26:088e397ec26f 160
SjorsdeBruin 33:1da600f06862 161 bool get_command_a() {
SjorsdeBruin 33:1da600f06862 162 command = pc.getcNb();
SjorsdeBruin 33:1da600f06862 163 if (command == 'a') {
SjorsdeBruin 33:1da600f06862 164 pc.printf("a is ingedrukt! \n\r");
SjorsdeBruin 33:1da600f06862 165 return true;
SjorsdeBruin 33:1da600f06862 166 } else {
SjorsdeBruin 33:1da600f06862 167 return false;
SjorsdeBruin 33:1da600f06862 168 }
SjorsdeBruin 33:1da600f06862 169 }
SjorsdeBruin 33:1da600f06862 170
SjorsdeBruin 33:1da600f06862 171 bool get_command_d () {
SjorsdeBruin 33:1da600f06862 172 command = pc.getcNb();
SjorsdeBruin 33:1da600f06862 173 if (command == 'd') {
SjorsdeBruin 33:1da600f06862 174 pc.printf("d is ingedrukt! \n\r");
SjorsdeBruin 33:1da600f06862 175 return true;
SjorsdeBruin 33:1da600f06862 176 } else {
SjorsdeBruin 33:1da600f06862 177 return false;
SjorsdeBruin 33:1da600f06862 178 }
SjorsdeBruin 33:1da600f06862 179 }
SjorsdeBruin 33:1da600f06862 180
SjorsdeBruin 33:1da600f06862 181 bool get_command_s () {
SjorsdeBruin 33:1da600f06862 182 command = pc.getcNb();
SjorsdeBruin 33:1da600f06862 183 if (command == 's') {
SjorsdeBruin 33:1da600f06862 184 pc.printf("s is ingedrukt! \n\r");
SjorsdeBruin 33:1da600f06862 185 return true;
SjorsdeBruin 33:1da600f06862 186 } else {
SjorsdeBruin 33:1da600f06862 187 return false;
SjorsdeBruin 33:1da600f06862 188 }
SjorsdeBruin 33:1da600f06862 189 }
SjorsdeBruin 33:1da600f06862 190
sembert 34:89a424fd37ce 191 float CalculateError(float theta_reference,float theta)
sembert 34:89a424fd37ce 192 {
sembert 34:89a424fd37ce 193 float theta_error = theta_reference-theta;
sembert 34:89a424fd37ce 194 return theta_error;
sembert 34:89a424fd37ce 195 }
sembert 34:89a424fd37ce 196
sembert 34:89a424fd37ce 197 float Controller(float theta_error, bool motor)
Hendrikvg 21:394a7a1deb73 198 {
sembert 34:89a424fd37ce 199 if (motor == false) {
sembert 35:ab9b1c9b6d08 200 float K0 = 75.0f;
sembert 35:ab9b1c9b6d08 201 float ti0 = 5.0f;
sembert 35:ab9b1c9b6d08 202 float td0 = 0.1f;
sembert 35:ab9b1c9b6d08 203 Kp0 = K0*(1+td0/ti0);
sembert 35:ab9b1c9b6d08 204 Ki0 = K0/ti0;
sembert 35:ab9b1c9b6d08 205 Kd0 = K0*td0;
sembert 35:ab9b1c9b6d08 206
sembert 35:ab9b1c9b6d08 207 static float error_integral0 = 0;
sembert 35:ab9b1c9b6d08 208 static float error_prev0 = 0;
sembert 35:ab9b1c9b6d08 209 static BiQuad LowPassFilter0(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
sembert 35:ab9b1c9b6d08 210
sembert 35:ab9b1c9b6d08 211 // Proportional part:
sembert 35:ab9b1c9b6d08 212 float torque_p0 = Kp0 * theta_error;
sembert 35:ab9b1c9b6d08 213
sembert 35:ab9b1c9b6d08 214 // Integral part:
sembert 35:ab9b1c9b6d08 215 error_integral0 = error_integral0 + theta_error * Ts;
sembert 35:ab9b1c9b6d08 216 float torque_i0 = Ki0 * error_integral0;
sembert 35:ab9b1c9b6d08 217
sembert 35:ab9b1c9b6d08 218 // Derivative part:
sembert 35:ab9b1c9b6d08 219 float error_derivative0 = (theta_error - error_prev0)/Ts;
sembert 35:ab9b1c9b6d08 220 float filtered_error_derivative0 = LowPassFilter0.step(error_derivative0);
sembert 35:ab9b1c9b6d08 221 float torque_d0 = Kd0 * filtered_error_derivative0;
sembert 35:ab9b1c9b6d08 222 error_prev0 = theta_error;
sembert 35:ab9b1c9b6d08 223
sembert 35:ab9b1c9b6d08 224 // Sum all parts and return it
sembert 35:ab9b1c9b6d08 225 float torque0 = torque_p0 + torque_i0 + torque_d0;
sembert 35:ab9b1c9b6d08 226 return torque0;
sembert 34:89a424fd37ce 227 } else {
sembert 35:ab9b1c9b6d08 228 float K1 = 75.0f;
sembert 35:ab9b1c9b6d08 229 float ti1 = 1.0f;
sembert 35:ab9b1c9b6d08 230 float td1 = 0.01f;
sembert 35:ab9b1c9b6d08 231 Kp1 = K1*(1+td1/ti1);
sembert 35:ab9b1c9b6d08 232 Ki1 = K1/ti1;
sembert 35:ab9b1c9b6d08 233 Kd1 = K1*td1;
sembert 35:ab9b1c9b6d08 234
sembert 35:ab9b1c9b6d08 235 static float error_integral1 = 0;
sembert 35:ab9b1c9b6d08 236 static float error_prev1 = 0;
sembert 35:ab9b1c9b6d08 237 static BiQuad LowPassFilter1(0.0640, 0.1279, 0.0640, -1.1683, 0.4241);
sembert 35:ab9b1c9b6d08 238
sembert 35:ab9b1c9b6d08 239 // Proportional part:
sembert 35:ab9b1c9b6d08 240 float torque_p1 = Kp1 * theta_error;
sembert 35:ab9b1c9b6d08 241
sembert 35:ab9b1c9b6d08 242 // Integral part:
sembert 35:ab9b1c9b6d08 243 error_integral1 = error_integral1 + theta_error * Ts;
sembert 35:ab9b1c9b6d08 244 float torque_i1 = Ki1 * error_integral1;
sembert 35:ab9b1c9b6d08 245
sembert 35:ab9b1c9b6d08 246 // Derivative part:
sembert 35:ab9b1c9b6d08 247 float error_derivative1 = (theta_error - error_prev1)/Ts;
sembert 35:ab9b1c9b6d08 248 float filtered_error_derivative1 = LowPassFilter1.step(error_derivative1);
sembert 35:ab9b1c9b6d08 249 float torque_d1 = Kd1 * filtered_error_derivative1;
sembert 35:ab9b1c9b6d08 250 error_prev1 = theta_error;
sembert 35:ab9b1c9b6d08 251
sembert 35:ab9b1c9b6d08 252 // Sum all parts and return it
sembert 35:ab9b1c9b6d08 253 float torque1 = torque_p1 + torque_i1 + torque_d1;
sembert 35:ab9b1c9b6d08 254 return torque1;
sembert 34:89a424fd37ce 255 }
Hendrikvg 21:394a7a1deb73 256 }
Hendrikvg 16:40183eeadb6d 257
SjorsdeBruin 30:a16519224d58 258 void Kinematics()
sembert 36:66f500e387c4 259 {
sembert 36:66f500e387c4 260 EMGx_velocity = 0.1f;
sembert 36:66f500e387c4 261 EMGy_velocity = 0.0f;
sembert 36:66f500e387c4 262 float thetav_1= -(EMGx_velocity*cos(theta_1 + theta_2))/(l*cos(theta_1 + theta_2)*sin(theta_1) - l*sin(theta_1 + theta_2)*cos(theta_1)) - (EMGy_velocity*sin(theta_1 + theta_2))/(l*cos(theta_1 + theta_2)*sin(theta_1) - l*sin(theta_1 + theta_2)*cos(theta_1));
sembert 36:66f500e387c4 263 float thetav_2= (EMGx_velocity*(cos(theta_1 + theta_2) + cos(theta_1)))/(l*cos(theta_1 + theta_2)*sin(theta_1) - l*sin(theta_1 + theta_2)*cos(theta_1)) + (EMGy_velocity*(sin(theta_1 + theta_2) + sin(theta_1)))/(l*cos(theta_1 + theta_2)*sin(theta_1) - l*sin(theta_1 + theta_2)*cos(theta_1));
sembert 36:66f500e387c4 264 theta_ref1 = theta_ref1 + thetav_1*Ts;
sembert 36:66f500e387c4 265 theta_ref2 = theta_ref2 + thetav_2*Ts;
sembert 36:66f500e387c4 266 x = cos(theta_ref1)*l+cos(theta_ref1+theta_ref2)*l;
sembert 36:66f500e387c4 267 y = l*(sin(theta_ref1)+sin(theta_ref1+theta_ref2));
SjorsdeBruin 29:5a846abba59e 268 if (sqrt(pow(x,2)+pow(y,2))>1.0f) {
sembert 36:66f500e387c4 269 pc.printf("Limit reached!\n\r");
SjorsdeBruin 30:a16519224d58 270 theta_ref1 = theta_1;
SjorsdeBruin 30:a16519224d58 271 theta_ref2 = theta_2;
SjorsdeBruin 28:8c90a46b613e 272 }
SjorsdeBruin 28:8c90a46b613e 273 }
Hendrikvg 24:a9ec9b836fd9 274 void CalculateDirectionMotor()
Hendrikvg 21:394a7a1deb73 275 {
sembert 36:66f500e387c4 276 Kinematics();
sembert 36:66f500e387c4 277 direction_motor_1 = Controller(CalculateError(theta_ref1,theta_1),0) >= 0.0f;
sembert 35:ab9b1c9b6d08 278 direction_motor_2 = Controller(CalculateError(theta_ref2,theta_2),1) >= 0.0f;
Hendrikvg 21:394a7a1deb73 279 }
Hendrikvg 20:ac1b4ffa3323 280
Hendrikvg 23:78898ddfb103 281 void ReadEncoder()
Hendrikvg 23:78898ddfb103 282 {
sembert 36:66f500e387c4 283 theta_1 = (0.5f*pi-(((2.0f*pi)/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.
sembert 36:66f500e387c4 284 theta_2 = ((-3.0f*pi/4.0f)+(((2.0f*pi)/64.0f)*(float)encoder_2.getPulses())/131.25f);
Hendrikvg 23:78898ddfb103 285 }
Hendrikvg 16:40183eeadb6d 286
Hendrikvg 24:a9ec9b836fd9 287 void MotorControl()
Hendrikvg 23:78898ddfb103 288 {
Hendrikvg 21:394a7a1deb73 289 ReadEncoder();
Hendrikvg 22:6cc93216b323 290 CalculateDirectionMotor();
sembert 35:ab9b1c9b6d08 291 PWM_motor_1.write(fabs(Controller(CalculateError(theta_ref1,theta_1),0))/(2.0f*pi));
sembert 35:ab9b1c9b6d08 292 PWM_motor_2.write(fabs(Controller(CalculateError(theta_ref2,theta_2),1))/(2.0f*pi));
Hendrikvg 21:394a7a1deb73 293 }
Hendrikvg 21:394a7a1deb73 294
Hendrikvg 21:394a7a1deb73 295 void go_next_1()
Hendrikvg 21:394a7a1deb73 296 {
Hendrikvg 24:a9ec9b836fd9 297 pressed_1 = !pressed_1;
Hendrikvg 21:394a7a1deb73 298 }
Hendrikvg 21:394a7a1deb73 299
Hendrikvg 21:394a7a1deb73 300 void go_next_2()
Hendrikvg 21:394a7a1deb73 301 {
Hendrikvg 24:a9ec9b836fd9 302 pressed_2 = !pressed_2;
Hendrikvg 24:a9ec9b836fd9 303 }
Hendrikvg 24:a9ec9b836fd9 304
SjorsdeBruin 27:d37b3a0e0f2b 305 bool emg_switch(float treshold, float emg_input) {
SjorsdeBruin 27:d37b3a0e0f2b 306 if(emg_input > treshold){
SjorsdeBruin 28:8c90a46b613e 307 current_value_emg_leg = true;
SjorsdeBruin 28:8c90a46b613e 308 } else {
SjorsdeBruin 28:8c90a46b613e 309 current_value_emg_leg = false;
SjorsdeBruin 28:8c90a46b613e 310 }
SjorsdeBruin 28:8c90a46b613e 311 if(current_value_emg_leg == true && previous_value_emg_leg == false) {
SjorsdeBruin 28:8c90a46b613e 312 previous_value_emg_leg = current_value_emg_leg;
SjorsdeBruin 28:8c90a46b613e 313 return true;
SjorsdeBruin 28:8c90a46b613e 314 } else {
SjorsdeBruin 28:8c90a46b613e 315 previous_value_emg_leg = current_value_emg_leg;
SjorsdeBruin 28:8c90a46b613e 316 return false;
SjorsdeBruin 28:8c90a46b613e 317 }
SjorsdeBruin 28:8c90a46b613e 318 }
SjorsdeBruin 28:8c90a46b613e 319
SjorsdeBruin 28:8c90a46b613e 320 bool emg_trigger(float treshold, float emg_input) {
SjorsdeBruin 28:8c90a46b613e 321 if(emg_input > treshold) {
SjorsdeBruin 27:d37b3a0e0f2b 322 return true;
SjorsdeBruin 27:d37b3a0e0f2b 323 } else {
SjorsdeBruin 27:d37b3a0e0f2b 324 return false;
SjorsdeBruin 27:d37b3a0e0f2b 325 }
SjorsdeBruin 27:d37b3a0e0f2b 326 }
SjorsdeBruin 27:d37b3a0e0f2b 327
SjorsdeBruin 26:088e397ec26f 328 float EmgCalibration(float emgFiltered, float mvc_value, float rest_value)
Hendrikvg 24:a9ec9b836fd9 329 {
Hendrikvg 24:a9ec9b836fd9 330 float emgCalibrated;
Hendrikvg 24:a9ec9b836fd9 331 if (emgFiltered <= rest_value) {
SjorsdeBruin 27:d37b3a0e0f2b 332 return 0.0f;
SjorsdeBruin 27:d37b3a0e0f2b 333 //emgCalibrated = 0;
Hendrikvg 24:a9ec9b836fd9 334 }
SjorsdeBruin 27:d37b3a0e0f2b 335
Hendrikvg 24:a9ec9b836fd9 336 if (emgFiltered >= mvc_value) {
SjorsdeBruin 27:d37b3a0e0f2b 337 return 1.1f;
SjorsdeBruin 27:d37b3a0e0f2b 338 //emgCalibrated = 1;
Hendrikvg 24:a9ec9b836fd9 339 } else {
Hendrikvg 24:a9ec9b836fd9 340 emgCalibrated = (emgFiltered-rest_value)/(mvc_value-rest_value);
Hendrikvg 24:a9ec9b836fd9 341 }
Hendrikvg 24:a9ec9b836fd9 342 return emgCalibrated;
Hendrikvg 24:a9ec9b836fd9 343 }
Hendrikvg 24:a9ec9b836fd9 344
Hendrikvg 24:a9ec9b836fd9 345 void emgsample()
Hendrikvg 24:a9ec9b836fd9 346 {
SjorsdeBruin 27:d37b3a0e0f2b 347 emgFiltered_bl = Highpass_bl.step(emg_bl.read());
SjorsdeBruin 27:d37b3a0e0f2b 348 emgFiltered_bl = notch_bl.step(emgFiltered_bl);
Hendrikvg 24:a9ec9b836fd9 349 emgFiltered_bl = fabs(emgFiltered_bl);
SjorsdeBruin 27:d37b3a0e0f2b 350 emgFiltered_bl = Lowpass_bl.step(emgFiltered_bl);
Hendrikvg 24:a9ec9b836fd9 351
SjorsdeBruin 27:d37b3a0e0f2b 352 emgFiltered_br = Highpass_br.step(emg_br.read());
SjorsdeBruin 27:d37b3a0e0f2b 353 emgFiltered_br = notch_br.step(emgFiltered_br);
Hendrikvg 24:a9ec9b836fd9 354 emgFiltered_br = fabs(emgFiltered_br);
SjorsdeBruin 27:d37b3a0e0f2b 355 emgFiltered_br = Lowpass_br.step(emgFiltered_br);
Hendrikvg 24:a9ec9b836fd9 356
SjorsdeBruin 27:d37b3a0e0f2b 357 emgFiltered_leg = Highpass_leg.step(emg_leg.read());
SjorsdeBruin 27:d37b3a0e0f2b 358 emgFiltered_leg = notch_leg.step(emgFiltered_leg);
Hendrikvg 24:a9ec9b836fd9 359 emgFiltered_leg = fabs(emgFiltered_leg);
SjorsdeBruin 27:d37b3a0e0f2b 360 emgFiltered_leg = Lowpass_leg.step(emgFiltered_leg);
Hendrikvg 24:a9ec9b836fd9 361 }
Hendrikvg 24:a9ec9b836fd9 362
Hendrikvg 24:a9ec9b836fd9 363 void rest()
Hendrikvg 24:a9ec9b836fd9 364 {
SjorsdeBruin 26:088e397ec26f 365 if (CurrentSubstate == rest_biceps_left) {
Hendrikvg 24:a9ec9b836fd9 366 emg = emgFiltered_bl;
SjorsdeBruin 26:088e397ec26f 367 //pc.printf("emg: %f \n\r",emgFiltered_bl);
Hendrikvg 24:a9ec9b836fd9 368 }
SjorsdeBruin 26:088e397ec26f 369 if (CurrentSubstate == rest_biceps_right) {
Hendrikvg 24:a9ec9b836fd9 370 emg = emgFiltered_br;
Hendrikvg 24:a9ec9b836fd9 371 }
SjorsdeBruin 26:088e397ec26f 372 if (CurrentSubstate == rest_biceps_leg) {
Hendrikvg 24:a9ec9b836fd9 373 emg = emgFiltered_leg;
Hendrikvg 24:a9ec9b836fd9 374 }
SjorsdeBruin 26:088e397ec26f 375 if (n < 500) {
SjorsdeBruin 26:088e397ec26f 376 ledred();
Hendrikvg 24:a9ec9b836fd9 377 sum = sum + emg;
SjorsdeBruin 26:088e397ec26f 378 //pc.printf("sum: %f \n\r",sum);
Hendrikvg 24:a9ec9b836fd9 379 n++;
SjorsdeBruin 26:088e397ec26f 380 rest_timeout.attach(rest,0.001f);
Hendrikvg 24:a9ec9b836fd9 381 }
SjorsdeBruin 26:088e397ec26f 382 if (n == 500) {
Hendrikvg 24:a9ec9b836fd9 383 sum = sum + emg;
SjorsdeBruin 26:088e397ec26f 384 //pc.printf("sum: %f \n\r",sum);
Hendrikvg 24:a9ec9b836fd9 385 n++;
SjorsdeBruin 26:088e397ec26f 386 xrest_value = float (sum/n);
SjorsdeBruin 26:088e397ec26f 387 if (CurrentSubstate == rest_biceps_left) {
SjorsdeBruin 26:088e397ec26f 388 rest_value_bl = xrest_value;
SjorsdeBruin 26:088e397ec26f 389 pc.printf("rest_value_bl %f \n\r", rest_value_bl);
Hendrikvg 24:a9ec9b836fd9 390 CurrentSubstate = mvc_biceps_left;
Hendrikvg 24:a9ec9b836fd9 391 SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 392 ledblue();
SjorsdeBruin 26:088e397ec26f 393
Hendrikvg 24:a9ec9b836fd9 394 }
SjorsdeBruin 26:088e397ec26f 395 if (CurrentSubstate == rest_biceps_right) {
SjorsdeBruin 26:088e397ec26f 396 rest_value_br = xrest_value;
SjorsdeBruin 26:088e397ec26f 397 pc.printf("rest_value_br %f \n\r", rest_value_br);
Hendrikvg 24:a9ec9b836fd9 398 CurrentSubstate = mvc_biceps_right;
Hendrikvg 24:a9ec9b836fd9 399 SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 400 ledmagenta();
Hendrikvg 24:a9ec9b836fd9 401 }
SjorsdeBruin 26:088e397ec26f 402 if (CurrentSubstate == rest_biceps_leg) {
SjorsdeBruin 26:088e397ec26f 403 rest_value_leg = xrest_value;
SjorsdeBruin 26:088e397ec26f 404 pc.printf("rest_value_leg %f \n\r", rest_value_leg);
SjorsdeBruin 26:088e397ec26f 405 pc.printf("rest_value_bl %f \n\r", rest_value_bl);
Hendrikvg 24:a9ec9b836fd9 406 CurrentSubstate = mvc_biceps_leg;
Hendrikvg 24:a9ec9b836fd9 407 SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 408 ledwhite();
Hendrikvg 24:a9ec9b836fd9 409 }
Hendrikvg 24:a9ec9b836fd9 410 }
Hendrikvg 24:a9ec9b836fd9 411 }
Hendrikvg 24:a9ec9b836fd9 412
Hendrikvg 24:a9ec9b836fd9 413 void mvc()
Hendrikvg 24:a9ec9b836fd9 414 {
SjorsdeBruin 26:088e397ec26f 415 if (CurrentSubstate == mvc_biceps_left) {
Hendrikvg 24:a9ec9b836fd9 416 emg = emgFiltered_bl;
Hendrikvg 24:a9ec9b836fd9 417 }
SjorsdeBruin 26:088e397ec26f 418 if (CurrentSubstate == mvc_biceps_right) {
Hendrikvg 24:a9ec9b836fd9 419 emg = emgFiltered_br;
Hendrikvg 24:a9ec9b836fd9 420 }
SjorsdeBruin 26:088e397ec26f 421 if (CurrentSubstate == mvc_biceps_leg) {
Hendrikvg 24:a9ec9b836fd9 422 emg = emgFiltered_leg;
Hendrikvg 24:a9ec9b836fd9 423 }
SjorsdeBruin 26:088e397ec26f 424 if (emg >= xmvc_value) {
Hendrikvg 24:a9ec9b836fd9 425 xmvc_value = emg;
SjorsdeBruin 26:088e397ec26f 426 }
Hendrikvg 24:a9ec9b836fd9 427 n++;
SjorsdeBruin 26:088e397ec26f 428 if (n < 1000) {
SjorsdeBruin 26:088e397ec26f 429 mvc_timeout.attach(mvc,0.001f);
SjorsdeBruin 26:088e397ec26f 430 ledred();
Hendrikvg 24:a9ec9b836fd9 431 }
SjorsdeBruin 26:088e397ec26f 432 if (n == 1000) {
SjorsdeBruin 26:088e397ec26f 433 if (CurrentSubstate == mvc_biceps_left) {
Hendrikvg 24:a9ec9b836fd9 434 mvc_value_bl = xmvc_value;
SjorsdeBruin 26:088e397ec26f 435 pc.printf("mvc_value_bl %f \n\r", mvc_value_bl);
Hendrikvg 24:a9ec9b836fd9 436 CurrentSubstate = rest_biceps_right;
Hendrikvg 24:a9ec9b836fd9 437 SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 438 ledyellow();
Hendrikvg 24:a9ec9b836fd9 439 }
SjorsdeBruin 26:088e397ec26f 440 if (CurrentSubstate == mvc_biceps_right) {
Hendrikvg 24:a9ec9b836fd9 441 mvc_value_br = xmvc_value;
SjorsdeBruin 26:088e397ec26f 442 pc.printf("mvc_value_br %f \n\r", mvc_value_br);
Hendrikvg 24:a9ec9b836fd9 443 CurrentSubstate = rest_biceps_leg;
Hendrikvg 24:a9ec9b836fd9 444 SubstateChanged = true;
SjorsdeBruin 26:088e397ec26f 445 ledcyan();
Hendrikvg 24:a9ec9b836fd9 446 }
SjorsdeBruin 26:088e397ec26f 447 if (CurrentSubstate == mvc_biceps_leg) {
Hendrikvg 24:a9ec9b836fd9 448 mvc_value_leg = xmvc_value;
SjorsdeBruin 26:088e397ec26f 449 pc.printf("mvc_value_leg %f \n\r", mvc_value_leg);
Hendrikvg 24:a9ec9b836fd9 450 CurrentState = vertical_movement;
Hendrikvg 24:a9ec9b836fd9 451 StateChanged = true;
SjorsdeBruin 26:088e397ec26f 452 ledoff();
Hendrikvg 24:a9ec9b836fd9 453 }
Hendrikvg 24:a9ec9b836fd9 454 xmvc_value = 1e-11;
Hendrikvg 24:a9ec9b836fd9 455 }
Hendrikvg 24:a9ec9b836fd9 456 }
Hendrikvg 24:a9ec9b836fd9 457
Hendrikvg 24:a9ec9b836fd9 458 void WriteScope()
Hendrikvg 24:a9ec9b836fd9 459 {
SjorsdeBruin 26:088e397ec26f 460 emgsample();
sembert 36:66f500e387c4 461 scope.set(0, theta_ref1);
sembert 36:66f500e387c4 462 scope.set(1, theta_1);
sembert 36:66f500e387c4 463 scope.set(2, CalculateError(theta_ref1,theta_1));
sembert 36:66f500e387c4 464 scope.set(3, theta_ref2);
sembert 36:66f500e387c4 465 scope.set(4, theta_2);
sembert 36:66f500e387c4 466 scope.set(5, CalculateError(theta_ref2,theta_2));
Hendrikvg 24:a9ec9b836fd9 467 scope.send();
Hendrikvg 24:a9ec9b836fd9 468 }
Hendrikvg 24:a9ec9b836fd9 469
Hendrikvg 24:a9ec9b836fd9 470 void SubstateTransition()
Hendrikvg 24:a9ec9b836fd9 471 {
SjorsdeBruin 26:088e397ec26f 472 if (SubstateChanged == true) {
SjorsdeBruin 26:088e397ec26f 473 SubstateChanged = false;
SjorsdeBruin 26:088e397ec26f 474 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 475 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 476 if (CurrentSubstate == rest_biceps_left) {
SjorsdeBruin 26:088e397ec26f 477 ledgreen();
SjorsdeBruin 26:088e397ec26f 478 pc.printf("groen \n\r");
SjorsdeBruin 26:088e397ec26f 479 pc.printf("Initiating rest_biceps_left\n\r");
SjorsdeBruin 26:088e397ec26f 480 }
SjorsdeBruin 26:088e397ec26f 481 if (CurrentSubstate == mvc_biceps_left) {
SjorsdeBruin 26:088e397ec26f 482 //ledblue();
SjorsdeBruin 26:088e397ec26f 483 pc.printf("Initiating mvc_biceps_left\n\r");
SjorsdeBruin 26:088e397ec26f 484 }
SjorsdeBruin 26:088e397ec26f 485 if (CurrentSubstate == rest_biceps_right) {
SjorsdeBruin 26:088e397ec26f 486 //ledyellow();
SjorsdeBruin 26:088e397ec26f 487 pc.printf("Initiating rest_biceps_right\n\r");
SjorsdeBruin 26:088e397ec26f 488 }
SjorsdeBruin 26:088e397ec26f 489 if (CurrentSubstate == mvc_biceps_right) {
SjorsdeBruin 26:088e397ec26f 490 //ledmagenta();
SjorsdeBruin 26:088e397ec26f 491 pc.printf("Initiating mvc_biceps_right\n\r");
SjorsdeBruin 26:088e397ec26f 492 }
SjorsdeBruin 26:088e397ec26f 493 if (CurrentSubstate == rest_biceps_leg) {
SjorsdeBruin 26:088e397ec26f 494 //ledcyan();
SjorsdeBruin 26:088e397ec26f 495 pc.printf("Initiating rest_biceps_leg\n\r");
SjorsdeBruin 26:088e397ec26f 496 }
SjorsdeBruin 26:088e397ec26f 497 if (CurrentSubstate == mvc_biceps_leg) {
SjorsdeBruin 26:088e397ec26f 498 //ledwhite();
SjorsdeBruin 26:088e397ec26f 499 pc.printf("Initiating mvc_biceps_leg\n\r");
SjorsdeBruin 26:088e397ec26f 500 }
SjorsdeBruin 26:088e397ec26f 501 }
Hendrikvg 21:394a7a1deb73 502 }
Hendrikvg 21:394a7a1deb73 503
Hendrikvg 21:394a7a1deb73 504 void while_start()
Hendrikvg 21:394a7a1deb73 505 {
Hendrikvg 21:394a7a1deb73 506 // Do startup stuff
Hendrikvg 21:394a7a1deb73 507 CurrentState = motor_calibration;
Hendrikvg 21:394a7a1deb73 508 StateChanged = true;
Hendrikvg 21:394a7a1deb73 509 }
Hendrikvg 21:394a7a1deb73 510
Hendrikvg 21:394a7a1deb73 511 void while_motor_calibration()
Hendrikvg 21:394a7a1deb73 512 {
Hendrikvg 21:394a7a1deb73 513 // Do motor calibration stuff
Hendrikvg 24:a9ec9b836fd9 514 if (pressed_1) { // bool aanmaken voor demo (switch oid aanmaken)
Hendrikvg 21:394a7a1deb73 515 CurrentState = demo_mode;
Hendrikvg 21:394a7a1deb73 516 StateChanged = true;
Hendrikvg 21:394a7a1deb73 517 }
Hendrikvg 24:a9ec9b836fd9 518 if (pressed_2) { // bool aanmaken voor EMG (switch oid aanmaken)
Hendrikvg 21:394a7a1deb73 519 CurrentState = emg_calibration;
Hendrikvg 21:394a7a1deb73 520 StateChanged = true;
Hendrikvg 21:394a7a1deb73 521 }
Hendrikvg 21:394a7a1deb73 522 }
Hendrikvg 21:394a7a1deb73 523
Hendrikvg 21:394a7a1deb73 524 void while_demo_mode()
Hendrikvg 21:394a7a1deb73 525 {
sembert 36:66f500e387c4 526 EMGx_velocity = 0.1f;
sembert 36:66f500e387c4 527 EMGy_velocity = 0.0f;
sembert 36:66f500e387c4 528 ReadEncoder();
sembert 36:66f500e387c4 529 Kinematics();
sembert 36:66f500e387c4 530
sembert 36:66f500e387c4 531 pc.printf("X: %f Y: %f 1: %f 2: %f \n\r",x,y,theta_1,theta_2);
sembert 36:66f500e387c4 532 /*
sembert 36:66f500e387c4 533 m++;
sembert 36:66f500e387c4 534
sembert 36:66f500e387c4 535 if (m<5) {
sembert 36:66f500e387c4 536 EMGy_velocity = 0.1f;
sembert 36:66f500e387c4 537 EMGx_velocity = 0.0f;
sembert 36:66f500e387c4 538 pc.printf("beweging in y richting %f \n\r", EMGy_velocity);
sembert 36:66f500e387c4 539 pc.printf("thetav_1 %f \n\r", theta_ref1);
sembert 36:66f500e387c4 540 }
sembert 36:66f500e387c4 541 if (m>=5 && m<10) {
sembert 36:66f500e387c4 542 EMGy_velocity = 0.0f;
sembert 36:66f500e387c4 543 EMGx_velocity = 0.1f;
sembert 36:66f500e387c4 544 pc.printf("beweging in x richting %f \n\r", EMGx_velocity);
sembert 36:66f500e387c4 545 pc.printf("thetav_1 %f \n\r", theta_ref1);
sembert 36:66f500e387c4 546 }
sembert 36:66f500e387c4 547 if (m>=10 && m<15) {
sembert 36:66f500e387c4 548 EMGy_velocity = -0.1f;
sembert 36:66f500e387c4 549 EMGx_velocity = 0.0f;
sembert 36:66f500e387c4 550 pc.printf("beweging in y richting %f \n\r", EMGy_velocity);
sembert 36:66f500e387c4 551 }
sembert 36:66f500e387c4 552 if (m>=15 && m<20) {
sembert 36:66f500e387c4 553 EMGy_velocity = 0.0f;
sembert 36:66f500e387c4 554 EMGx_velocity = -0.1f;
sembert 36:66f500e387c4 555 pc.printf("beweging in x richting %f \n\r", EMGx_velocity);
sembert 36:66f500e387c4 556 }
sembert 36:66f500e387c4 557 if (pressed_1) {
sembert 36:66f500e387c4 558 m=0;
sembert 36:66f500e387c4 559 CurrentState = demo_mode;
Hendrikvg 21:394a7a1deb73 560 StateChanged = true;
Hendrikvg 21:394a7a1deb73 561 }
sembert 36:66f500e387c4 562 if ((pressed_2)) {
sembert 36:66f500e387c4 563 CurrentState = emg_calibration;
sembert 36:66f500e387c4 564 StateChanged = true;
sembert 36:66f500e387c4 565 }
sembert 36:66f500e387c4 566 */
Hendrikvg 21:394a7a1deb73 567 }
Hendrikvg 21:394a7a1deb73 568
Hendrikvg 21:394a7a1deb73 569 void while_emg_calibration()
Hendrikvg 21:394a7a1deb73 570 {
Hendrikvg 21:394a7a1deb73 571 // Do emg calibration stuff
Hendrikvg 24:a9ec9b836fd9 572 switch (CurrentSubstate) {
Hendrikvg 24:a9ec9b836fd9 573 case rest_biceps_left:
Hendrikvg 24:a9ec9b836fd9 574 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 575 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 576 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 577 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 578 n = 0;
SjorsdeBruin 26:088e397ec26f 579 sum = 0;
Hendrikvg 24:a9ec9b836fd9 580 rest();
Hendrikvg 24:a9ec9b836fd9 581 }
Hendrikvg 24:a9ec9b836fd9 582 break;
Hendrikvg 24:a9ec9b836fd9 583 case mvc_biceps_left:
Hendrikvg 24:a9ec9b836fd9 584 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 585 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 586 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 587 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 588 n = 0;
Hendrikvg 24:a9ec9b836fd9 589 mvc();
Hendrikvg 24:a9ec9b836fd9 590 }
Hendrikvg 24:a9ec9b836fd9 591 break;
Hendrikvg 24:a9ec9b836fd9 592 case rest_biceps_right:
Hendrikvg 24:a9ec9b836fd9 593 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 594 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 595 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 596 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 597 n = 0;
SjorsdeBruin 26:088e397ec26f 598 sum = 0;
Hendrikvg 24:a9ec9b836fd9 599 rest();
Hendrikvg 24:a9ec9b836fd9 600 }
Hendrikvg 24:a9ec9b836fd9 601 break;
Hendrikvg 24:a9ec9b836fd9 602 case mvc_biceps_right:
Hendrikvg 24:a9ec9b836fd9 603 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 604 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 605 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 606 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 607 n = 0;
Hendrikvg 24:a9ec9b836fd9 608 mvc();
Hendrikvg 24:a9ec9b836fd9 609 }
Hendrikvg 24:a9ec9b836fd9 610 break;
Hendrikvg 24:a9ec9b836fd9 611 case rest_biceps_leg:
Hendrikvg 24:a9ec9b836fd9 612 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 613 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 614 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 615 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 616 n = 0;
SjorsdeBruin 26:088e397ec26f 617 sum = 0;
Hendrikvg 24:a9ec9b836fd9 618 rest();
Hendrikvg 24:a9ec9b836fd9 619 }
Hendrikvg 24:a9ec9b836fd9 620 break;
Hendrikvg 24:a9ec9b836fd9 621 case mvc_biceps_leg:
Hendrikvg 24:a9ec9b836fd9 622 SubstateTransition();
SjorsdeBruin 26:088e397ec26f 623 if ((pressed_1) || (pressed_2)) {
SjorsdeBruin 26:088e397ec26f 624 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 625 pressed_2 = false;
SjorsdeBruin 26:088e397ec26f 626 n = 0;
Hendrikvg 24:a9ec9b836fd9 627 mvc();
Hendrikvg 24:a9ec9b836fd9 628 }
Hendrikvg 24:a9ec9b836fd9 629 break;
Hendrikvg 24:a9ec9b836fd9 630 default:
Hendrikvg 24:a9ec9b836fd9 631 pc.printf("Unknown or unimplemented state reached!\n\r");
Hendrikvg 21:394a7a1deb73 632 }
Hendrikvg 21:394a7a1deb73 633 }
Hendrikvg 21:394a7a1deb73 634
Hendrikvg 21:394a7a1deb73 635 void while_vertical_movement()
Hendrikvg 21:394a7a1deb73 636 {
Hendrikvg 21:394a7a1deb73 637 // Do vertical movement stuff
sembert 34:89a424fd37ce 638 MotorControl();
SjorsdeBruin 28:8c90a46b613e 639 if ((pressed_1) || (pressed_2) || (emg_switch(treshold_leg,EmgCalibration(emgFiltered_leg, mvc_value_leg, rest_value_leg)))) { // EMG gebaseerde threshold aanmaken
Hendrikvg 21:394a7a1deb73 640 CurrentState = horizontal_movement;
SjorsdeBruin 29:5a846abba59e 641 StateChanged = true;
SjorsdeBruin 32:7355524d862f 642 }
SjorsdeBruin 32:7355524d862f 643 }
SjorsdeBruin 31:465a6e1e1db6 644
Hendrikvg 17:cacf9e75eda7 645
Hendrikvg 21:394a7a1deb73 646 void while_horizontal_movement()
Hendrikvg 21:394a7a1deb73 647 {
Hendrikvg 21:394a7a1deb73 648 // Do horizontal movement stuff
sembert 35:ab9b1c9b6d08 649 MotorControl();
sembert 34:89a424fd37ce 650 if ((pressed_1) || (pressed_2) || (emg_switch(treshold_leg,EmgCalibration(emgFiltered_leg, mvc_value_leg, rest_value_leg)))) { // EMG gebaseerde threshold aanmaken
Hendrikvg 21:394a7a1deb73 651 CurrentState = vertical_movement;
Hendrikvg 21:394a7a1deb73 652 StateChanged = true;
Hendrikvg 21:394a7a1deb73 653 }
SjorsdeBruin 29:5a846abba59e 654 }
SjorsdeBruin 29:5a846abba59e 655
Hendrikvg 21:394a7a1deb73 656
Hendrikvg 21:394a7a1deb73 657 void StateTransition()
Hendrikvg 21:394a7a1deb73 658 {
Hendrikvg 24:a9ec9b836fd9 659 if (StateChanged) {
SjorsdeBruin 26:088e397ec26f 660 pressed_1 = false;
SjorsdeBruin 26:088e397ec26f 661 pressed_2 = false;
Hendrikvg 24:a9ec9b836fd9 662 if (CurrentState == start) {
Hendrikvg 21:394a7a1deb73 663 pc.printf("Initiating start.\n\r");
Hendrikvg 21:394a7a1deb73 664 }
Hendrikvg 24:a9ec9b836fd9 665 if (CurrentState == motor_calibration) {
Hendrikvg 21:394a7a1deb73 666 pc.printf("Initiating motor_calibration.\n\r");
Hendrikvg 21:394a7a1deb73 667 }
Hendrikvg 24:a9ec9b836fd9 668 if (CurrentState == demo_mode) {
Hendrikvg 21:394a7a1deb73 669 pc.printf("Initiating demo_mode.\n\r");
Hendrikvg 21:394a7a1deb73 670 }
Hendrikvg 24:a9ec9b836fd9 671 if (CurrentState == emg_calibration) {
Hendrikvg 21:394a7a1deb73 672 pc.printf("Initiating emg_calibration.\n\r");
Hendrikvg 21:394a7a1deb73 673 }
Hendrikvg 24:a9ec9b836fd9 674 if (CurrentState == vertical_movement) {
Hendrikvg 21:394a7a1deb73 675 pc.printf("Initiating vertical_movement.\n\r");
Hendrikvg 21:394a7a1deb73 676 }
Hendrikvg 24:a9ec9b836fd9 677 if (CurrentState == horizontal_movement) {
Hendrikvg 21:394a7a1deb73 678 pc.printf("Initiating horizontal_movement.\n\r");
Hendrikvg 21:394a7a1deb73 679 }
Hendrikvg 21:394a7a1deb73 680 StateChanged = false;
Hendrikvg 21:394a7a1deb73 681 }
Hendrikvg 21:394a7a1deb73 682 }
Hendrikvg 21:394a7a1deb73 683
Hendrikvg 21:394a7a1deb73 684 void StateMachine()
Hendrikvg 21:394a7a1deb73 685 {
Hendrikvg 24:a9ec9b836fd9 686 switch(CurrentState) {
Hendrikvg 21:394a7a1deb73 687 case start:
Hendrikvg 21:394a7a1deb73 688 StateTransition();
Hendrikvg 21:394a7a1deb73 689 while_start();
Hendrikvg 21:394a7a1deb73 690 break;
Hendrikvg 21:394a7a1deb73 691 case motor_calibration:
Hendrikvg 21:394a7a1deb73 692 StateTransition();
Hendrikvg 21:394a7a1deb73 693 while_motor_calibration();
Hendrikvg 21:394a7a1deb73 694 break;
Hendrikvg 21:394a7a1deb73 695 case demo_mode:
Hendrikvg 21:394a7a1deb73 696 StateTransition();
Hendrikvg 21:394a7a1deb73 697 while_demo_mode();
Hendrikvg 21:394a7a1deb73 698 break;
Hendrikvg 21:394a7a1deb73 699 case emg_calibration:
Hendrikvg 21:394a7a1deb73 700 StateTransition();
Hendrikvg 21:394a7a1deb73 701 while_emg_calibration();
Hendrikvg 21:394a7a1deb73 702 break;
Hendrikvg 21:394a7a1deb73 703 case vertical_movement:
Hendrikvg 21:394a7a1deb73 704 StateTransition();
Hendrikvg 21:394a7a1deb73 705 while_vertical_movement();
Hendrikvg 21:394a7a1deb73 706 break;
Hendrikvg 21:394a7a1deb73 707 case horizontal_movement:
Hendrikvg 21:394a7a1deb73 708 StateTransition();
Hendrikvg 21:394a7a1deb73 709 while_horizontal_movement();
Hendrikvg 21:394a7a1deb73 710 break;
Hendrikvg 21:394a7a1deb73 711 default:
Hendrikvg 21:394a7a1deb73 712 pc.printf("Unknown or unimplemented state reached!\n\r");
Hendrikvg 21:394a7a1deb73 713 }
Hendrikvg 21:394a7a1deb73 714 }
Hendrikvg 21:394a7a1deb73 715
Hendrikvg 15:80b3ac2b8448 716 // main
Hendrikvg 24:a9ec9b836fd9 717 int main()
Hendrikvg 24:a9ec9b836fd9 718 {
RobertoO 0:67c50348f842 719 pc.baud(115200);
Hendrikvg 17:cacf9e75eda7 720 pc.printf("Hello World!\n\r");
SjorsdeBruin 26:088e397ec26f 721 ledoff();
Hendrikvg 21:394a7a1deb73 722 button_1.fall(go_next_1);
Hendrikvg 21:394a7a1deb73 723 button_2.fall(go_next_2);
sembert 34:89a424fd37ce 724 sinus_time.start();
sembert 34:89a424fd37ce 725 PWM_motor_1.period_ms(1.0f/16.0f);
sembert 34:89a424fd37ce 726 PWM_motor_2.period_ms(1.0f/16.0f);
sembert 34:89a424fd37ce 727 //motor_control.attach(&MotorControl, Ts);
SjorsdeBruin 27:d37b3a0e0f2b 728 write_scope.attach(&WriteScope, 0.01);
sembert 35:ab9b1c9b6d08 729 TickerStateMachine.attach(&StateMachine,Ts);
Hendrikvg 21:394a7a1deb73 730 while(true) {
sembert 34:89a424fd37ce 731 return 0;
Hendrikvg 21:394a7a1deb73 732 }
SjorsdeBruin 26:088e397ec26f 733 }