This is with minumum of 10 milliseconds threshold delay 00:53
Dependencies: biquadFilter MODSERIAL QEI Servo mbed
Fork of StateMachine_EMg_RKI_PID_MOTOR_metklikenalles by
main.cpp@9:40c9a18c3430, 2018-11-01 (annotated)
- Committer:
- cmaas
- Date:
- Thu Nov 01 17:09:18 2018 +0000
- Revision:
- 9:40c9a18c3430
- Parent:
- 8:ec3ea0623620
- Child:
- 10:2325e545ce11
KINEMATICS + CONTROL ADDED. COMPILING
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cmaas | 9:40c9a18c3430 | 1 | // EMG + KINEMATICS + PID + MOTOR CONTROL |
cmaas | 9:40c9a18c3430 | 2 | |
cmaas | 9:40c9a18c3430 | 3 | //----------------~INITIATING------------------------- |
aschut | 0:90750f158475 | 4 | #include "mbed.h" |
cmaas | 9:40c9a18c3430 | 5 | |
cmaas | 9:40c9a18c3430 | 6 | // EMG -- DEPENDENCIES |
aschut | 0:90750f158475 | 7 | #include <iostream> |
gastongab | 2:0a8622662f6d | 8 | #include "BiQuad.h" |
gastongab | 2:0a8622662f6d | 9 | #include "BiQuadchains_zelfbeun.h" |
gastongab | 2:0a8622662f6d | 10 | #include "MODSERIAL.h" |
gastongab | 2:0a8622662f6d | 11 | |
cmaas | 9:40c9a18c3430 | 12 | // KINEMATICS -- DEPENDENCIES |
cmaas | 9:40c9a18c3430 | 13 | #include "stdio.h" |
cmaas | 9:40c9a18c3430 | 14 | #define _USE_MATH_DEFINES |
cmaas | 9:40c9a18c3430 | 15 | #include <math.h> |
cmaas | 9:40c9a18c3430 | 16 | #define M_PI 3.14159265358979323846 /* pi */ |
cmaas | 9:40c9a18c3430 | 17 | |
cmaas | 9:40c9a18c3430 | 18 | // PID CONTROLLER -- DEPENDENCIES |
cmaas | 9:40c9a18c3430 | 19 | #include "BiQuad.h" |
cmaas | 9:40c9a18c3430 | 20 | #include "QEI.h" |
cmaas | 9:40c9a18c3430 | 21 | //#include "HIDScope.h" |
cmaas | 9:40c9a18c3430 | 22 | |
cmaas | 9:40c9a18c3430 | 23 | |
cmaas | 9:40c9a18c3430 | 24 | // GENERAL PIN DEFENITIONS |
gastongab | 2:0a8622662f6d | 25 | MODSERIAL pc(USBTX, USBRX); |
gastongab | 2:0a8622662f6d | 26 | |
cmaas | 9:40c9a18c3430 | 27 | // EMG -- PIN DEFENITIONS |
aschut | 0:90750f158475 | 28 | DigitalOut gpo(D0); |
aschut | 0:90750f158475 | 29 | |
cmaas | 9:40c9a18c3430 | 30 | DigitalIn button2(SW3); |
aschut | 0:90750f158475 | 31 | DigitalIn button1(SW2); //or SW2 |
aschut | 0:90750f158475 | 32 | |
aschut | 0:90750f158475 | 33 | DigitalOut led1(LED_GREEN); |
aschut | 0:90750f158475 | 34 | DigitalOut led2(LED_RED); |
aschut | 0:90750f158475 | 35 | DigitalOut led3(LED_BLUE); |
aschut | 0:90750f158475 | 36 | |
gastongab | 2:0a8622662f6d | 37 | //EMG tickers, these tickers are called in the mainscript with fsample 500Hz, also sends to HIDscope with same fsample |
gastongab | 2:0a8622662f6d | 38 | Ticker sample_ticker; //ticker for filtering pref. with 1000Hz, define in tick.attach |
gastongab | 4:c7be673eb4a1 | 39 | Ticker threshold_check_ticker; |
gastongab | 2:0a8622662f6d | 40 | Timer t; //timer try out for Astrid |
gastongab | 2:0a8622662f6d | 41 | Timer timer_calibration; //timer for EMG calibration |
gastongab | 2:0a8622662f6d | 42 | |
gastongab | 2:0a8622662f6d | 43 | //Input system |
gastongab | 2:0a8622662f6d | 44 | AnalogIn emg1(A0); //right biceps |
gastongab | 2:0a8622662f6d | 45 | AnalogIn emg2(A1); //right triceps |
gastongab | 2:0a8622662f6d | 46 | AnalogIn emg3(A2); //left biceps |
gastongab | 2:0a8622662f6d | 47 | AnalogIn emg4(A3); //left triceps |
gastongab | 2:0a8622662f6d | 48 | |
cmaas | 9:40c9a18c3430 | 49 | |
cmaas | 9:40c9a18c3430 | 50 | // PID CONTROLLER -- PIN DEFENITIONS |
cmaas | 9:40c9a18c3430 | 51 | //AnalogIn button2(A4); |
cmaas | 9:40c9a18c3430 | 52 | //AnalogIn button1(A3); |
cmaas | 9:40c9a18c3430 | 53 | //DigitalIn button3(SW2); |
cmaas | 9:40c9a18c3430 | 54 | //DigitalIn button4(SW3); |
cmaas | 9:40c9a18c3430 | 55 | |
cmaas | 9:40c9a18c3430 | 56 | DigitalOut directionpin1(D7); // motor 1 |
cmaas | 9:40c9a18c3430 | 57 | DigitalOut directionpin2(D4); // motor 2 |
cmaas | 9:40c9a18c3430 | 58 | DigitalOut directionpin3(D13); // motor 3 |
cmaas | 9:40c9a18c3430 | 59 | PwmOut pwmpin1(D6); // motor 1 |
cmaas | 9:40c9a18c3430 | 60 | PwmOut pwmpin2(D5); // motor 2 |
cmaas | 9:40c9a18c3430 | 61 | PwmOut pwmpin3(D12); // motor 3 |
cmaas | 9:40c9a18c3430 | 62 | |
cmaas | 9:40c9a18c3430 | 63 | QEI encoder1 (D9, D8, NC, 8400, QEI::X4_ENCODING); |
cmaas | 9:40c9a18c3430 | 64 | QEI encoder2 (D11, D10, NC, 8400, QEI::X4_ENCODING); // motor 2 |
cmaas | 9:40c9a18c3430 | 65 | QEI encoder3 (D3, D2, NC, 8400, QEI::X4_ENCODING); // motor 3 |
cmaas | 9:40c9a18c3430 | 66 | // HIDScope scope(2); |
cmaas | 9:40c9a18c3430 | 67 | |
cmaas | 9:40c9a18c3430 | 68 | // PID - TICKERS |
cmaas | 9:40c9a18c3430 | 69 | Ticker ref_rot; |
cmaas | 9:40c9a18c3430 | 70 | Ticker show_counts; |
cmaas | 9:40c9a18c3430 | 71 | Ticker Scope_Data; |
cmaas | 9:40c9a18c3430 | 72 | |
cmaas | 9:40c9a18c3430 | 73 | //----------------GLOBALS-------------------------- |
cmaas | 9:40c9a18c3430 | 74 | // GLOBALS EMG |
cmaas | 9:40c9a18c3430 | 75 | |
gastongab | 2:0a8622662f6d | 76 | //Filtered EMG signals from the end of the chains |
gastongab | 4:c7be673eb4a1 | 77 | volatile double emg1_filtered, emg2_filtered, emg3_filtered, emg4_filtered; |
gastongab | 4:c7be673eb4a1 | 78 | int i = 0; |
gastongab | 2:0a8622662f6d | 79 | |
cmaas | 9:40c9a18c3430 | 80 | //Define doubles for calibration and ticker |
cmaas | 9:40c9a18c3430 | 81 | double ts = 0.001; //tijdsstap |
cmaas | 9:40c9a18c3430 | 82 | double calibration_time = 55; //time EMG calibration should take |
cmaas | 9:40c9a18c3430 | 83 | |
cmaas | 9:40c9a18c3430 | 84 | volatile double temp_highest_emg1 = 0; //highest detected value right biceps |
cmaas | 9:40c9a18c3430 | 85 | volatile double temp_highest_emg2 = 0; |
cmaas | 9:40c9a18c3430 | 86 | volatile double temp_highest_emg3 = 0; |
cmaas | 9:40c9a18c3430 | 87 | volatile double temp_highest_emg4 = 0; |
cmaas | 9:40c9a18c3430 | 88 | |
cmaas | 9:40c9a18c3430 | 89 | //Doubles for calculation threshold |
cmaas | 9:40c9a18c3430 | 90 | double biceps_p_t = 0.4; //set threshold at percentage of highest value |
cmaas | 9:40c9a18c3430 | 91 | double triceps_p_t = 0.5; //set threshold at percentage of highest value |
cmaas | 9:40c9a18c3430 | 92 | volatile double threshold1; |
cmaas | 9:40c9a18c3430 | 93 | volatile double threshold2; |
cmaas | 9:40c9a18c3430 | 94 | volatile double threshold3; |
cmaas | 9:40c9a18c3430 | 95 | volatile double threshold4; |
cmaas | 9:40c9a18c3430 | 96 | |
cmaas | 9:40c9a18c3430 | 97 | // thresholdreads bools |
cmaas | 9:40c9a18c3430 | 98 | int bicepsR; |
cmaas | 9:40c9a18c3430 | 99 | int tricepsR; |
cmaas | 9:40c9a18c3430 | 100 | int bicepsL; |
cmaas | 9:40c9a18c3430 | 101 | int tricepsL; |
cmaas | 9:40c9a18c3430 | 102 | |
cmaas | 9:40c9a18c3430 | 103 | // VARIABLES ROBOT KINEMATICS |
cmaas | 9:40c9a18c3430 | 104 | // constants |
cmaas | 9:40c9a18c3430 | 105 | const float la = 0.256; // lengte actieve arm |
cmaas | 9:40c9a18c3430 | 106 | const float lp = 0.21; // lengte passieve arm |
cmaas | 9:40c9a18c3430 | 107 | const float rp = 0.052; // straal van midden end effector tot hoekpunt |
cmaas | 9:40c9a18c3430 | 108 | const float rm = 0.23; // straal van global midden tot motor |
cmaas | 9:40c9a18c3430 | 109 | const float a = 0.09; // zijde van de driehoek |
cmaas | 9:40c9a18c3430 | 110 | const float xas = 0.40; // afstand van motor 1 tot motor 3 |
cmaas | 9:40c9a18c3430 | 111 | const float yas = 0.346; // afstand van xas tot motor 2 |
cmaas | 9:40c9a18c3430 | 112 | const float thetap = 0; // rotatiehoek van de end effector |
cmaas | 9:40c9a18c3430 | 113 | |
cmaas | 9:40c9a18c3430 | 114 | |
cmaas | 9:40c9a18c3430 | 115 | // motor locatie |
cmaas | 9:40c9a18c3430 | 116 | const int a1x = 0; //x locatie motor 1 |
cmaas | 9:40c9a18c3430 | 117 | const int a1y = 0; //y locatie motor 1 |
cmaas | 9:40c9a18c3430 | 118 | const float a2x = (0.5)*xas; // x locatie motor 2 |
cmaas | 9:40c9a18c3430 | 119 | const float a2y = yas; // y locatie motor 2 |
cmaas | 9:40c9a18c3430 | 120 | const float a3x = xas; // x locatie motor 3 |
cmaas | 9:40c9a18c3430 | 121 | const int a3y = 0; // y locatie motor 3 |
cmaas | 9:40c9a18c3430 | 122 | |
cmaas | 9:40c9a18c3430 | 123 | // script voor het bepalen van de desired position aan de hand van emg (1/0) |
cmaas | 9:40c9a18c3430 | 124 | |
cmaas | 9:40c9a18c3430 | 125 | // EMG OUTPUT |
cmaas | 9:40c9a18c3430 | 126 | int EMGxplus; |
cmaas | 9:40c9a18c3430 | 127 | int EMGxmin ; |
cmaas | 9:40c9a18c3430 | 128 | int EMGyplus; |
cmaas | 9:40c9a18c3430 | 129 | int EMGymin ; |
cmaas | 9:40c9a18c3430 | 130 | |
cmaas | 9:40c9a18c3430 | 131 | // Dit moet experimenteel geperfectioneerd worden |
cmaas | 9:40c9a18c3430 | 132 | float tijdstap = 0.005; //nu wss heel langzaam, kan miss omhoog KEER V GEEFT VERANDERING IN POSITIE |
cmaas | 9:40c9a18c3430 | 133 | float v = 0.1; // snelheid kan wss ook hoger |
cmaas | 9:40c9a18c3430 | 134 | |
cmaas | 9:40c9a18c3430 | 135 | float px = 0.2; //starting x // BOUNDARIES |
cmaas | 9:40c9a18c3430 | 136 | float py = 0.155; // starting y // BOUNDARIES |
cmaas | 9:40c9a18c3430 | 137 | |
cmaas | 9:40c9a18c3430 | 138 | // verschil horizontale as met de actieve arm |
cmaas | 9:40c9a18c3430 | 139 | float da1 = 1.619685; // verschil a1 hoek en motor |
cmaas | 9:40c9a18c3430 | 140 | float da2 = -0.609780; |
cmaas | 9:40c9a18c3430 | 141 | float da3 = 3.372859; |
cmaas | 9:40c9a18c3430 | 142 | |
cmaas | 9:40c9a18c3430 | 143 | // limits (since no forward kinematics) |
cmaas | 9:40c9a18c3430 | 144 | float upperxlim = 0.275; //36, 0.04, 0.315, -0.085niet helemaal naar requierments ff kijken of ie groter kan |
cmaas | 9:40c9a18c3430 | 145 | float lowerxlim = 0.10; |
cmaas | 9:40c9a18c3430 | 146 | float upperylim = 0.225; |
cmaas | 9:40c9a18c3430 | 147 | float lowerylim = 0.03; //0.03 is goed |
cmaas | 9:40c9a18c3430 | 148 | |
cmaas | 9:40c9a18c3430 | 149 | // VARIABLES PID CONTROLLER |
cmaas | 9:40c9a18c3430 | 150 | double PI = M_PI;// CHANGE THIS INTO M_PI |
cmaas | 9:40c9a18c3430 | 151 | double Kp = 14; //200 , 50 |
cmaas | 9:40c9a18c3430 | 152 | double Ki = 0; //1, 0.5 |
cmaas | 9:40c9a18c3430 | 153 | double Kd = 3; //200, 10 |
cmaas | 9:40c9a18c3430 | 154 | double Ts = 0.1; // Sample time in seconds |
cmaas | 9:40c9a18c3430 | 155 | double reference_rotation; //define as radians |
cmaas | 9:40c9a18c3430 | 156 | double motor_position; |
cmaas | 9:40c9a18c3430 | 157 | bool AlwaysTrue; |
cmaas | 9:40c9a18c3430 | 158 | |
cmaas | 9:40c9a18c3430 | 159 | |
cmaas | 9:40c9a18c3430 | 160 | //----------------FUNCTIONS-------------------------- |
cmaas | 9:40c9a18c3430 | 161 | |
cmaas | 9:40c9a18c3430 | 162 | // ~~~~~~~~~~~~~~~~~~~EMG FUNCTIONS~~~~~~~~~~~~~~~~~~ |
gastongab | 7:88fa84742b3c | 163 | void emgsample() |
gastongab | 7:88fa84742b3c | 164 | { |
gastongab | 2:0a8622662f6d | 165 | //All EMG signal through Highpass |
gastongab | 2:0a8622662f6d | 166 | double emgread1 = emg1.read(); |
gastongab | 2:0a8622662f6d | 167 | double emgread2 = emg2.read(); |
gastongab | 2:0a8622662f6d | 168 | double emgread3 = emg3.read(); |
gastongab | 2:0a8622662f6d | 169 | double emgread4 = emg4.read(); |
gastongab | 7:88fa84742b3c | 170 | |
gastongab | 2:0a8622662f6d | 171 | double emg1_highpassed = highp1.step(emgread1); |
gastongab | 2:0a8622662f6d | 172 | double emg2_highpassed = highp2.step(emgread2); |
gastongab | 2:0a8622662f6d | 173 | double emg3_highpassed = highp3.step(emgread3); |
gastongab | 2:0a8622662f6d | 174 | double emg4_highpassed = highp4.step(emgread4); |
gastongab | 7:88fa84742b3c | 175 | |
gastongab | 2:0a8622662f6d | 176 | //All EMG highpassed through Notch |
gastongab | 2:0a8622662f6d | 177 | double emg1_notched = notch1.step(emg1_highpassed); |
gastongab | 2:0a8622662f6d | 178 | double emg2_notched = notch2.step(emg2_highpassed); |
gastongab | 2:0a8622662f6d | 179 | double emg3_notched = notch3.step(emg3_highpassed); |
gastongab | 2:0a8622662f6d | 180 | double emg4_notched = notch4.step(emg4_highpassed); |
gastongab | 7:88fa84742b3c | 181 | |
gastongab | 2:0a8622662f6d | 182 | //All EMG notched rectify |
gastongab | 2:0a8622662f6d | 183 | double emg1_abs = abs(emg1_notched); |
gastongab | 2:0a8622662f6d | 184 | double emg2_abs = abs(emg2_notched); |
gastongab | 2:0a8622662f6d | 185 | double emg3_abs = abs(emg3_notched); |
gastongab | 2:0a8622662f6d | 186 | double emg4_abs = abs(emg4_notched); |
gastongab | 7:88fa84742b3c | 187 | |
gastongab | 2:0a8622662f6d | 188 | //All EMG abs into lowpass |
gastongab | 2:0a8622662f6d | 189 | emg1_filtered = lowp1.step(emg1_abs); |
gastongab | 2:0a8622662f6d | 190 | emg2_filtered = lowp2.step(emg2_abs); |
gastongab | 2:0a8622662f6d | 191 | emg3_filtered = lowp3.step(emg3_abs); |
gastongab | 2:0a8622662f6d | 192 | emg4_filtered = lowp4.step(emg4_abs); |
gastongab | 7:88fa84742b3c | 193 | } |
gastongab | 7:88fa84742b3c | 194 | |
gastongab | 7:88fa84742b3c | 195 | void CalibrationEMG() |
gastongab | 7:88fa84742b3c | 196 | { |
gastongab | 7:88fa84742b3c | 197 | //static float samples = calibration_time/ts; |
gastongab | 7:88fa84742b3c | 198 | while(timer_calibration<55) { |
gastongab | 7:88fa84742b3c | 199 | if(timer_calibration>0 && timer_calibration<10) { |
gastongab | 7:88fa84742b3c | 200 | led1=!led1; |
gastongab | 7:88fa84742b3c | 201 | if(emg1_filtered>temp_highest_emg1) { |
gastongab | 7:88fa84742b3c | 202 | temp_highest_emg1= emg1_filtered; |
gastongab | 7:88fa84742b3c | 203 | pc.printf("Temp1 = %f \r\n",temp_highest_emg1); |
gastongab | 7:88fa84742b3c | 204 | } |
gastongab | 7:88fa84742b3c | 205 | } |
gastongab | 7:88fa84742b3c | 206 | if(timer_calibration>10 && timer_calibration<15) { |
gastongab | 7:88fa84742b3c | 207 | led1=0; |
gastongab | 7:88fa84742b3c | 208 | led2=0; |
gastongab | 7:88fa84742b3c | 209 | led3=0; |
gastongab | 7:88fa84742b3c | 210 | } |
gastongab | 7:88fa84742b3c | 211 | if(timer_calibration>15 && timer_calibration<25) { |
gastongab | 7:88fa84742b3c | 212 | led2=!led2; |
gastongab | 7:88fa84742b3c | 213 | if(emg2_filtered>temp_highest_emg2) { |
gastongab | 7:88fa84742b3c | 214 | temp_highest_emg2= emg2_filtered; |
gastongab | 7:88fa84742b3c | 215 | pc.printf("Temp2 = %f \r\n",temp_highest_emg2); |
gastongab | 7:88fa84742b3c | 216 | } |
gastongab | 7:88fa84742b3c | 217 | } |
gastongab | 7:88fa84742b3c | 218 | if(timer_calibration>25 && timer_calibration<30) { |
gastongab | 7:88fa84742b3c | 219 | led1=0; |
gastongab | 7:88fa84742b3c | 220 | led2=0; |
gastongab | 7:88fa84742b3c | 221 | led3=0; |
gastongab | 7:88fa84742b3c | 222 | } |
gastongab | 7:88fa84742b3c | 223 | if(timer_calibration>30 && timer_calibration<40) { |
gastongab | 7:88fa84742b3c | 224 | led3=!led3; |
gastongab | 7:88fa84742b3c | 225 | if(emg3_filtered>temp_highest_emg3) { |
gastongab | 7:88fa84742b3c | 226 | temp_highest_emg3= emg3_filtered; |
gastongab | 7:88fa84742b3c | 227 | pc.printf("Temp3 = %f \r\n",temp_highest_emg3); |
gastongab | 7:88fa84742b3c | 228 | } |
gastongab | 7:88fa84742b3c | 229 | } |
gastongab | 7:88fa84742b3c | 230 | if(timer_calibration>40 && timer_calibration<45) { |
gastongab | 7:88fa84742b3c | 231 | led1=0; |
gastongab | 7:88fa84742b3c | 232 | led2=0; |
gastongab | 7:88fa84742b3c | 233 | led3=0; |
gastongab | 7:88fa84742b3c | 234 | } |
gastongab | 7:88fa84742b3c | 235 | if(timer_calibration>45 && timer_calibration<55) { |
gastongab | 7:88fa84742b3c | 236 | led2=!led2; |
gastongab | 7:88fa84742b3c | 237 | led3=!led3; |
gastongab | 7:88fa84742b3c | 238 | if(emg4_filtered>temp_highest_emg4) { |
gastongab | 7:88fa84742b3c | 239 | temp_highest_emg4= emg4_filtered; |
gastongab | 7:88fa84742b3c | 240 | pc.printf("Temp4 = %f \r\n",temp_highest_emg4); |
gastongab | 7:88fa84742b3c | 241 | } |
gastongab | 7:88fa84742b3c | 242 | } |
gastongab | 7:88fa84742b3c | 243 | led1=1; |
gastongab | 7:88fa84742b3c | 244 | led2=1; |
gastongab | 7:88fa84742b3c | 245 | led3=1; |
gastongab | 2:0a8622662f6d | 246 | } |
cmaas | 9:40c9a18c3430 | 247 | /* |
gastongab | 2:0a8622662f6d | 248 | pc.printf("Highest value right biceps= %f \r\n", temp_highest_emg1); |
gastongab | 2:0a8622662f6d | 249 | pc.printf("Highest value right triceps= %f \r\n", temp_highest_emg2); |
gastongab | 2:0a8622662f6d | 250 | pc.printf("Highest value left biceps= %f \r\n", temp_highest_emg3); |
gastongab | 2:0a8622662f6d | 251 | pc.printf("Highest value left triceps= %f \r\n", temp_highest_emg4); |
cmaas | 9:40c9a18c3430 | 252 | */ |
gastongab | 7:88fa84742b3c | 253 | |
gastongab | 6:f55ab7e38a7f | 254 | threshold1 = temp_highest_emg1*biceps_p_t; //Right Biceps |
gastongab | 6:f55ab7e38a7f | 255 | threshold2 = temp_highest_emg2*triceps_p_t; //Right Triceps |
gastongab | 6:f55ab7e38a7f | 256 | threshold3 = temp_highest_emg3*biceps_p_t; //Left Biceps |
gastongab | 7:88fa84742b3c | 257 | threshold4 = temp_highest_emg4*triceps_p_t; //Left Triceps |
gastongab | 2:0a8622662f6d | 258 | } |
gastongab | 2:0a8622662f6d | 259 | |
gastongab | 4:c7be673eb4a1 | 260 | //Check if emg_filtered has reached their threshold |
gastongab | 7:88fa84742b3c | 261 | void threshold_check() |
gastongab | 7:88fa84742b3c | 262 | { |
gastongab | 7:88fa84742b3c | 263 | |
gastongab | 2:0a8622662f6d | 264 | //EMG1 threshold check |
gastongab | 7:88fa84742b3c | 265 | if(emg1_filtered>threshold1) { |
gastongab | 4:c7be673eb4a1 | 266 | bicepsR = 1; |
gastongab | 7:88fa84742b3c | 267 | } else { |
gastongab | 4:c7be673eb4a1 | 268 | bicepsR= 0; |
gastongab | 7:88fa84742b3c | 269 | } |
gastongab | 2:0a8622662f6d | 270 | //EMG2 threshold check |
gastongab | 7:88fa84742b3c | 271 | if(emg2_filtered>threshold2) { |
gastongab | 4:c7be673eb4a1 | 272 | tricepsR = 1; |
gastongab | 7:88fa84742b3c | 273 | } else { |
gastongab | 4:c7be673eb4a1 | 274 | tricepsR= 0; |
gastongab | 7:88fa84742b3c | 275 | } |
gastongab | 2:0a8622662f6d | 276 | //EMG3 threshold check |
gastongab | 7:88fa84742b3c | 277 | if(emg3_filtered>threshold3) { |
gastongab | 4:c7be673eb4a1 | 278 | bicepsL = 1; |
gastongab | 7:88fa84742b3c | 279 | } else { |
gastongab | 4:c7be673eb4a1 | 280 | bicepsL= 0; |
gastongab | 7:88fa84742b3c | 281 | } |
gastongab | 2:0a8622662f6d | 282 | //EMG4 threshold check |
gastongab | 7:88fa84742b3c | 283 | if(emg4_filtered>threshold4) { |
gastongab | 4:c7be673eb4a1 | 284 | tricepsL = 1; |
gastongab | 7:88fa84742b3c | 285 | } else { |
gastongab | 4:c7be673eb4a1 | 286 | tricepsL= 0; |
gastongab | 7:88fa84742b3c | 287 | } |
gastongab | 7:88fa84742b3c | 288 | |
gastongab | 7:88fa84742b3c | 289 | /* |
gastongab | 4:c7be673eb4a1 | 290 | pc.printf("Biceps Right = %i", bicepsR); |
gastongab | 7:88fa84742b3c | 291 | pc.printf("Triceps Right = %i",tricepsR); |
gastongab | 4:c7be673eb4a1 | 292 | pc.printf("Biceps Left = %i", bicepsL); |
gastongab | 4:c7be673eb4a1 | 293 | pc.printf("Triceps Left = %i", tricepsL); |
gastongab | 4:c7be673eb4a1 | 294 | */ |
gastongab | 2:0a8622662f6d | 295 | } |
aschut | 0:90750f158475 | 296 | |
gastongab | 4:c7be673eb4a1 | 297 | //Activate ticker for Movement state, filtering and Threshold checking |
gastongab | 7:88fa84742b3c | 298 | void movement_ticker_activator() |
gastongab | 7:88fa84742b3c | 299 | { |
gastongab | 4:c7be673eb4a1 | 300 | sample_ticker.attach(&emgsample, ts); |
gastongab | 4:c7be673eb4a1 | 301 | threshold_check_ticker.attach(&threshold_check, ts); |
gastongab | 7:88fa84742b3c | 302 | } |
gastongab | 7:88fa84742b3c | 303 | void movement_ticker_deactivator() |
gastongab | 7:88fa84742b3c | 304 | { |
gastongab | 4:c7be673eb4a1 | 305 | sample_ticker.detach(); |
gastongab | 4:c7be673eb4a1 | 306 | threshold_check_ticker.detach(); |
gastongab | 7:88fa84742b3c | 307 | } |
gastongab | 7:88fa84742b3c | 308 | |
cmaas | 9:40c9a18c3430 | 309 | // ~~~~~~~~~~~~~~ROBOT KINEMATICS ~~~~~~~~~~~~~~~~~~ |
cmaas | 9:40c9a18c3430 | 310 | |
cmaas | 9:40c9a18c3430 | 311 | // functie x positie |
cmaas | 9:40c9a18c3430 | 312 | float positionx(int EMGxplus,int EMGxmin) |
cmaas | 9:40c9a18c3430 | 313 | { |
cmaas | 9:40c9a18c3430 | 314 | float EMGx = EMGxplus - EMGxmin; |
cmaas | 9:40c9a18c3430 | 315 | |
cmaas | 9:40c9a18c3430 | 316 | float verplaatsingx = EMGx * tijdstap * v; |
cmaas | 9:40c9a18c3430 | 317 | float pxnieuw = px + verplaatsingx; |
cmaas | 9:40c9a18c3430 | 318 | // x limit |
cmaas | 9:40c9a18c3430 | 319 | if (pxnieuw <= upperxlim && pxnieuw >= lowerxlim) { |
cmaas | 9:40c9a18c3430 | 320 | px = pxnieuw; |
cmaas | 9:40c9a18c3430 | 321 | } else { |
cmaas | 9:40c9a18c3430 | 322 | if (pxnieuw >= lowerxlim) { |
cmaas | 9:40c9a18c3430 | 323 | px = upperxlim; |
cmaas | 9:40c9a18c3430 | 324 | } else { |
cmaas | 9:40c9a18c3430 | 325 | px = lowerxlim; |
cmaas | 9:40c9a18c3430 | 326 | } |
cmaas | 9:40c9a18c3430 | 327 | } |
cmaas | 9:40c9a18c3430 | 328 | //printf("X eindpunt (%f) en verplaatsing: (%f)\n\r",px,verplaatsingx); |
cmaas | 9:40c9a18c3430 | 329 | return px; |
cmaas | 9:40c9a18c3430 | 330 | } |
cmaas | 9:40c9a18c3430 | 331 | |
cmaas | 9:40c9a18c3430 | 332 | |
cmaas | 9:40c9a18c3430 | 333 | // functie y positie |
cmaas | 9:40c9a18c3430 | 334 | float positiony(int EMGyplus,int EMGymin) |
cmaas | 9:40c9a18c3430 | 335 | { |
cmaas | 9:40c9a18c3430 | 336 | float EMGy = EMGyplus - EMGymin; |
cmaas | 9:40c9a18c3430 | 337 | |
cmaas | 9:40c9a18c3430 | 338 | float verplaatsingy = EMGy * tijdstap * v; |
cmaas | 9:40c9a18c3430 | 339 | float pynieuw = py + verplaatsingy; |
cmaas | 9:40c9a18c3430 | 340 | |
cmaas | 9:40c9a18c3430 | 341 | // y limit |
cmaas | 9:40c9a18c3430 | 342 | if (pynieuw <= upperylim && pynieuw >= lowerylim) { |
cmaas | 9:40c9a18c3430 | 343 | py = pynieuw; |
cmaas | 9:40c9a18c3430 | 344 | } else { |
cmaas | 9:40c9a18c3430 | 345 | if (pynieuw >= lowerylim) { |
cmaas | 9:40c9a18c3430 | 346 | py = upperylim; |
cmaas | 9:40c9a18c3430 | 347 | } else { |
cmaas | 9:40c9a18c3430 | 348 | py = lowerylim; |
cmaas | 9:40c9a18c3430 | 349 | } |
cmaas | 9:40c9a18c3430 | 350 | } |
cmaas | 9:40c9a18c3430 | 351 | //printf("Y eindpunt (%f) en verplaatsing: (%f) \n\r",py,verplaatsingy); |
cmaas | 9:40c9a18c3430 | 352 | return (py); |
cmaas | 9:40c9a18c3430 | 353 | } |
cmaas | 9:40c9a18c3430 | 354 | |
cmaas | 9:40c9a18c3430 | 355 | |
cmaas | 9:40c9a18c3430 | 356 | //~~~~~~~~~~~~CALCULATIING MOTOR ANGLES ~~~~~~~~ |
cmaas | 9:40c9a18c3430 | 357 | // arm 1 --> reference angle motor 1 |
cmaas | 9:40c9a18c3430 | 358 | float hoek1(float px, float py) // input: ref x, ref y |
cmaas | 9:40c9a18c3430 | 359 | { |
cmaas | 9:40c9a18c3430 | 360 | float c1x = px - rp * cos(thetap +(M_PI/6)); // x locatie hoekpunt end-effector |
cmaas | 9:40c9a18c3430 | 361 | float c1y = py - rp*sin(thetap+(M_PI/6)); // y locatie hoekpunt end-effector |
cmaas | 9:40c9a18c3430 | 362 | float alpha1 = atan2((c1y-a1y),(c1x-a1x)); // hoek tussen horizontaal en lijn van motor naar bijbehorende end-effector punt |
cmaas | 9:40c9a18c3430 | 363 | float psi1 = acos(( pow(la,2)-pow(lp,2)+pow((c1x-a1x),2)+pow((c1y-a1y),2))/(2*la*sqrt(pow ((c1x-a1x),2)+pow((c1y-a1y),2) ))); //Hoek tussen lijn van motor naar bijbehorende end=effector punt en actieve arm |
cmaas | 9:40c9a18c3430 | 364 | float a1 = alpha1 + psi1 - da1; //hoek tussen horizontaal en actieve arm |
cmaas | 9:40c9a18c3430 | 365 | //printf("arm 1 = %f \n\r",a1); |
cmaas | 9:40c9a18c3430 | 366 | return a1; |
cmaas | 9:40c9a18c3430 | 367 | } |
cmaas | 9:40c9a18c3430 | 368 | |
cmaas | 9:40c9a18c3430 | 369 | // arm 2 --> reference angle motor 2 |
cmaas | 9:40c9a18c3430 | 370 | float hoek2(float px, float py) |
cmaas | 9:40c9a18c3430 | 371 | { |
cmaas | 9:40c9a18c3430 | 372 | float c2x = px - rp * cos(thetap -(M_PI/2)); |
cmaas | 9:40c9a18c3430 | 373 | float c2y = py - rp*sin(thetap-(M_PI/2)); |
cmaas | 9:40c9a18c3430 | 374 | float alpha2 = atan2((c2y-a2y),(c2x-a2x)); |
cmaas | 9:40c9a18c3430 | 375 | float psi2 = acos(( pow(la,2)-pow(lp,2)+pow((c2x-a2x),2)+pow((c2y-a2y),2))/(2*la*sqrt(pow ((c2x-a2x),2)+pow((c2y-a2y),2) ))); |
cmaas | 9:40c9a18c3430 | 376 | float a2 = alpha2 + psi2 - da2; |
cmaas | 9:40c9a18c3430 | 377 | //printf("arm 2 = %f \n\r",a2); |
cmaas | 9:40c9a18c3430 | 378 | return a2; |
cmaas | 9:40c9a18c3430 | 379 | } |
cmaas | 9:40c9a18c3430 | 380 | |
cmaas | 9:40c9a18c3430 | 381 | //arm 3 --> reference angle motor 3 |
cmaas | 9:40c9a18c3430 | 382 | float hoek3(float px, float py) |
cmaas | 9:40c9a18c3430 | 383 | { |
cmaas | 9:40c9a18c3430 | 384 | float c3x = px - rp * cos(thetap +(5*M_PI/6)); |
cmaas | 9:40c9a18c3430 | 385 | float c3y = py - rp*sin(thetap+(5*M_PI/6)); |
cmaas | 9:40c9a18c3430 | 386 | float alpha3 = atan2((c3y-a3y),(c3x-a3x)); |
cmaas | 9:40c9a18c3430 | 387 | float psi3 = acos(( pow(la,2)-pow(lp,2)+pow((c3x-a3x),2)+pow((c3y-a3y),2))/(2*la*sqrt(pow ((c3x-a3x),2)+pow((c3y-a3y),2) ))); |
cmaas | 9:40c9a18c3430 | 388 | float a3 = alpha3 + psi3 - da3; |
cmaas | 9:40c9a18c3430 | 389 | //printf("arm 3 = %f \n\r",a3); |
cmaas | 9:40c9a18c3430 | 390 | return a3; |
cmaas | 9:40c9a18c3430 | 391 | } |
cmaas | 9:40c9a18c3430 | 392 | |
cmaas | 9:40c9a18c3430 | 393 | // ~~~~~~~~~~~~~~PID CONTROLLER~~~~~~~~~~~~~~~~~~ |
cmaas | 9:40c9a18c3430 | 394 | |
cmaas | 9:40c9a18c3430 | 395 | double PID_controller(double error) |
cmaas | 9:40c9a18c3430 | 396 | { |
cmaas | 9:40c9a18c3430 | 397 | static double error_integral = 0; |
cmaas | 9:40c9a18c3430 | 398 | static double error_prev = error; // initialization with this value only done once! |
cmaas | 9:40c9a18c3430 | 399 | static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); |
cmaas | 9:40c9a18c3430 | 400 | |
cmaas | 9:40c9a18c3430 | 401 | // Proportional part: |
cmaas | 9:40c9a18c3430 | 402 | double u_k = Kp * error; |
cmaas | 9:40c9a18c3430 | 403 | |
cmaas | 9:40c9a18c3430 | 404 | // Integral part |
cmaas | 9:40c9a18c3430 | 405 | error_integral = error_integral + error * Ts; |
cmaas | 9:40c9a18c3430 | 406 | double u_i = Ki * error_integral; |
cmaas | 9:40c9a18c3430 | 407 | |
cmaas | 9:40c9a18c3430 | 408 | // Derivative part |
cmaas | 9:40c9a18c3430 | 409 | double error_derivative = (error - error_prev)/Ts; |
cmaas | 9:40c9a18c3430 | 410 | double filtered_error_derivative = LowPassFilter.step(error_derivative); |
cmaas | 9:40c9a18c3430 | 411 | double u_d = Kd * filtered_error_derivative; |
cmaas | 9:40c9a18c3430 | 412 | error_prev = error; |
cmaas | 9:40c9a18c3430 | 413 | |
cmaas | 9:40c9a18c3430 | 414 | // Sum all parts and return it |
cmaas | 9:40c9a18c3430 | 415 | return u_k + u_i + u_d; |
cmaas | 9:40c9a18c3430 | 416 | } |
cmaas | 9:40c9a18c3430 | 417 | |
cmaas | 9:40c9a18c3430 | 418 | |
cmaas | 9:40c9a18c3430 | 419 | // DIRECTON AND SPEED CONTROL |
cmaas | 9:40c9a18c3430 | 420 | void moter_control(double u) |
cmaas | 9:40c9a18c3430 | 421 | { |
cmaas | 9:40c9a18c3430 | 422 | |
cmaas | 9:40c9a18c3430 | 423 | directionpin1= u > 0.0f; //eithertrueor false |
cmaas | 9:40c9a18c3430 | 424 | if (fabs(u)> 0.7f) { |
cmaas | 9:40c9a18c3430 | 425 | u = 0.7f; |
cmaas | 9:40c9a18c3430 | 426 | } else { |
cmaas | 9:40c9a18c3430 | 427 | u= u; |
cmaas | 9:40c9a18c3430 | 428 | } |
cmaas | 9:40c9a18c3430 | 429 | pwmpin1= fabs(u); //pwmduty cycle canonlybepositive, floatingpoint absolute value |
cmaas | 9:40c9a18c3430 | 430 | } |
cmaas | 9:40c9a18c3430 | 431 | |
cmaas | 9:40c9a18c3430 | 432 | void moter2_control(double u) |
cmaas | 9:40c9a18c3430 | 433 | { |
cmaas | 9:40c9a18c3430 | 434 | directionpin2= u > 0.0f; //eithertrueor false |
cmaas | 9:40c9a18c3430 | 435 | if (fabs(u)> 0.7f) { |
cmaas | 9:40c9a18c3430 | 436 | u = 0.7f; |
cmaas | 9:40c9a18c3430 | 437 | } else { |
cmaas | 9:40c9a18c3430 | 438 | u= u; |
cmaas | 9:40c9a18c3430 | 439 | } |
cmaas | 9:40c9a18c3430 | 440 | pwmpin2= fabs(u); //pwmduty cycle canonlybepositive, floatingpoint absolute value |
cmaas | 9:40c9a18c3430 | 441 | } |
cmaas | 9:40c9a18c3430 | 442 | |
cmaas | 9:40c9a18c3430 | 443 | void moter3_control(double u) |
cmaas | 9:40c9a18c3430 | 444 | { |
cmaas | 9:40c9a18c3430 | 445 | directionpin3= u > 0.0f; //eithertrueor false |
cmaas | 9:40c9a18c3430 | 446 | if (fabs(u)> 0.7f) { |
cmaas | 9:40c9a18c3430 | 447 | u = 0.7f; |
cmaas | 9:40c9a18c3430 | 448 | } else { |
cmaas | 9:40c9a18c3430 | 449 | u= u; |
cmaas | 9:40c9a18c3430 | 450 | } |
cmaas | 9:40c9a18c3430 | 451 | pwmpin3 = fabs(u); //pwmduty cycle canonlybepositive, floatingpoint absolute value |
cmaas | 9:40c9a18c3430 | 452 | } |
cmaas | 9:40c9a18c3430 | 453 | |
cmaas | 9:40c9a18c3430 | 454 | // CONTROLLING THE MOTOR |
cmaas | 9:40c9a18c3430 | 455 | void Motor_mover() |
cmaas | 9:40c9a18c3430 | 456 | { |
cmaas | 9:40c9a18c3430 | 457 | double motor_position = encoder1.getPulses(); //output in counts |
cmaas | 9:40c9a18c3430 | 458 | double reference_rotation = hoek1(px, py); |
cmaas | 9:40c9a18c3430 | 459 | double error = reference_rotation - motor_position*(2*PI)/8400; |
cmaas | 9:40c9a18c3430 | 460 | double u = PID_controller(error); |
cmaas | 9:40c9a18c3430 | 461 | moter_control(u); |
cmaas | 9:40c9a18c3430 | 462 | |
cmaas | 9:40c9a18c3430 | 463 | double motor_position2 = encoder2.getPulses(); //output in counts |
cmaas | 9:40c9a18c3430 | 464 | double reference_rotation2 = hoek2(px, py); |
cmaas | 9:40c9a18c3430 | 465 | double error_2 = reference_rotation2 - motor_position2*(2*PI)/8400; |
cmaas | 9:40c9a18c3430 | 466 | double u_2 = PID_controller(error_2); |
cmaas | 9:40c9a18c3430 | 467 | moter2_control(u_2); |
cmaas | 9:40c9a18c3430 | 468 | |
cmaas | 9:40c9a18c3430 | 469 | double motor_position3 = encoder3.getPulses(); //output in counts |
cmaas | 9:40c9a18c3430 | 470 | double reference_rotation3 = hoek3(px, py); |
cmaas | 9:40c9a18c3430 | 471 | double error_3 = reference_rotation3 - motor_position3*(2*PI)/8400; |
cmaas | 9:40c9a18c3430 | 472 | double u_3 = PID_controller(error_3); |
cmaas | 9:40c9a18c3430 | 473 | moter3_control(u_3); |
cmaas | 9:40c9a18c3430 | 474 | |
cmaas | 9:40c9a18c3430 | 475 | |
cmaas | 9:40c9a18c3430 | 476 | } |
cmaas | 9:40c9a18c3430 | 477 | |
cmaas | 9:40c9a18c3430 | 478 | |
cmaas | 9:40c9a18c3430 | 479 | |
cmaas | 9:40c9a18c3430 | 480 | //-------------------- STATE MACHINE -------------------------- |
gastongab | 7:88fa84742b3c | 481 | enum states {MOTORS_OFF,CALIBRATION,HOMING,DEMO,MOVEMENT,CLICK}; |
gastongab | 2:0a8622662f6d | 482 | states currentState = MOTORS_OFF; //Chosen startingposition for states |
aschut | 0:90750f158475 | 483 | bool stateChanged = true; // Make sure the initialization of first state is executed |
aschut | 0:90750f158475 | 484 | |
aschut | 0:90750f158475 | 485 | void ProcessStateMachine(void) |
aschut | 0:90750f158475 | 486 | { |
gastongab | 7:88fa84742b3c | 487 | switch (currentState) { |
gastongab | 7:88fa84742b3c | 488 | case MOTORS_OFF: |
gastongab | 7:88fa84742b3c | 489 | // Actions |
gastongab | 7:88fa84742b3c | 490 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 491 | // state initialization: rood |
gastongab | 7:88fa84742b3c | 492 | led1 = 1; |
gastongab | 7:88fa84742b3c | 493 | led2 = 0; |
gastongab | 7:88fa84742b3c | 494 | led3 = 1; |
gastongab | 7:88fa84742b3c | 495 | wait (1); |
gastongab | 7:88fa84742b3c | 496 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 497 | } |
gastongab | 7:88fa84742b3c | 498 | |
gastongab | 7:88fa84742b3c | 499 | // State transition logic: Als button 1 word ingedrukt --> calibratie, anders motor uithouden |
gastongab | 7:88fa84742b3c | 500 | if (!button1) { |
gastongab | 7:88fa84742b3c | 501 | currentState = CALIBRATION; |
gastongab | 7:88fa84742b3c | 502 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 503 | } else if (!button2) { |
gastongab | 7:88fa84742b3c | 504 | currentState = HOMING ; |
gastongab | 7:88fa84742b3c | 505 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 506 | } else { |
gastongab | 7:88fa84742b3c | 507 | currentState = MOTORS_OFF; |
gastongab | 7:88fa84742b3c | 508 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 509 | } |
gastongab | 7:88fa84742b3c | 510 | |
gastongab | 7:88fa84742b3c | 511 | break; |
gastongab | 7:88fa84742b3c | 512 | |
gastongab | 7:88fa84742b3c | 513 | case CALIBRATION: |
gastongab | 7:88fa84742b3c | 514 | // Actions |
gastongab | 7:88fa84742b3c | 515 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 516 | // state initialization: oranje |
gastongab | 7:88fa84742b3c | 517 | temp_highest_emg1 = 0; //highest detected value right biceps |
gastongab | 7:88fa84742b3c | 518 | temp_highest_emg2 = 0; |
gastongab | 7:88fa84742b3c | 519 | temp_highest_emg3 = 0; |
gastongab | 7:88fa84742b3c | 520 | temp_highest_emg4 = 0; |
gastongab | 7:88fa84742b3c | 521 | |
gastongab | 7:88fa84742b3c | 522 | timer_calibration.reset(); |
gastongab | 7:88fa84742b3c | 523 | timer_calibration.start(); |
gastongab | 7:88fa84742b3c | 524 | |
gastongab | 7:88fa84742b3c | 525 | sample_ticker.attach(&emgsample, ts); |
gastongab | 7:88fa84742b3c | 526 | CalibrationEMG(); |
gastongab | 7:88fa84742b3c | 527 | sample_ticker.detach(); |
gastongab | 7:88fa84742b3c | 528 | timer_calibration.stop(); |
aschut | 0:90750f158475 | 529 | |
gastongab | 7:88fa84742b3c | 530 | |
gastongab | 7:88fa84742b3c | 531 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 532 | } |
gastongab | 7:88fa84742b3c | 533 | |
gastongab | 7:88fa84742b3c | 534 | // State transition logic: automatisch terug naar motors off. |
gastongab | 7:88fa84742b3c | 535 | |
gastongab | 7:88fa84742b3c | 536 | currentState = MOTORS_OFF; |
gastongab | 7:88fa84742b3c | 537 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 538 | break; |
gastongab | 7:88fa84742b3c | 539 | |
gastongab | 7:88fa84742b3c | 540 | case HOMING: |
gastongab | 7:88fa84742b3c | 541 | // Actions |
gastongab | 7:88fa84742b3c | 542 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 543 | // state initialization: green |
gastongab | 7:88fa84742b3c | 544 | t.reset(); |
gastongab | 7:88fa84742b3c | 545 | t.start(); |
gastongab | 7:88fa84742b3c | 546 | led1 = 0; |
gastongab | 7:88fa84742b3c | 547 | led2 = 1; |
gastongab | 7:88fa84742b3c | 548 | led3 = 1; |
gastongab | 7:88fa84742b3c | 549 | wait (1); |
gastongab | 7:88fa84742b3c | 550 | |
gastongab | 7:88fa84742b3c | 551 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 552 | } |
gastongab | 7:88fa84742b3c | 553 | |
gastongab | 7:88fa84742b3c | 554 | // State transition logic: naar DEMO (button1), naar MOVEMENT(button2) |
gastongab | 7:88fa84742b3c | 555 | if (!button1) { |
gastongab | 7:88fa84742b3c | 556 | currentState = DEMO; |
gastongab | 7:88fa84742b3c | 557 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 558 | } else if (!button2) { |
gastongab | 7:88fa84742b3c | 559 | currentState = MOVEMENT ; |
gastongab | 7:88fa84742b3c | 560 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 561 | } else if (t>300) { |
gastongab | 7:88fa84742b3c | 562 | t.stop(); |
gastongab | 7:88fa84742b3c | 563 | t.reset(); |
gastongab | 7:88fa84742b3c | 564 | currentState = MOTORS_OFF ; |
gastongab | 7:88fa84742b3c | 565 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 566 | } else { |
gastongab | 7:88fa84742b3c | 567 | currentState = HOMING ; |
gastongab | 7:88fa84742b3c | 568 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 569 | } |
gastongab | 7:88fa84742b3c | 570 | break; |
gastongab | 7:88fa84742b3c | 571 | |
aschut | 0:90750f158475 | 572 | case DEMO: |
gastongab | 7:88fa84742b3c | 573 | // Actions |
gastongab | 7:88fa84742b3c | 574 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 575 | // state initialization: light blue |
gastongab | 7:88fa84742b3c | 576 | led1 = 0; |
gastongab | 7:88fa84742b3c | 577 | led2 = 1; |
gastongab | 7:88fa84742b3c | 578 | led3 = 0; |
gastongab | 7:88fa84742b3c | 579 | wait (1); |
gastongab | 7:88fa84742b3c | 580 | |
gastongab | 7:88fa84742b3c | 581 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 582 | } |
gastongab | 7:88fa84742b3c | 583 | |
gastongab | 7:88fa84742b3c | 584 | // State transition logic: automatisch terug naar HOMING |
gastongab | 7:88fa84742b3c | 585 | currentState = HOMING; |
gastongab | 7:88fa84742b3c | 586 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 587 | break; |
gastongab | 7:88fa84742b3c | 588 | |
gastongab | 7:88fa84742b3c | 589 | case MOVEMENT: |
gastongab | 7:88fa84742b3c | 590 | // Actions |
gastongab | 7:88fa84742b3c | 591 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 592 | // state initialization: purple |
gastongab | 7:88fa84742b3c | 593 | //t.reset(); |
gastongab | 7:88fa84742b3c | 594 | //t.start(); |
gastongab | 7:88fa84742b3c | 595 | |
gastongab | 7:88fa84742b3c | 596 | led1 = 1; |
gastongab | 7:88fa84742b3c | 597 | led2 = 0; |
gastongab | 7:88fa84742b3c | 598 | led3 = 0; |
gastongab | 7:88fa84742b3c | 599 | wait(2); |
gastongab | 7:88fa84742b3c | 600 | |
gastongab | 7:88fa84742b3c | 601 | movement_ticker_activator(); |
gastongab | 7:88fa84742b3c | 602 | |
gastongab | 7:88fa84742b3c | 603 | led1 = 0; |
gastongab | 7:88fa84742b3c | 604 | led2 = 0; |
gastongab | 7:88fa84742b3c | 605 | led3 = 0; |
gastongab | 7:88fa84742b3c | 606 | wait(2); |
gastongab | 7:88fa84742b3c | 607 | |
gastongab | 7:88fa84742b3c | 608 | |
gastongab | 7:88fa84742b3c | 609 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 610 | } |
gastongab | 7:88fa84742b3c | 611 | |
gastongab | 7:88fa84742b3c | 612 | // State transition logic: naar CLICK (button1), naar MOTORS_OFF(button2) anders naar MOVEMENT |
gastongab | 7:88fa84742b3c | 613 | if (!button1) { |
gastongab | 7:88fa84742b3c | 614 | movement_ticker_deactivator(); |
gastongab | 7:88fa84742b3c | 615 | currentState = CLICK; |
gastongab | 7:88fa84742b3c | 616 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 617 | } else if (!button2) { |
gastongab | 7:88fa84742b3c | 618 | movement_ticker_deactivator(); |
gastongab | 7:88fa84742b3c | 619 | currentState = MOTORS_OFF ; |
gastongab | 7:88fa84742b3c | 620 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 621 | } else if (bicepsR==0 && tricepsR==0 && bicepsL==0 && tricepsL==0) { //this check if person is idle for more than 300seconds |
gastongab | 7:88fa84742b3c | 622 | t.start(); |
gastongab | 7:88fa84742b3c | 623 | } else if (bicepsR==1 || tricepsR==1 || bicepsL==1 || tricepsL==1) { |
gastongab | 7:88fa84742b3c | 624 | t.stop(); |
gastongab | 7:88fa84742b3c | 625 | t.reset(); |
gastongab | 7:88fa84742b3c | 626 | } |
gastongab | 7:88fa84742b3c | 627 | |
gastongab | 7:88fa84742b3c | 628 | if(t>20) { |
gastongab | 7:88fa84742b3c | 629 | movement_ticker_deactivator(); |
gastongab | 7:88fa84742b3c | 630 | t.stop(); |
gastongab | 7:88fa84742b3c | 631 | t.reset(); |
gastongab | 7:88fa84742b3c | 632 | currentState = HOMING ; |
gastongab | 7:88fa84742b3c | 633 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 634 | } |
gastongab | 7:88fa84742b3c | 635 | // here ends the idle checking mode |
gastongab | 7:88fa84742b3c | 636 | else { |
gastongab | 7:88fa84742b3c | 637 | //For every muscle a different colour if threshold is passed |
gastongab | 7:88fa84742b3c | 638 | if(bicepsR==1) { |
gastongab | 7:88fa84742b3c | 639 | led1 = 0; |
gastongab | 7:88fa84742b3c | 640 | led2 = 1; |
gastongab | 7:88fa84742b3c | 641 | led3 = 1; |
gastongab | 7:88fa84742b3c | 642 | } else if (bicepsR==0 && tricepsR==0 && bicepsL==0 && tricepsL==0 ) { |
gastongab | 7:88fa84742b3c | 643 | led1 = 1; |
gastongab | 7:88fa84742b3c | 644 | led2 = 1; |
gastongab | 7:88fa84742b3c | 645 | led3 = 1; |
gastongab | 7:88fa84742b3c | 646 | } |
gastongab | 7:88fa84742b3c | 647 | if(tricepsR==1) { |
gastongab | 7:88fa84742b3c | 648 | led1 = 1; |
gastongab | 7:88fa84742b3c | 649 | led2 = 0; |
gastongab | 7:88fa84742b3c | 650 | led3 = 1; |
gastongab | 7:88fa84742b3c | 651 | } else if (bicepsR==0 && tricepsR==0 && bicepsL==0 && tricepsL==0 ) { |
gastongab | 7:88fa84742b3c | 652 | led1 = 1; |
gastongab | 7:88fa84742b3c | 653 | led2 = 1; |
gastongab | 7:88fa84742b3c | 654 | led3 = 1; |
gastongab | 7:88fa84742b3c | 655 | } |
gastongab | 7:88fa84742b3c | 656 | if(bicepsL==1) { |
gastongab | 7:88fa84742b3c | 657 | led1 = 1; |
gastongab | 7:88fa84742b3c | 658 | led2 = 1; |
gastongab | 7:88fa84742b3c | 659 | led3 = 0; |
gastongab | 7:88fa84742b3c | 660 | } else if (bicepsR==0 && tricepsR==0 && bicepsL==0 && tricepsL==0 ) { |
gastongab | 7:88fa84742b3c | 661 | led1 = 1; |
gastongab | 7:88fa84742b3c | 662 | led2 = 1; |
gastongab | 7:88fa84742b3c | 663 | led3 = 1; |
gastongab | 7:88fa84742b3c | 664 | } |
gastongab | 7:88fa84742b3c | 665 | if(tricepsL==1) { |
gastongab | 7:88fa84742b3c | 666 | led1 = 1; |
gastongab | 7:88fa84742b3c | 667 | led2 = 0; |
gastongab | 7:88fa84742b3c | 668 | led3 = 0; |
gastongab | 7:88fa84742b3c | 669 | } else if (bicepsR==0 && tricepsR==0 && bicepsL==0 && tricepsL==0 ) { |
gastongab | 7:88fa84742b3c | 670 | led1 = 1; |
gastongab | 7:88fa84742b3c | 671 | led2 = 1; |
gastongab | 7:88fa84742b3c | 672 | led3 = 1; |
gastongab | 7:88fa84742b3c | 673 | } |
gastongab | 7:88fa84742b3c | 674 | currentState = MOVEMENT ; |
gastongab | 7:88fa84742b3c | 675 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 676 | } |
gastongab | 7:88fa84742b3c | 677 | |
gastongab | 7:88fa84742b3c | 678 | break; |
gastongab | 7:88fa84742b3c | 679 | |
aschut | 0:90750f158475 | 680 | case CLICK: |
gastongab | 7:88fa84742b3c | 681 | // Actions |
gastongab | 7:88fa84742b3c | 682 | if (stateChanged) { |
gastongab | 7:88fa84742b3c | 683 | // state initialization: blue |
gastongab | 7:88fa84742b3c | 684 | led1 = 1; |
gastongab | 7:88fa84742b3c | 685 | led2 = 1; |
gastongab | 7:88fa84742b3c | 686 | led3 = 0; |
gastongab | 7:88fa84742b3c | 687 | wait (1); |
aschut | 0:90750f158475 | 688 | |
gastongab | 7:88fa84742b3c | 689 | stateChanged = false; |
gastongab | 7:88fa84742b3c | 690 | } |
gastongab | 7:88fa84742b3c | 691 | |
gastongab | 7:88fa84742b3c | 692 | // State transition logic: automatisch terug naar MOVEMENT. |
gastongab | 7:88fa84742b3c | 693 | |
gastongab | 7:88fa84742b3c | 694 | currentState = MOVEMENT; |
gastongab | 7:88fa84742b3c | 695 | stateChanged = true; |
gastongab | 7:88fa84742b3c | 696 | break; |
gastongab | 7:88fa84742b3c | 697 | |
gastongab | 4:c7be673eb4a1 | 698 | } |
aschut | 0:90750f158475 | 699 | } |
gastongab | 7:88fa84742b3c | 700 | |
cmaas | 9:40c9a18c3430 | 701 | // --------------------------MAIN-------------------- |
cmaas | 9:40c9a18c3430 | 702 | |
cmaas | 9:40c9a18c3430 | 703 | |
aschut | 0:90750f158475 | 704 | int main() |
aschut | 0:90750f158475 | 705 | { |
gastongab | 4:c7be673eb4a1 | 706 | //BiQuad Chain add |
gastongab | 4:c7be673eb4a1 | 707 | highp1.add( &highp1_1 ).add( &highp1_2 ); |
gastongab | 4:c7be673eb4a1 | 708 | notch1.add( ¬ch1_1 ).add( ¬ch1_2 ); |
gastongab | 4:c7be673eb4a1 | 709 | lowp1.add( &lowp1_1 ).add(&lowp1_2); |
gastongab | 7:88fa84742b3c | 710 | |
gastongab | 4:c7be673eb4a1 | 711 | highp2.add( &highp2_1 ).add( &highp2_2 ); |
gastongab | 4:c7be673eb4a1 | 712 | notch2.add( ¬ch2_1 ).add( ¬ch2_2 ); |
gastongab | 7:88fa84742b3c | 713 | lowp2.add( &lowp2_1 ).add(&lowp2_2); |
gastongab | 7:88fa84742b3c | 714 | |
gastongab | 4:c7be673eb4a1 | 715 | highp3.add( &highp3_1 ).add( &highp3_2 ); |
gastongab | 4:c7be673eb4a1 | 716 | notch3.add( ¬ch3_1 ).add( ¬ch3_2 ); |
gastongab | 4:c7be673eb4a1 | 717 | lowp3.add( &lowp3_1 ).add(&lowp3_2); |
gastongab | 7:88fa84742b3c | 718 | |
gastongab | 4:c7be673eb4a1 | 719 | highp4.add( &highp4_1 ).add( &highp4_2 ); |
gastongab | 4:c7be673eb4a1 | 720 | notch4.add( ¬ch4_1 ).add( ¬ch4_2 ); |
gastongab | 4:c7be673eb4a1 | 721 | lowp4.add( &lowp4_1 ).add(&lowp4_2); |
gastongab | 7:88fa84742b3c | 722 | |
gastongab | 2:0a8622662f6d | 723 | pc.baud(115200); |
aschut | 0:90750f158475 | 724 | led1 = 1; |
aschut | 0:90750f158475 | 725 | led2 = 1; |
aschut | 0:90750f158475 | 726 | led3 = 1; |
cmaas | 9:40c9a18c3430 | 727 | |
cmaas | 9:40c9a18c3430 | 728 | pwmpin1.period_us(60); // setup motor |
cmaas | 9:40c9a18c3430 | 729 | ref_rot.attach(Motor_mover, 0.001);// HAS TO GO TO STATE MACHINE |
gastongab | 7:88fa84742b3c | 730 | |
gastongab | 7:88fa84742b3c | 731 | while (true) { |
gastongab | 7:88fa84742b3c | 732 | ProcessStateMachine(); |
gastongab | 7:88fa84742b3c | 733 | |
aschut | 0:90750f158475 | 734 | } |
gastongab | 7:88fa84742b3c | 735 | |
aschut | 0:90750f158475 | 736 | } |
aschut | 0:90750f158475 | 737 | |
aschut | 0:90750f158475 | 738 | |
aschut | 0:90750f158475 | 739 | |
aschut | 0:90750f158475 | 740 | |
aschut | 0:90750f158475 | 741 | |
aschut | 0:90750f158475 | 742 |