Chris Verhoeven / Mbed 2 deprecated Filter

Dependencies:   HIDScope MODSERIAL biquadFilter mbed

Fork of Filter by Rick Koetsier

Committer:
aluminium
Date:
Tue Oct 31 13:41:07 2017 +0000
Revision:
5:7c8176cdaa1c
Parent:
4:285fb7d84088
Child:
6:b9a84c1cb4f9
Chris Versie

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DAkoetsier 2:8f6fca2179f2 1 #include "mbed.h"
DAkoetsier 2:8f6fca2179f2 2 #include "HIDScope.h" //require the HIDScope library
DAkoetsier 2:8f6fca2179f2 3 #include "MODSERIAL.h"
DAkoetsier 2:8f6fca2179f2 4 #include "BiQuad.h"
aluminium 5:7c8176cdaa1c 5 # include "math.h"
DAkoetsier 2:8f6fca2179f2 6
DAkoetsier 2:8f6fca2179f2 7 // DEFINING
DAkoetsier 2:8f6fca2179f2 8 //Define Inputs
DAkoetsier 2:8f6fca2179f2 9 AnalogIn emg(A0); //analog of EMG input
DAkoetsier 2:8f6fca2179f2 10 InterruptIn button1(PTA4); //test button for starting motor 1
DAkoetsier 2:8f6fca2179f2 11 InterruptIn button2(SW2); //FOR DEBUGGING
DAkoetsier 2:8f6fca2179f2 12
DAkoetsier 2:8f6fca2179f2 13 //Define Outputs
DAkoetsier 2:8f6fca2179f2 14 DigitalOut led1(LED_RED);
DAkoetsier 2:8f6fca2179f2 15 DigitalOut led2(LED_BLUE);
DAkoetsier 2:8f6fca2179f2 16 DigitalOut led3(LED_GREEN); //FOR DEBUGGING
DAkoetsier 2:8f6fca2179f2 17 MODSERIAL pc(USBTX,USBRX);
DAkoetsier 2:8f6fca2179f2 18
DAkoetsier 2:8f6fca2179f2 19
DAkoetsier 2:8f6fca2179f2 20 //Define Tickers
DAkoetsier 2:8f6fca2179f2 21 Ticker sample_timer; // Taking samples
DAkoetsier 2:8f6fca2179f2 22 Ticker LED_timer; // Write the LED
DAkoetsier 2:8f6fca2179f2 23 Ticker calibration_timer; // Check when to start calibration
aluminium 5:7c8176cdaa1c 24
DAkoetsier 2:8f6fca2179f2 25
DAkoetsier 2:8f6fca2179f2 26 //Define HIDscope
aluminium 4:285fb7d84088 27 //HIDScope scope(2); //instantize a 2-channel HIDScope object
DAkoetsier 2:8f6fca2179f2 28
DAkoetsier 2:8f6fca2179f2 29
DAkoetsier 2:8f6fca2179f2 30 //Define filters and define the floats which contains the values.
DAkoetsier 2:8f6fca2179f2 31 BiQuadChain bqc;
DAkoetsier 2:8f6fca2179f2 32 BiQuad bq1_low(1.34871e-3, 2.69742e-3, 1.34871e-3, -1.89346, 0.89885);
DAkoetsier 2:8f6fca2179f2 33 BiQuad bq2_high(0.96508, -1.93016, 0.96508, -1.92894, 0.93138);
DAkoetsier 2:8f6fca2179f2 34 BiQuad bq3_notch(0.91859, -1.82269, 0.91859, -1.82269, 0.83718);
DAkoetsier 2:8f6fca2179f2 35
aluminium 5:7c8176cdaa1c 36 double print;
DAkoetsier 2:8f6fca2179f2 37 double emgFiltered;
DAkoetsier 2:8f6fca2179f2 38 double filteredAbs;
DAkoetsier 2:8f6fca2179f2 39 double emg_value;
DAkoetsier 2:8f6fca2179f2 40 double onoffsignal;
aluminium 5:7c8176cdaa1c 41
aluminium 5:7c8176cdaa1c 42 bool check_calibration=0;
aluminium 5:7c8176cdaa1c 43 double avg_emg;
DAkoetsier 2:8f6fca2179f2 44
DAkoetsier 2:8f6fca2179f2 45 // FUNCTIONS
DAkoetsier 2:8f6fca2179f2 46 //function for filtering
DAkoetsier 2:8f6fca2179f2 47
DAkoetsier 2:8f6fca2179f2 48 void filter(){
aluminium 5:7c8176cdaa1c 49 if(check_calibration==1){
DAkoetsier 2:8f6fca2179f2 50
DAkoetsier 2:8f6fca2179f2 51 emg_value = emg.read();
DAkoetsier 2:8f6fca2179f2 52 emgFiltered = bqc.step( emg_value );
DAkoetsier 2:8f6fca2179f2 53 filteredAbs = abs( emgFiltered );
DAkoetsier 2:8f6fca2179f2 54
aluminium 5:7c8176cdaa1c 55 onoffsignal=filteredAbs/avg_emg; //divide the emg signal by the max EMG to calibrate the signal per person
aluminium 4:285fb7d84088 56 // scope.set(0,emg_value); //set emg signal to scope in channel 1
aluminium 4:285fb7d84088 57 // scope.set(1,onoffsignal); //set filtered signal to scope in channel 2
aluminium 4:285fb7d84088 58 // scope.send(); //send the signals to the scope
DAkoetsier 2:8f6fca2179f2 59 // pc.printf("emg signal %f, filtered signal %f \n",emg_value,onoffsignal);
DAkoetsier 2:8f6fca2179f2 60 }
DAkoetsier 2:8f6fca2179f2 61 }
DAkoetsier 2:8f6fca2179f2 62
DAkoetsier 2:8f6fca2179f2 63 //function to check the threshold
aluminium 5:7c8176cdaa1c 64 void check_emg(){
aluminium 5:7c8176cdaa1c 65 if(check_calibration==1){ //if signal passes threshold value, red light goes on
aluminium 5:7c8176cdaa1c 66 if(onoffsignal<=0.5){
DAkoetsier 2:8f6fca2179f2 67 led1.write(1);
DAkoetsier 2:8f6fca2179f2 68 led2.write(0);
DAkoetsier 2:8f6fca2179f2 69 }
aluminium 5:7c8176cdaa1c 70 else if(onoffsignal > 0.5){ //if signal does not pass threshold value, blue light goes on
DAkoetsier 2:8f6fca2179f2 71 led1.write(0);
DAkoetsier 2:8f6fca2179f2 72 led2.write(1);
DAkoetsier 2:8f6fca2179f2 73 }
DAkoetsier 2:8f6fca2179f2 74 }
DAkoetsier 2:8f6fca2179f2 75 }
DAkoetsier 2:8f6fca2179f2 76
DAkoetsier 2:8f6fca2179f2 77 //function to calibrate
aluminium 5:7c8176cdaa1c 78 int calibration(){
aluminium 5:7c8176cdaa1c 79 pc.printf("check1\n\r");
aluminium 5:7c8176cdaa1c 80
aluminium 5:7c8176cdaa1c 81 // if(button1.read()==false){
aluminium 5:7c8176cdaa1c 82
aluminium 5:7c8176cdaa1c 83
aluminium 5:7c8176cdaa1c 84
DAkoetsier 2:8f6fca2179f2 85 led3.write(0);
aluminium 5:7c8176cdaa1c 86
aluminium 5:7c8176cdaa1c 87 double signal_verzameling = 0;
aluminium 5:7c8176cdaa1c 88 for(int n =0; n<5000;n++){
DAkoetsier 2:8f6fca2179f2 89
aluminium 5:7c8176cdaa1c 90 //read for 5000 samples as calibration
aluminium 5:7c8176cdaa1c 91 emg_value = emg.read();
aluminium 5:7c8176cdaa1c 92 emgFiltered = bqc.step( emg_value );
aluminium 5:7c8176cdaa1c 93 filteredAbs = abs(emgFiltered);
aluminium 5:7c8176cdaa1c 94
aluminium 5:7c8176cdaa1c 95
aluminium 5:7c8176cdaa1c 96 // signal_verzameling[n]= filteredAbs;
aluminium 5:7c8176cdaa1c 97 signal_verzameling = signal_verzameling + filteredAbs ;
aluminium 5:7c8176cdaa1c 98 pc.printf("signal_verzameling = %f \n\r",filteredAbs);
aluminium 5:7c8176cdaa1c 99 wait(0.0005);
aluminium 5:7c8176cdaa1c 100 if (n == 4999){
aluminium 5:7c8176cdaa1c 101 avg_emg = signal_verzameling / n;
aluminium 5:7c8176cdaa1c 102 pc.printf("avg_emg = %f\n\r",avg_emg);
aluminium 5:7c8176cdaa1c 103 }
aluminium 5:7c8176cdaa1c 104 }
aluminium 5:7c8176cdaa1c 105
aluminium 5:7c8176cdaa1c 106 led3.write(1);
aluminium 5:7c8176cdaa1c 107 // double lengte_array = sizeof(signal_verzameling);
aluminium 5:7c8176cdaa1c 108 // pc.printf("lengte_array = %f\n\r",lengte_array);
aluminium 4:285fb7d84088 109
aluminium 5:7c8176cdaa1c 110 // for(int i = 0; i < lengte_array; i++){
aluminium 5:7c8176cdaa1c 111
aluminium 5:7c8176cdaa1c 112
aluminium 5:7c8176cdaa1c 113 // sum_array = sum_array + signal_verzameling[i] ;
aluminium 5:7c8176cdaa1c 114 // }
aluminium 5:7c8176cdaa1c 115 //avg_emg = sum_array / lengte_array;
aluminium 5:7c8176cdaa1c 116 // pc.printf("avg_emg = %f\n\r",avg_emg);
aluminium 4:285fb7d84088 117
aluminium 4:285fb7d84088 118
aluminium 4:285fb7d84088 119
aluminium 4:285fb7d84088 120
aluminium 5:7c8176cdaa1c 121 check_calibration=1;
DAkoetsier 2:8f6fca2179f2 122 led3.write(1);
aluminium 5:7c8176cdaa1c 123 // }
aluminium 5:7c8176cdaa1c 124 return 0;
DAkoetsier 2:8f6fca2179f2 125 }
DAkoetsier 2:8f6fca2179f2 126
DAkoetsier 2:8f6fca2179f2 127 // MAIN
DAkoetsier 2:8f6fca2179f2 128
DAkoetsier 2:8f6fca2179f2 129 int main(){
aluminium 5:7c8176cdaa1c 130 pc.baud(115200);
DAkoetsier 2:8f6fca2179f2 131
aluminium 5:7c8176cdaa1c 132 pc.printf("Lampjes zijn langs geweest");
DAkoetsier 2:8f6fca2179f2 133 led1.write(1);
DAkoetsier 2:8f6fca2179f2 134 led2.write(1);
DAkoetsier 2:8f6fca2179f2 135 led3.write(1);
DAkoetsier 2:8f6fca2179f2 136
aluminium 4:285fb7d84088 137
aluminium 4:285fb7d84088 138
DAkoetsier 2:8f6fca2179f2 139 bqc.add( &bq1_low ).add( &bq2_high ).add( &bq3_notch );
DAkoetsier 2:8f6fca2179f2 140
DAkoetsier 2:8f6fca2179f2 141 sample_timer.attach(&filter, 0.002); //continously execute the EMG reader and filter
aluminium 5:7c8176cdaa1c 142 LED_timer.attach(&check_emg, 0.002); //continously execute the motor controller
aluminium 5:7c8176cdaa1c 143 //calibration_timer.attach(&calibration, 0.002); //ticker to check if EMG is being calibrated
DAkoetsier 2:8f6fca2179f2 144 // pc.printf("%d",filteredAbs);
DAkoetsier 2:8f6fca2179f2 145
aluminium 5:7c8176cdaa1c 146 calibration();
DAkoetsier 2:8f6fca2179f2 147
DAkoetsier 2:8f6fca2179f2 148 while(1){ //while loop to keep system going
DAkoetsier 2:8f6fca2179f2 149
DAkoetsier 2:8f6fca2179f2 150 }
DAkoetsier 2:8f6fca2179f2 151 }