Aansturen van een LED script dmv twee EMG signalen

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed

Committer:
jessekaiser
Date:
Mon Nov 03 20:35:03 2014 +0000
Revision:
8:ee16c139e10b
Parent:
7:119b85a92a09
Doet die het nu?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jessekaiser 0:db396b9f4b4c 1 #include "mbed.h"
jessekaiser 0:db396b9f4b4c 2 #include "HIDScope.h"
jessekaiser 0:db396b9f4b4c 3 #include "arm_math.h"
jessekaiser 0:db396b9f4b4c 4 #include "MODSERIAL.h"
jessekaiser 8:ee16c139e10b 5 #include "encoder.h"
jessekaiser 8:ee16c139e10b 6 #include "PwmOut.h"
jessekaiser 0:db396b9f4b4c 7
jessekaiser 8:ee16c139e10b 8 // define
jessekaiser 8:ee16c139e10b 9 #define TSAMP 0.005
jessekaiser 8:ee16c139e10b 10 #define K_P1 (3.5) //Kp waarde voor motor1, van het batje // 7.0
jessekaiser 8:ee16c139e10b 11 #define K_I1 (0.01 *TSAMP) //0.1
jessekaiser 8:ee16c139e10b 12 #define K_P2 (0.7) //Kp waarde voor motor2, de arm //10.0
jessekaiser 8:ee16c139e10b 13 #define K_I2 (0.01 *TSAMP) //3.0
jessekaiser 8:ee16c139e10b 14 #define I_LIMIT 1.
jessekaiser 8:ee16c139e10b 15 #define l_arm 0.5
jessekaiser 8:ee16c139e10b 16
jessekaiser 8:ee16c139e10b 17 #define M1_PWM PTC8
jessekaiser 8:ee16c139e10b 18 #define M1_DIR PTC9
jessekaiser 8:ee16c139e10b 19 #define M2_PWM PTA5
jessekaiser 8:ee16c139e10b 20 #define M2_DIR PTA4
jessekaiser 0:db396b9f4b4c 21
jessekaiser 8:ee16c139e10b 22 //Groene kabel moet op de GROUND en blauw op de 3.3v aansluiting
jessekaiser 8:ee16c139e10b 23
jessekaiser 8:ee16c139e10b 24 // Define objects
jessekaiser 8:ee16c139e10b 25 Serial pc(USBTX, USBRX);
jessekaiser 8:ee16c139e10b 26
jessekaiser 8:ee16c139e10b 27 // LED
jessekaiser 8:ee16c139e10b 28 DigitalOut myledred(PTB3);
jessekaiser 8:ee16c139e10b 29 DigitalOut myledgreen(PTB1);
jessekaiser 8:ee16c139e10b 30 DigitalOut myledblue(PTB2);
jessekaiser 8:ee16c139e10b 31
jessekaiser 8:ee16c139e10b 32 //EMG
jessekaiser 8:ee16c139e10b 33 AnalogIn emg0(PTB0); //Analog input
jessekaiser 8:ee16c139e10b 34 AnalogIn emg1(PTC2); //Analog input
jessekaiser 3:0895fa0a6ca4 35 HIDScope scope(4);
jessekaiser 0:db396b9f4b4c 36
jessekaiser 8:ee16c139e10b 37 //motor1 25D
jessekaiser 8:ee16c139e10b 38 Encoder motor1(PTD3,PTD5); //wit, geel
jessekaiser 8:ee16c139e10b 39 PwmOut pwm_motor1(M2_PWM);
jessekaiser 8:ee16c139e10b 40 DigitalOut motordir1(M2_DIR);
jessekaiser 8:ee16c139e10b 41
jessekaiser 8:ee16c139e10b 42 //motor2 37D
jessekaiser 8:ee16c139e10b 43 Encoder motor2(PTD2, PTD0); //wit, geel
jessekaiser 8:ee16c139e10b 44 PwmOut pwm_motor2(M1_PWM);
jessekaiser 8:ee16c139e10b 45 DigitalOut motordir2(M1_DIR);
jessekaiser 8:ee16c139e10b 46
jessekaiser 8:ee16c139e10b 47 // Motor variabelen
jessekaiser 8:ee16c139e10b 48 float pwm_out1 = 0;
jessekaiser 8:ee16c139e10b 49 float pwm_out2 = 0;
jessekaiser 8:ee16c139e10b 50 int cur_pos_motor1;
jessekaiser 8:ee16c139e10b 51 int prev_pos_motor1 = 0;
jessekaiser 8:ee16c139e10b 52 int cur_pos_motor2;
jessekaiser 8:ee16c139e10b 53 int prev_pos_motor2 = 0;
jessekaiser 8:ee16c139e10b 54 float speed1_rad;
jessekaiser 8:ee16c139e10b 55 float speed2_rad;
jessekaiser 8:ee16c139e10b 56 float pos_motor1_rad;
jessekaiser 8:ee16c139e10b 57 float pos_motor2_rad;
jessekaiser 8:ee16c139e10b 58 int staat1 = 0;
jessekaiser 8:ee16c139e10b 59 int staat2 = 0;
jessekaiser 8:ee16c139e10b 60 volatile float arm_hoogte = 0;
jessekaiser 8:ee16c139e10b 61 volatile float batje_hoek = 0;
jessekaiser 8:ee16c139e10b 62 int wait_iterator1 = 0;
jessekaiser 8:ee16c139e10b 63 int wait_iterator2 = 0;
jessekaiser 8:ee16c139e10b 64
jessekaiser 8:ee16c139e10b 65
jessekaiser 8:ee16c139e10b 66 // EMG Filters (settings en variabelen)
jessekaiser 8:ee16c139e10b 67
jessekaiser 8:ee16c139e10b 68 // Filters
jessekaiser 8:ee16c139e10b 69 arm_biquad_casd_df1_inst_f32 lowpass_biceps;
jessekaiser 8:ee16c139e10b 70 arm_biquad_casd_df1_inst_f32 lowpass_deltoid;
jessekaiser 8:ee16c139e10b 71 //lowpass filter settings: Fc = 2 Hz, Fs = 500 Hz, Gain = -3 dB
jessekaiser 8:ee16c139e10b 72 float lowpass_const[] = {0.00015514839749793376, 0.00031029679499586753, 0.00015514839749793376, 1.9644602512795832, -0.9650808448695751};
jessekaiser 0:db396b9f4b4c 73 //state values
jessekaiser 8:ee16c139e10b 74 float lowpass_biceps_states[4];
jessekaiser 8:ee16c139e10b 75 float lowpass_deltoid_states[4];
jessekaiser 8:ee16c139e10b 76 arm_biquad_casd_df1_inst_f32 highnotch_biceps;
jessekaiser 8:ee16c139e10b 77 arm_biquad_casd_df1_inst_f32 highnotch_deltoid;
jessekaiser 8:ee16c139e10b 78 //highpass filter settings: Fc = 10 Hz, Fs = 500 Hz, Gain = -3 dB, notch Fc = 50, Fs =500Hz, Gain = -3 dB
jessekaiser 8:ee16c139e10b 79 float highnotch_const[] = {0.9149684297741606, -1.8299368595483212, 0.9149684297741606, 1.8226935021735358, -0.8371802169231065 ,0.7063988100714527, -1.1429772843080923, 0.7063988100714527, 1.1429772843080923, -0.41279762014290533};
jessekaiser 0:db396b9f4b4c 80 //state values
jessekaiser 8:ee16c139e10b 81 float highnotch_biceps_states[8];
jessekaiser 8:ee16c139e10b 82 float highnotch_deltoid_states[8];
jessekaiser 2:39e1bde54e73 83
jessekaiser 2:39e1bde54e73 84 //De globale variabele voor het gefilterde EMG signaal
jessekaiser 2:39e1bde54e73 85 float filtered_biceps;
jessekaiser 2:39e1bde54e73 86 float filtered_deltoid;
jessekaiser 8:ee16c139e10b 87 float filtered_average_bi;
jessekaiser 8:ee16c139e10b 88 float filtered_average_del;
jessekaiser 0:db396b9f4b4c 89
jessekaiser 8:ee16c139e10b 90 //gemiddelde EMG waarden over 250 sample stappen
jessekaiser 8:ee16c139e10b 91 void average_biceps(float filtered_biceps,float *average)
jessekaiser 8:ee16c139e10b 92 {
jessekaiser 8:ee16c139e10b 93 static float total=0;
jessekaiser 8:ee16c139e10b 94 static float number=0;
jessekaiser 8:ee16c139e10b 95 total = total + filtered_biceps;
jessekaiser 8:ee16c139e10b 96 number = number + 1;
jessekaiser 8:ee16c139e10b 97 if ( number == 250) {
jessekaiser 8:ee16c139e10b 98 *average = total/250;
jessekaiser 8:ee16c139e10b 99 total = 0;
jessekaiser 8:ee16c139e10b 100 number = 0;
jessekaiser 8:ee16c139e10b 101 }
jessekaiser 8:ee16c139e10b 102 }
jessekaiser 1:099b19376f16 103
jessekaiser 8:ee16c139e10b 104 void average_deltoid(float filtered_input,float *average_output)
jessekaiser 8:ee16c139e10b 105 {
jessekaiser 8:ee16c139e10b 106 static float total=0;
jessekaiser 8:ee16c139e10b 107 static float number=0;
jessekaiser 8:ee16c139e10b 108 total = total + filtered_input;
jessekaiser 8:ee16c139e10b 109 number = number + 1;
jessekaiser 8:ee16c139e10b 110 if ( number == 250) {
jessekaiser 8:ee16c139e10b 111 *average_output = total/250;
jessekaiser 8:ee16c139e10b 112 total = 0;
jessekaiser 8:ee16c139e10b 113 number = 0;
jessekaiser 8:ee16c139e10b 114 }
jessekaiser 8:ee16c139e10b 115 }
jessekaiser 1:099b19376f16 116
jessekaiser 8:ee16c139e10b 117 // EMG looper
jessekaiser 0:db396b9f4b4c 118 void looper()
jessekaiser 0:db396b9f4b4c 119 {
jessekaiser 1:099b19376f16 120 /*variable to store value in*/
jessekaiser 2:39e1bde54e73 121 uint16_t emg_value1;
jessekaiser 3:0895fa0a6ca4 122 uint16_t emg_value2;
jessekaiser 1:099b19376f16 123
jessekaiser 2:39e1bde54e73 124 float emg_value1_f32;
jessekaiser 2:39e1bde54e73 125 float emg_value2_f32;
jessekaiser 0:db396b9f4b4c 126 /*put raw emg value both in red and in emg_value*/
jessekaiser 2:39e1bde54e73 127 emg_value1 = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
jessekaiser 2:39e1bde54e73 128 emg_value1_f32 = emg0.read();
jessekaiser 3:0895fa0a6ca4 129
jessekaiser 2:39e1bde54e73 130 emg_value2 = emg1.read_u16();
jessekaiser 2:39e1bde54e73 131 emg_value2_f32 = emg1.read();
jessekaiser 0:db396b9f4b4c 132
jessekaiser 2:39e1bde54e73 133 //process emg biceps
jessekaiser 8:ee16c139e10b 134 arm_biquad_cascade_df1_f32(&highnotch_biceps, &emg_value1_f32, &filtered_biceps, 1 );
jessekaiser 2:39e1bde54e73 135 filtered_biceps = fabs(filtered_biceps);
jessekaiser 8:ee16c139e10b 136 arm_biquad_cascade_df1_f32(&lowpass_biceps, &filtered_biceps, &filtered_biceps, 1 );
jessekaiser 8:ee16c139e10b 137 average_biceps(filtered_biceps,&filtered_average_bi);
jessekaiser 2:39e1bde54e73 138 //process emg deltoid
jessekaiser 8:ee16c139e10b 139 arm_biquad_cascade_df1_f32(&highnotch_deltoid, &emg_value2_f32, &filtered_deltoid, 1 );
jessekaiser 3:0895fa0a6ca4 140 filtered_deltoid = fabs(filtered_deltoid);
jessekaiser 8:ee16c139e10b 141 arm_biquad_cascade_df1_f32(&lowpass_deltoid, &filtered_deltoid, &filtered_deltoid, 1 );
jessekaiser 8:ee16c139e10b 142 average_deltoid(filtered_deltoid, &filtered_average_del);
jessekaiser 1:099b19376f16 143
jessekaiser 0:db396b9f4b4c 144 /*send value to PC. */
jessekaiser 8:ee16c139e10b 145 //scope.set(0,emg_value1); //Raw EMG signal biceps
jessekaiser 8:ee16c139e10b 146 //scope.set(1,emg_value2); //Raw EMG signal Deltoid
jessekaiser 8:ee16c139e10b 147 scope.set(0,filtered_biceps); //processed float biceps
jessekaiser 8:ee16c139e10b 148 scope.set(1,filtered_average_bi); //processed float deltoid
jessekaiser 8:ee16c139e10b 149 scope.set(2,filtered_deltoid); //processed float biceps
jessekaiser 8:ee16c139e10b 150 scope.set(3,filtered_average_del); //processed float deltoid
jessekaiser 0:db396b9f4b4c 151 scope.send();
jessekaiser 0:db396b9f4b4c 152
jessekaiser 0:db396b9f4b4c 153 }
jessekaiser 0:db396b9f4b4c 154
jessekaiser 8:ee16c139e10b 155 // LED AANSTURING
jessekaiser 8:ee16c139e10b 156
jessekaiser 0:db396b9f4b4c 157 void BlinkRed(int n)
jessekaiser 0:db396b9f4b4c 158 {
jessekaiser 0:db396b9f4b4c 159 for (int i=0; i<n; i++) {
jessekaiser 8:ee16c139e10b 160 myledred = 0;
jessekaiser 8:ee16c139e10b 161 myledgreen = 0;
jessekaiser 8:ee16c139e10b 162 myledblue = 0;
jessekaiser 3:0895fa0a6ca4 163 wait(0.1);
jessekaiser 8:ee16c139e10b 164 myledred = 1;
jessekaiser 8:ee16c139e10b 165 myledgreen = 0;
jessekaiser 8:ee16c139e10b 166 myledblue = 0;
jessekaiser 3:0895fa0a6ca4 167 wait(0.1);
jessekaiser 0:db396b9f4b4c 168 }
jessekaiser 0:db396b9f4b4c 169 }
jessekaiser 0:db396b9f4b4c 170
jessekaiser 8:ee16c139e10b 171 // Ticker voor groen knipperen, zodat tijdens dit knipperen presets gekozen kunnen worden
jessekaiser 8:ee16c139e10b 172 Ticker ledticker;
jessekaiser 8:ee16c139e10b 173
jessekaiser 8:ee16c139e10b 174 void greenblink()
jessekaiser 3:0895fa0a6ca4 175 {
jessekaiser 8:ee16c139e10b 176 if(myledgreen.read())
jessekaiser 8:ee16c139e10b 177 myledgreen = 0;
jessekaiser 8:ee16c139e10b 178 else
jessekaiser 8:ee16c139e10b 179 myledgreen = 1;
jessekaiser 8:ee16c139e10b 180 }
jessekaiser 8:ee16c139e10b 181
jessekaiser 8:ee16c139e10b 182 void BlinkGreen()
jessekaiser 8:ee16c139e10b 183 {
jessekaiser 8:ee16c139e10b 184 myledred= 0;
jessekaiser 8:ee16c139e10b 185 myledblue =0;
jessekaiser 8:ee16c139e10b 186 ledticker.attach(&greenblink,.5);
jessekaiser 8:ee16c139e10b 187 }
jessekaiser 3:0895fa0a6ca4 188
jessekaiser 8:ee16c139e10b 189 void stopblinkgreen()
jessekaiser 8:ee16c139e10b 190 {
jessekaiser 8:ee16c139e10b 191 ledticker.detach();
jessekaiser 8:ee16c139e10b 192 }
jessekaiser 8:ee16c139e10b 193
jessekaiser 8:ee16c139e10b 194 // Groen schijnen
jessekaiser 8:ee16c139e10b 195 void ShineGreen ()
jessekaiser 8:ee16c139e10b 196 {
jessekaiser 8:ee16c139e10b 197 myledred = 0;
jessekaiser 8:ee16c139e10b 198 myledgreen = 1;
jessekaiser 8:ee16c139e10b 199 myledblue = 0;
jessekaiser 8:ee16c139e10b 200 }
jessekaiser 8:ee16c139e10b 201
jessekaiser 8:ee16c139e10b 202 // Blauw schijnen
jessekaiser 8:ee16c139e10b 203 void ShineBlue ()
jessekaiser 8:ee16c139e10b 204 {
jessekaiser 8:ee16c139e10b 205 myledred = 0;
jessekaiser 8:ee16c139e10b 206 myledgreen = 0;
jessekaiser 8:ee16c139e10b 207 myledblue = 1;
jessekaiser 3:0895fa0a6ca4 208 }
jessekaiser 3:0895fa0a6ca4 209
jessekaiser 8:ee16c139e10b 210 // Rood schijnen
jessekaiser 8:ee16c139e10b 211 void ShineRed ()
jessekaiser 8:ee16c139e10b 212 {
jessekaiser 8:ee16c139e10b 213 myledred = 1;
jessekaiser 8:ee16c139e10b 214 myledgreen = 0;
jessekaiser 8:ee16c139e10b 215 myledblue = 0;
jessekaiser 8:ee16c139e10b 216 }
jessekaiser 3:0895fa0a6ca4 217
jessekaiser 8:ee16c139e10b 218 // MOTORFUNCTIES
jessekaiser 8:ee16c139e10b 219
jessekaiser 8:ee16c139e10b 220 // Motor1 = batje
jessekaiser 8:ee16c139e10b 221 // Motor2 = arm
jessekaiser 8:ee16c139e10b 222
jessekaiser 8:ee16c139e10b 223 void clamp(float* in, float min, float max) //Clamp geeft een maximum en minimum limiet aan een functie
jessekaiser 8:ee16c139e10b 224 {
jessekaiser 8:ee16c139e10b 225 *in > min ? /*(*/*in < max? : *in = max : *in = min;
jessekaiser 8:ee16c139e10b 226 }
jessekaiser 8:ee16c139e10b 227
jessekaiser 8:ee16c139e10b 228 // PI-regelaar motor1: batje
jessekaiser 8:ee16c139e10b 229 float pid1(float setpoint1, float measurement1)
jessekaiser 2:39e1bde54e73 230 {
jessekaiser 8:ee16c139e10b 231 float error1;
jessekaiser 8:ee16c139e10b 232 float out_p1 = 0;
jessekaiser 8:ee16c139e10b 233 static float out_i1 = 0;
jessekaiser 8:ee16c139e10b 234 error1 = (setpoint1 - measurement1);
jessekaiser 8:ee16c139e10b 235 out_p1 = error1*K_P1;
jessekaiser 8:ee16c139e10b 236 out_i1 += error1*K_I1;
jessekaiser 8:ee16c139e10b 237 clamp(&out_i1,-I_LIMIT,I_LIMIT);
jessekaiser 8:ee16c139e10b 238 return out_p1 + out_i1;
jessekaiser 8:ee16c139e10b 239 }
jessekaiser 8:ee16c139e10b 240
jessekaiser 8:ee16c139e10b 241 // PI-regelaar motor2: arm
jessekaiser 8:ee16c139e10b 242 float pid2(float setpoint2, float measurement2)
jessekaiser 8:ee16c139e10b 243 {
jessekaiser 8:ee16c139e10b 244 float error2;
jessekaiser 8:ee16c139e10b 245 float out_p2 = 0;
jessekaiser 8:ee16c139e10b 246 static float out_i2 = 0;
jessekaiser 8:ee16c139e10b 247 error2 = (setpoint2 - measurement2);
jessekaiser 8:ee16c139e10b 248 out_p2 = error2*K_P2;
jessekaiser 8:ee16c139e10b 249 out_i2 += error2*K_I2;
jessekaiser 8:ee16c139e10b 250 clamp(&out_i2,-I_LIMIT,I_LIMIT);
jessekaiser 8:ee16c139e10b 251 return out_p2 + out_i2;
jessekaiser 2:39e1bde54e73 252 }
jessekaiser 2:39e1bde54e73 253
jessekaiser 8:ee16c139e10b 254 // Variabelen
jessekaiser 8:ee16c139e10b 255 float prev_setpoint1 = 0;
jessekaiser 8:ee16c139e10b 256 float setpoint1 = 0;
jessekaiser 8:ee16c139e10b 257 float prev_setpoint2 = 0;
jessekaiser 8:ee16c139e10b 258 float setpoint2 = 0;
jessekaiser 8:ee16c139e10b 259
jessekaiser 8:ee16c139e10b 260 // Functies motoren
jessekaiser 1:099b19376f16 261
jessekaiser 8:ee16c139e10b 262 // Motor1 links draaien
jessekaiser 8:ee16c139e10b 263 void batje_links ()
jessekaiser 8:ee16c139e10b 264 {
jessekaiser 8:ee16c139e10b 265 speed1_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht)
jessekaiser 8:ee16c139e10b 266 setpoint1 = prev_setpoint1 + TSAMP * speed1_rad; //bepalen van de setpoint
jessekaiser 8:ee16c139e10b 267 if(setpoint1 > (11.3*2.3*2.0*PI/360)) { //Het eerste getal geeft een aantal graden weer, dus alleen dit hoeft aangepast te worden/
jessekaiser 8:ee16c139e10b 268 setpoint1 = (11.3*2.3*2.0*PI/360); //Hier wordt er een grens bepaald voor de hoek.
jessekaiser 8:ee16c139e10b 269 }
jessekaiser 8:ee16c139e10b 270 if(setpoint1 < -(11.3*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 271 setpoint1 = -(11.3*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 272 }
jessekaiser 8:ee16c139e10b 273 if(setpoint1 <= -(11.3*2.3*2.0*PI/360)-0.1) {
jessekaiser 8:ee16c139e10b 274 staat1 = 1;
jessekaiser 8:ee16c139e10b 275 prev_setpoint1 = setpoint1;
jessekaiser 8:ee16c139e10b 276 }
jessekaiser 8:ee16c139e10b 277 }
jessekaiser 8:ee16c139e10b 278 // Motor1 rechts draaien
jessekaiser 8:ee16c139e10b 279 void batje_rechts () {
jessekaiser 8:ee16c139e10b 280 speed1_rad = 1.0;
jessekaiser 8:ee16c139e10b 281 setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
jessekaiser 8:ee16c139e10b 282 if(setpoint1 > (11.3*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 283 setpoint1 = (11.3*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 284 }
jessekaiser 8:ee16c139e10b 285 if(setpoint1 < -(11.3*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 286 setpoint1 = -(11.3*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 287 }
jessekaiser 8:ee16c139e10b 288 prev_setpoint1 = setpoint1;
jessekaiser 8:ee16c139e10b 289 if(setpoint1 >= (11.3*2.3*2.0*PI/360)-0.1) {
jessekaiser 8:ee16c139e10b 290 staat1 = 1;
jessekaiser 8:ee16c139e10b 291 }
jessekaiser 8:ee16c139e10b 292 }
jessekaiser 0:db396b9f4b4c 293
jessekaiser 8:ee16c139e10b 294 //Motor1 na links draaien weer terug laten draaien naar beginstand
jessekaiser 8:ee16c139e10b 295 void batje_begin_links () {
jessekaiser 8:ee16c139e10b 296 speed1_rad = 1.0;
jessekaiser 8:ee16c139e10b 297 setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
jessekaiser 8:ee16c139e10b 298 if(setpoint1 > (0*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 299 setpoint1 = (0*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 300 }
jessekaiser 8:ee16c139e10b 301 if(setpoint1 < -(0*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 302 setpoint1 = -(0*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 303 }
jessekaiser 8:ee16c139e10b 304 prev_setpoint1 = setpoint1;
jessekaiser 8:ee16c139e10b 305 }
jessekaiser 8:ee16c139e10b 306
jessekaiser 8:ee16c139e10b 307 //Motor1 na links draaien weer terug laten draaien naar beginstand
jessekaiser 8:ee16c139e10b 308 void batje_begin_rechts () {
jessekaiser 8:ee16c139e10b 309 speed1_rad = -1.0;
jessekaiser 8:ee16c139e10b 310 setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
jessekaiser 8:ee16c139e10b 311 if(setpoint1 > (0*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 312 setpoint1 = (0*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 313 }
jessekaiser 8:ee16c139e10b 314 if(setpoint1 < -(0.0*2.3*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 315 setpoint1 = -(0.0*2.3*2.0*PI/360);
jessekaiser 8:ee16c139e10b 316 }
jessekaiser 8:ee16c139e10b 317 prev_setpoint1 = setpoint1;
jessekaiser 8:ee16c139e10b 318 }
jessekaiser 8:ee16c139e10b 319
jessekaiser 8:ee16c139e10b 320 // Motor2 balletje op zn hoogst slaan
jessekaiser 8:ee16c139e10b 321 void arm_hoog () {
jessekaiser 8:ee16c139e10b 322 speed2_rad = 6.0;
jessekaiser 8:ee16c139e10b 323 setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
jessekaiser 8:ee16c139e10b 324 if(setpoint2 > (155.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 325 setpoint2 = (155.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 326 }
jessekaiser 8:ee16c139e10b 327 if(setpoint2 < -(155.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 328 setpoint2 = -(155.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 329 }
jessekaiser 8:ee16c139e10b 330 prev_setpoint2 = setpoint2;
jessekaiser 8:ee16c139e10b 331 if(setpoint2 >= (155.0*2.0*PI/360)-0.1) {
jessekaiser 8:ee16c139e10b 332 staat2 = 1;
jessekaiser 8:ee16c139e10b 333 }
jessekaiser 8:ee16c139e10b 334 }
jessekaiser 6:8f4138a811e0 335
jessekaiser 8:ee16c139e10b 336 // Motor2 balletje in het midden slaan
jessekaiser 8:ee16c139e10b 337 void arm_mid () {
jessekaiser 8:ee16c139e10b 338 speed2_rad = 4.0;
jessekaiser 8:ee16c139e10b 339 setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
jessekaiser 8:ee16c139e10b 340 if(setpoint2 > (155.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 341 setpoint2 = (155.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 342 }
jessekaiser 8:ee16c139e10b 343 if(setpoint2 < -(155.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 344 setpoint2 = -(155.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 345 }
jessekaiser 8:ee16c139e10b 346 prev_setpoint2 = setpoint2;
jessekaiser 8:ee16c139e10b 347 if(setpoint2 >= (155.0*2.0*PI/360)-0.1) {
jessekaiser 8:ee16c139e10b 348 staat2 = 1;
jessekaiser 8:ee16c139e10b 349 }
jessekaiser 8:ee16c139e10b 350 }
jessekaiser 8:ee16c139e10b 351
jessekaiser 8:ee16c139e10b 352 // Motor2 balletje op het laagst slaan
jessekaiser 8:ee16c139e10b 353 void arm_laag () {
jessekaiser 8:ee16c139e10b 354 speed2_rad = 2.0;
jessekaiser 8:ee16c139e10b 355 setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
jessekaiser 8:ee16c139e10b 356 if(setpoint2 > (155*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 357 setpoint2 = (155*2.0*PI/360);
jessekaiser 8:ee16c139e10b 358 }
jessekaiser 8:ee16c139e10b 359 if(setpoint2 < -(155.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 360 setpoint2 = -(155.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 361 }
jessekaiser 8:ee16c139e10b 362 prev_setpoint2 = setpoint2;
jessekaiser 8:ee16c139e10b 363 if(setpoint2 >= (155.0*2.0*PI/360)-0.1) {
jessekaiser 8:ee16c139e10b 364 staat2 = 1;
jessekaiser 8:ee16c139e10b 365 }
jessekaiser 8:ee16c139e10b 366 }
jessekaiser 8:ee16c139e10b 367
jessekaiser 8:ee16c139e10b 368 // Motor2 arm terug zetten in beginstand
jessekaiser 8:ee16c139e10b 369 void arm_begin () {
jessekaiser 8:ee16c139e10b 370 speed2_rad = 1.0;
jessekaiser 8:ee16c139e10b 371 setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
jessekaiser 8:ee16c139e10b 372 if(setpoint2 > (0.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 373 setpoint2 = (0.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 374 }
jessekaiser 8:ee16c139e10b 375 if(setpoint2 < -(0.0*2.0*PI/360)) {
jessekaiser 8:ee16c139e10b 376 setpoint2 = -(0.0*2.0*PI/360);
jessekaiser 8:ee16c139e10b 377 }
jessekaiser 8:ee16c139e10b 378 prev_setpoint2 = setpoint2;
jessekaiser 8:ee16c139e10b 379 }
jessekaiser 8:ee16c139e10b 380
jessekaiser 8:ee16c139e10b 381 // MOTOR aansturing
jessekaiser 8:ee16c139e10b 382 void looper_motor() {
jessekaiser 8:ee16c139e10b 383 pc.printf("%d, %f \r\n", motor1.getPosition(), motor2.getPosition()); //Geeft de posities weer van beide motoren met een sample frequentie van 0.005
jessekaiser 0:db396b9f4b4c 384
jessekaiser 8:ee16c139e10b 385 //MOTOR1
jessekaiser 8:ee16c139e10b 386 \
jessekaiser 8:ee16c139e10b 387 cur_pos_motor1 = motor1.getPosition();
jessekaiser 8:ee16c139e10b 388 pos_motor1_rad = (float)cur_pos_motor1/(4128.0/(2.0*PI)); //voor 1 rotatie van de motoras geldt 24(aantal cpr vd encoder)*172(gearbox ratio)=4128 counts.
jessekaiser 8:ee16c139e10b 389 pwm_out1 = pid1(setpoint1, pos_motor1_rad);
jessekaiser 8:ee16c139e10b 390 if (pwm_out1 < -1.0) { //Hier wordt de grens voor de pwm waarde ingesteld.
jessekaiser 8:ee16c139e10b 391 pwm_out1 = -1.0;
jessekaiser 8:ee16c139e10b 392 }
jessekaiser 8:ee16c139e10b 393 if (pwm_out1 > 1.0) {
jessekaiser 8:ee16c139e10b 394 pwm_out1 = 1.0;
jessekaiser 8:ee16c139e10b 395 }
jessekaiser 8:ee16c139e10b 396 pwm_motor1.write(abs(pwm_out1));
jessekaiser 8:ee16c139e10b 397 if(pwm_out1 > 0) {
jessekaiser 8:ee16c139e10b 398 motordir1 = 0;
jessekaiser 8:ee16c139e10b 399 } else {
jessekaiser 8:ee16c139e10b 400 motordir1 = 1;
jessekaiser 8:ee16c139e10b 401 }
jessekaiser 6:8f4138a811e0 402
jessekaiser 8:ee16c139e10b 403 //MOTOR2
jessekaiser 8:ee16c139e10b 404 cur_pos_motor2 = motor2.getPosition();
jessekaiser 8:ee16c139e10b 405 pos_motor2_rad = (float)cur_pos_motor2/(3200.0/(2.0*PI));
jessekaiser 8:ee16c139e10b 406 pwm_out2 = pid2(setpoint2, pos_motor2_rad); //
jessekaiser 8:ee16c139e10b 407 if (pwm_out2 < -1.0) {
jessekaiser 8:ee16c139e10b 408 pwm_out2 = -1.0;
jessekaiser 8:ee16c139e10b 409 }
jessekaiser 8:ee16c139e10b 410 if (pwm_out2 > 1.0) {
jessekaiser 8:ee16c139e10b 411 pwm_out2 = 1.0;
jessekaiser 8:ee16c139e10b 412 }
jessekaiser 8:ee16c139e10b 413 pwm_motor2.write(abs(pwm_out2));
jessekaiser 8:ee16c139e10b 414 if(pwm_out2 > 0) {
jessekaiser 8:ee16c139e10b 415 motordir2 = 0;
jessekaiser 8:ee16c139e10b 416 } else {
jessekaiser 8:ee16c139e10b 417 motordir2 = 1;
jessekaiser 8:ee16c139e10b 418 }
jessekaiser 8:ee16c139e10b 419
jessekaiser 8:ee16c139e10b 420
jessekaiser 8:ee16c139e10b 421 //STATES
jessekaiser 8:ee16c139e10b 422
jessekaiser 8:ee16c139e10b 423 //Het batje draait naar opgegeven positie, doet dan een bepaalde tijd niks (wait_iterator), en draait daarna weer terug
jessekaiser 8:ee16c139e10b 424 if (batje_hoek == 1) {
jessekaiser 8:ee16c139e10b 425 if(staat1 == 0) {
jessekaiser 8:ee16c139e10b 426 batje_rechts();
jessekaiser 8:ee16c139e10b 427 wait_iterator1 = 0;
jessekaiser 8:ee16c139e10b 428 } else if(staat1 ==1) {
jessekaiser 8:ee16c139e10b 429 wait_iterator1++;
jessekaiser 8:ee16c139e10b 430 if(wait_iterator1 > 1200) {
jessekaiser 8:ee16c139e10b 431 staat1 = 2;
jessekaiser 8:ee16c139e10b 432
jessekaiser 8:ee16c139e10b 433 batje_begin_rechts();
jessekaiser 0:db396b9f4b4c 434 }
jessekaiser 0:db396b9f4b4c 435 }
jessekaiser 0:db396b9f4b4c 436 }
jessekaiser 8:ee16c139e10b 437 if (batje_hoek == 2) {
jessekaiser 8:ee16c139e10b 438 if(staat1 == 0) {
jessekaiser 8:ee16c139e10b 439 batje_links();
jessekaiser 8:ee16c139e10b 440 wait_iterator1 = 0;
jessekaiser 8:ee16c139e10b 441 } else if(staat1 ==1) {
jessekaiser 8:ee16c139e10b 442 wait_iterator1++;
jessekaiser 8:ee16c139e10b 443 if(wait_iterator1 > 1200) {
jessekaiser 8:ee16c139e10b 444 staat1 = 2;
jessekaiser 8:ee16c139e10b 445
jessekaiser 8:ee16c139e10b 446 batje_begin_links ();
jessekaiser 8:ee16c139e10b 447 }
jessekaiser 8:ee16c139e10b 448 }
jessekaiser 8:ee16c139e10b 449 }
jessekaiser 8:ee16c139e10b 450
jessekaiser 8:ee16c139e10b 451 if(arm_hoogte == 1) {
jessekaiser 8:ee16c139e10b 452 if(staat2 == 0) {
jessekaiser 8:ee16c139e10b 453 arm_laag();
jessekaiser 8:ee16c139e10b 454 wait_iterator2 = 0;
jessekaiser 8:ee16c139e10b 455 } else if(staat2 == 1) {
jessekaiser 8:ee16c139e10b 456 wait_iterator2++;
jessekaiser 8:ee16c139e10b 457 if(wait_iterator2 > 400) {
jessekaiser 8:ee16c139e10b 458 staat2 = 2;
jessekaiser 8:ee16c139e10b 459
jessekaiser 8:ee16c139e10b 460 arm_begin();
jessekaiser 8:ee16c139e10b 461 }
jessekaiser 8:ee16c139e10b 462 }
jessekaiser 8:ee16c139e10b 463 }
jessekaiser 8:ee16c139e10b 464 if(arm_hoogte == 2) {
jessekaiser 8:ee16c139e10b 465 if(staat2 == 0) {
jessekaiser 8:ee16c139e10b 466 arm_mid();
jessekaiser 8:ee16c139e10b 467 wait_iterator2 = 0;
jessekaiser 8:ee16c139e10b 468 } else if(staat2 == 1) {
jessekaiser 8:ee16c139e10b 469 wait_iterator2++;
jessekaiser 8:ee16c139e10b 470 if(wait_iterator2 > 400) {
jessekaiser 8:ee16c139e10b 471 staat2 = 2;
jessekaiser 8:ee16c139e10b 472
jessekaiser 8:ee16c139e10b 473 arm_begin();
jessekaiser 8:ee16c139e10b 474 }
jessekaiser 8:ee16c139e10b 475 }
jessekaiser 8:ee16c139e10b 476 }
jessekaiser 8:ee16c139e10b 477 if(arm_hoogte == 3) {
jessekaiser 8:ee16c139e10b 478 if(staat2 == 0) {
jessekaiser 8:ee16c139e10b 479 arm_hoog();
jessekaiser 8:ee16c139e10b 480 wait_iterator2 = 0;
jessekaiser 8:ee16c139e10b 481 } else if(staat2 == 1) {
jessekaiser 8:ee16c139e10b 482 wait_iterator2++;
jessekaiser 8:ee16c139e10b 483 if(wait_iterator2 > 400) {
jessekaiser 8:ee16c139e10b 484 staat2 = 2;
jessekaiser 8:ee16c139e10b 485
jessekaiser 8:ee16c139e10b 486 arm_begin();
jessekaiser 8:ee16c139e10b 487 }
jessekaiser 8:ee16c139e10b 488 }
jessekaiser 8:ee16c139e10b 489 }
jessekaiser 8:ee16c139e10b 490
jessekaiser 0:db396b9f4b4c 491 }
jessekaiser 8:ee16c139e10b 492
jessekaiser 8:ee16c139e10b 493
jessekaiser 8:ee16c139e10b 494 // Hoofdprogramma, hierin staat de aansturing vd LED
jessekaiser 8:ee16c139e10b 495 int main() {
jessekaiser 8:ee16c139e10b 496
jessekaiser 8:ee16c139e10b 497 pwm_motor1.period_us(100);
jessekaiser 8:ee16c139e10b 498 motor1.setPosition(0);
jessekaiser 8:ee16c139e10b 499 pwm_motor2.period_us(100);
jessekaiser 8:ee16c139e10b 500 motor2.setPosition(0);
jessekaiser 8:ee16c139e10b 501 pc.baud(115200);
jessekaiser 8:ee16c139e10b 502 // Ticker EMG signaal meten
jessekaiser 8:ee16c139e10b 503 Ticker log_timer;
jessekaiser 8:ee16c139e10b 504 //set up filters. Use external array for constants
jessekaiser 8:ee16c139e10b 505 arm_biquad_cascade_df1_init_f32(&lowpass_biceps,1 , lowpass_const, lowpass_biceps_states);
jessekaiser 8:ee16c139e10b 506 arm_biquad_cascade_df1_init_f32(&lowpass_deltoid,1 , lowpass_const, lowpass_deltoid_states);
jessekaiser 8:ee16c139e10b 507 arm_biquad_cascade_df1_init_f32(&highnotch_biceps,2 ,highnotch_const,highnotch_biceps_states);
jessekaiser 8:ee16c139e10b 508 arm_biquad_cascade_df1_init_f32(&highnotch_deltoid,2 ,highnotch_const,highnotch_deltoid_states);
jessekaiser 8:ee16c139e10b 509 // Uitvoeren van ticker EMG, sample frequentie 500Hz
jessekaiser 8:ee16c139e10b 510 log_timer.attach(looper, 0.002);
jessekaiser 8:ee16c139e10b 511
jessekaiser 8:ee16c139e10b 512 // Aanroepen van motoraansturing in motor ticker
jessekaiser 8:ee16c139e10b 513 Ticker looptimer;
jessekaiser 8:ee16c139e10b 514 looptimer.attach(looper_motor,TSAMP);
jessekaiser 8:ee16c139e10b 515
jessekaiser 8:ee16c139e10b 516 while(1) {
jessekaiser 8:ee16c139e10b 517
jessekaiser 8:ee16c139e10b 518 while(1) {
jessekaiser 8:ee16c139e10b 519 pc.printf("Span de biceps aan om het instellen te starten.\n");
jessekaiser 8:ee16c139e10b 520 do {
jessekaiser 8:ee16c139e10b 521 ShineRed();
jessekaiser 8:ee16c139e10b 522 } while(filtered_average_bi < 0.05 && filtered_average_del <0.05); // In rust, geen meting
jessekaiser 8:ee16c139e10b 523 if (filtered_average_bi > 0.05) { // Beginnen met meting wanneer biceps wordt aangespannen
jessekaiser 8:ee16c139e10b 524 BlinkRed(10); // 2 seconden rood knipperen, geen signaal verwerking
jessekaiser 8:ee16c139e10b 525 BlinkGreen(); // groen knipperen, meten van spieraanspanning
jessekaiser 8:ee16c139e10b 526 while (1) { // eerste loop, keuze voor de positie van het batje
jessekaiser 8:ee16c139e10b 527 pc.printf("In de loop.\n");
jessekaiser 8:ee16c139e10b 528 if (filtered_average_bi > 0.05 && filtered_average_del > 0.045) { //bi en del aangespannen --> batje in het midden
jessekaiser 8:ee16c139e10b 529 stopblinkgreen();
jessekaiser 8:ee16c139e10b 530 pc.printf("ShineGreen.\n");
jessekaiser 8:ee16c139e10b 531 ShineGreen();
jessekaiser 8:ee16c139e10b 532 wait (4);
jessekaiser 8:ee16c139e10b 533 break;
jessekaiser 8:ee16c139e10b 534 }
jessekaiser 8:ee16c139e10b 535 if (filtered_average_bi < 0.05 && filtered_average_del > 0.045) { // del aanspannen --> batje naar links
jessekaiser 8:ee16c139e10b 536 stopblinkgreen();
jessekaiser 8:ee16c139e10b 537 pc.printf("ShineBlue.\n");
jessekaiser 8:ee16c139e10b 538 ShineBlue();
jessekaiser 8:ee16c139e10b 539 batje_hoek = 2;
jessekaiser 8:ee16c139e10b 540 wait(4);
jessekaiser 8:ee16c139e10b 541 break;
jessekaiser 8:ee16c139e10b 542 } else if (filtered_average_bi > 0.05 && filtered_average_del < 0.045) { // bi aanspannen --> batje naar rechts
jessekaiser 8:ee16c139e10b 543 stopblinkgreen();
jessekaiser 8:ee16c139e10b 544 pc.printf("ShineRed.\n");
jessekaiser 8:ee16c139e10b 545 ShineRed();
jessekaiser 8:ee16c139e10b 546 batje_hoek = 1;
jessekaiser 8:ee16c139e10b 547 wait (4);
jessekaiser 8:ee16c139e10b 548 break;
jessekaiser 8:ee16c139e10b 549 }
jessekaiser 8:ee16c139e10b 550 }
jessekaiser 8:ee16c139e10b 551 BlinkGreen();
jessekaiser 8:ee16c139e10b 552 while (1) { // loop voor het instellen van de kracht
jessekaiser 8:ee16c139e10b 553 pc.printf("In de loop.\n");
jessekaiser 8:ee16c139e10b 554 if (filtered_average_bi > 0.05 && filtered_average_del > 0.045) { // bi en del aanspannen --> hoog slaan
jessekaiser 8:ee16c139e10b 555 stopblinkgreen();
jessekaiser 8:ee16c139e10b 556 pc.printf("ShineGreen.\n");
jessekaiser 8:ee16c139e10b 557 ShineGreen();
jessekaiser 8:ee16c139e10b 558 arm_hoogte = 3;
jessekaiser 8:ee16c139e10b 559 wait (4);
jessekaiser 8:ee16c139e10b 560 break;
jessekaiser 8:ee16c139e10b 561 }
jessekaiser 8:ee16c139e10b 562 if (filtered_average_bi < 0.05 && filtered_average_del > 0.045) { // del aanspannen --> laag slaan
jessekaiser 8:ee16c139e10b 563 stopblinkgreen();
jessekaiser 8:ee16c139e10b 564 pc.printf("ShineBlue.\n");
jessekaiser 8:ee16c139e10b 565 ShineBlue();
jessekaiser 8:ee16c139e10b 566 arm_hoogte = 1;
jessekaiser 8:ee16c139e10b 567 wait(4);
jessekaiser 8:ee16c139e10b 568 break;
jessekaiser 8:ee16c139e10b 569 } else if (filtered_average_bi > 0.05 && filtered_average_del < 0.045) { // bi aanspannen --> midden slaan
jessekaiser 8:ee16c139e10b 570 stopblinkgreen();
jessekaiser 8:ee16c139e10b 571 pc.printf("ShineRed.\n");
jessekaiser 8:ee16c139e10b 572 ShineRed();
jessekaiser 8:ee16c139e10b 573 arm_hoogte = 2;
jessekaiser 8:ee16c139e10b 574 wait (4);
jessekaiser 8:ee16c139e10b 575 break;
jessekaiser 8:ee16c139e10b 576 }
jessekaiser 8:ee16c139e10b 577 }
jessekaiser 8:ee16c139e10b 578
jessekaiser 8:ee16c139e10b 579 }
jessekaiser 8:ee16c139e10b 580
jessekaiser 8:ee16c139e10b 581 }
jessekaiser 8:ee16c139e10b 582 }
jessekaiser 8:ee16c139e10b 583 }