Chris Verhoeven / Mbed 2 deprecated Filter

Dependencies:   HIDScope MODSERIAL biquadFilter mbed

Fork of Filter by Rick Koetsier

Committer:
aluminium
Date:
Wed Nov 01 11:40:55 2017 +0000
Revision:
6:b9a84c1cb4f9
Parent:
5:7c8176cdaa1c
Child:
7:7c6a9bb2d30e
emg signal filters werken niet geweldig en hidscope doet het niet dus we weten niet waarom

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;
aluminium 6:b9a84c1cb4f9 32 BiQuad bq1_low(0.00182, 0.0036417, 0.0018208, -1.8764998, 0.883783);
aluminium 6:b9a84c1cb4f9 33 BiQuad bq2_high( 0.973868, -1.947737, 0.97386, -1.947737, 0.948429);
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 bool check_calibration=0;
aluminium 5:7c8176cdaa1c 42 double avg_emg;
DAkoetsier 2:8f6fca2179f2 43
DAkoetsier 2:8f6fca2179f2 44 // FUNCTIONS
DAkoetsier 2:8f6fca2179f2 45 //function for filtering
DAkoetsier 2:8f6fca2179f2 46
DAkoetsier 2:8f6fca2179f2 47 void filter(){
aluminium 5:7c8176cdaa1c 48 if(check_calibration==1){
DAkoetsier 2:8f6fca2179f2 49
aluminium 6:b9a84c1cb4f9 50
aluminium 6:b9a84c1cb4f9 51
aluminium 6:b9a84c1cb4f9 52
DAkoetsier 2:8f6fca2179f2 53 emg_value = emg.read();
DAkoetsier 2:8f6fca2179f2 54 emgFiltered = bqc.step( emg_value );
DAkoetsier 2:8f6fca2179f2 55 filteredAbs = abs( emgFiltered );
aluminium 6:b9a84c1cb4f9 56 if (avg_emg != 0){
aluminium 5:7c8176cdaa1c 57 onoffsignal=filteredAbs/avg_emg; //divide the emg signal by the max EMG to calibrate the signal per person
aluminium 6:b9a84c1cb4f9 58 }
aluminium 6:b9a84c1cb4f9 59 // scope.set(0,emg_value); //set emg signal to scope in channel 1
aluminium 6:b9a84c1cb4f9 60 //scope.set(1,onoffsignal); //set filtered signal to scope in channel 2
aluminium 6:b9a84c1cb4f9 61 // scope.send(); //send the signals to the scope
DAkoetsier 2:8f6fca2179f2 62 // pc.printf("emg signal %f, filtered signal %f \n",emg_value,onoffsignal);
DAkoetsier 2:8f6fca2179f2 63 }
DAkoetsier 2:8f6fca2179f2 64 }
DAkoetsier 2:8f6fca2179f2 65
DAkoetsier 2:8f6fca2179f2 66 //function to check the threshold
aluminium 6:b9a84c1cb4f9 67 void check_emg(){
aluminium 6:b9a84c1cb4f9 68 double filteredAbs_temp;
aluminium 6:b9a84c1cb4f9 69
aluminium 6:b9a84c1cb4f9 70 if(check_calibration==1){
aluminium 6:b9a84c1cb4f9 71 for( int i = 0; i<1000;i++){
aluminium 6:b9a84c1cb4f9 72 filter();
aluminium 6:b9a84c1cb4f9 73 filteredAbs_temp = filteredAbs_temp + onoffsignal;
aluminium 6:b9a84c1cb4f9 74 wait(0.0004);
aluminium 6:b9a84c1cb4f9 75 }
aluminium 6:b9a84c1cb4f9 76 filteredAbs_temp = filteredAbs_temp/1000;
aluminium 6:b9a84c1cb4f9 77 if(filteredAbs_temp<=0.55){ //if signal is lower then 0.5 the blue light goes on
aluminium 6:b9a84c1cb4f9 78 led1.write(1); //led 1 is rood en uit
aluminium 6:b9a84c1cb4f9 79 led2.write(0); //led 2 is blauw en aan
DAkoetsier 2:8f6fca2179f2 80 }
aluminium 6:b9a84c1cb4f9 81 else if(filteredAbs_temp > 0.55){ //if signal does not pass threshold value, blue light goes on
DAkoetsier 2:8f6fca2179f2 82 led1.write(0);
DAkoetsier 2:8f6fca2179f2 83 led2.write(1);
DAkoetsier 2:8f6fca2179f2 84 }
DAkoetsier 2:8f6fca2179f2 85 }
DAkoetsier 2:8f6fca2179f2 86 }
DAkoetsier 2:8f6fca2179f2 87
DAkoetsier 2:8f6fca2179f2 88 //function to calibrate
aluminium 5:7c8176cdaa1c 89 int calibration(){
aluminium 5:7c8176cdaa1c 90 pc.printf("check1\n\r");
aluminium 5:7c8176cdaa1c 91
aluminium 5:7c8176cdaa1c 92 // if(button1.read()==false){
aluminium 5:7c8176cdaa1c 93
aluminium 5:7c8176cdaa1c 94
aluminium 5:7c8176cdaa1c 95
DAkoetsier 2:8f6fca2179f2 96 led3.write(0);
aluminium 5:7c8176cdaa1c 97
aluminium 5:7c8176cdaa1c 98 double signal_verzameling = 0;
aluminium 5:7c8176cdaa1c 99 for(int n =0; n<5000;n++){
aluminium 6:b9a84c1cb4f9 100 filter();
aluminium 5:7c8176cdaa1c 101 //read for 5000 samples as calibration
aluminium 5:7c8176cdaa1c 102 emg_value = emg.read();
aluminium 5:7c8176cdaa1c 103 emgFiltered = bqc.step( emg_value );
aluminium 5:7c8176cdaa1c 104 filteredAbs = abs(emgFiltered);
aluminium 5:7c8176cdaa1c 105
aluminium 5:7c8176cdaa1c 106
aluminium 5:7c8176cdaa1c 107 // signal_verzameling[n]= filteredAbs;
aluminium 5:7c8176cdaa1c 108 signal_verzameling = signal_verzameling + filteredAbs ;
aluminium 6:b9a84c1cb4f9 109 wait(0.0004);
aluminium 6:b9a84c1cb4f9 110
aluminium 5:7c8176cdaa1c 111 if (n == 4999){
aluminium 5:7c8176cdaa1c 112 avg_emg = signal_verzameling / n;
aluminium 5:7c8176cdaa1c 113 pc.printf("avg_emg = %f\n\r",avg_emg);
aluminium 5:7c8176cdaa1c 114 }
aluminium 5:7c8176cdaa1c 115 }
aluminium 5:7c8176cdaa1c 116
aluminium 5:7c8176cdaa1c 117 led3.write(1);
aluminium 5:7c8176cdaa1c 118 // double lengte_array = sizeof(signal_verzameling);
aluminium 5:7c8176cdaa1c 119 // pc.printf("lengte_array = %f\n\r",lengte_array);
aluminium 4:285fb7d84088 120
aluminium 5:7c8176cdaa1c 121 // for(int i = 0; i < lengte_array; i++){
aluminium 5:7c8176cdaa1c 122
aluminium 5:7c8176cdaa1c 123
aluminium 5:7c8176cdaa1c 124 // sum_array = sum_array + signal_verzameling[i] ;
aluminium 5:7c8176cdaa1c 125 // }
aluminium 5:7c8176cdaa1c 126 //avg_emg = sum_array / lengte_array;
aluminium 5:7c8176cdaa1c 127 // pc.printf("avg_emg = %f\n\r",avg_emg);
aluminium 4:285fb7d84088 128
aluminium 4:285fb7d84088 129
aluminium 4:285fb7d84088 130
aluminium 4:285fb7d84088 131
aluminium 5:7c8176cdaa1c 132 check_calibration=1;
DAkoetsier 2:8f6fca2179f2 133 led3.write(1);
aluminium 5:7c8176cdaa1c 134 // }
aluminium 5:7c8176cdaa1c 135 return 0;
DAkoetsier 2:8f6fca2179f2 136 }
DAkoetsier 2:8f6fca2179f2 137
DAkoetsier 2:8f6fca2179f2 138 // MAIN
DAkoetsier 2:8f6fca2179f2 139
DAkoetsier 2:8f6fca2179f2 140 int main(){
aluminium 5:7c8176cdaa1c 141 pc.baud(115200);
DAkoetsier 2:8f6fca2179f2 142
aluminium 5:7c8176cdaa1c 143 pc.printf("Lampjes zijn langs geweest");
DAkoetsier 2:8f6fca2179f2 144 led1.write(1);
DAkoetsier 2:8f6fca2179f2 145 led2.write(1);
DAkoetsier 2:8f6fca2179f2 146 led3.write(1);
DAkoetsier 2:8f6fca2179f2 147
aluminium 4:285fb7d84088 148
aluminium 4:285fb7d84088 149
DAkoetsier 2:8f6fca2179f2 150 bqc.add( &bq1_low ).add( &bq2_high ).add( &bq3_notch );
DAkoetsier 2:8f6fca2179f2 151
aluminium 6:b9a84c1cb4f9 152 // sample_timer.attach(&filter, 0.02); //continously execute the EMG reader and filter
aluminium 6:b9a84c1cb4f9 153 LED_timer.attach(&check_emg, 0.1); //continously execute the motor controller
aluminium 5:7c8176cdaa1c 154 //calibration_timer.attach(&calibration, 0.002); //ticker to check if EMG is being calibrated
DAkoetsier 2:8f6fca2179f2 155 // pc.printf("%d",filteredAbs);
DAkoetsier 2:8f6fca2179f2 156
aluminium 5:7c8176cdaa1c 157 calibration();
DAkoetsier 2:8f6fca2179f2 158
DAkoetsier 2:8f6fca2179f2 159 while(1){ //while loop to keep system going
DAkoetsier 2:8f6fca2179f2 160
DAkoetsier 2:8f6fca2179f2 161 }
DAkoetsier 2:8f6fca2179f2 162 }