Galileo Hand Basic Example implemented on FRDM K64F

Dependencies:   NOKIA_5110 mbed-dsp mbed

Fork of Nucleo_EMG_Galileo_Hand by Julio Fajardo

Committer:
julioefajardo
Date:
Wed Aug 12 17:55:22 2015 +0000
Revision:
1:9472990d8bb4
Parent:
0:f2b89c6a8a16
Child:
2:12f979d695db
Galileo Hand - mbed EMG controller for ST Nucleo-411RE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
julioefajardo 0:f2b89c6a8a16 1 #include "mbed.h"
julioefajardo 0:f2b89c6a8a16 2 #include "arm_math.h"
julioefajardo 0:f2b89c6a8a16 3
julioefajardo 0:f2b89c6a8a16 4 Ticker EMG_Sampler;
julioefajardo 0:f2b89c6a8a16 5 Serial pc(SERIAL_TX, SERIAL_RX);
julioefajardo 0:f2b89c6a8a16 6 DigitalOut myled(LED1);
julioefajardo 0:f2b89c6a8a16 7 AnalogIn Ref(A0);
julioefajardo 0:f2b89c6a8a16 8 AnalogIn E1(A1);
julioefajardo 0:f2b89c6a8a16 9 AnalogIn E2(A2);
julioefajardo 0:f2b89c6a8a16 10 AnalogIn E3(A3);
julioefajardo 0:f2b89c6a8a16 11
julioefajardo 0:f2b89c6a8a16 12 float32_t EMG1, EMG2, EMG3;
julioefajardo 0:f2b89c6a8a16 13 float32_t samples[100];
julioefajardo 0:f2b89c6a8a16 14 float32_t samples2[100];
julioefajardo 0:f2b89c6a8a16 15 float32_t samples3[100];
julioefajardo 0:f2b89c6a8a16 16 float32_t abs_output[100];
julioefajardo 0:f2b89c6a8a16 17 float32_t abs_output2[100];
julioefajardo 0:f2b89c6a8a16 18 float32_t abs_output3[100];
julioefajardo 0:f2b89c6a8a16 19 float32_t samplesfi[128];
julioefajardo 0:f2b89c6a8a16 20 float32_t samplesfi2[128];
julioefajardo 0:f2b89c6a8a16 21 float32_t samplesfi3[128];
julioefajardo 0:f2b89c6a8a16 22 float32_t mean = 0.0f, mean2 = 0.0f, mean3 = 0.0f;
julioefajardo 0:f2b89c6a8a16 23 uint8_t COCO = 0;
julioefajardo 0:f2b89c6a8a16 24
julioefajardo 0:f2b89c6a8a16 25 void ADC_Sampler() {
julioefajardo 0:f2b89c6a8a16 26 EMG1 = (E1.read()-Ref.read())*3.3f;
julioefajardo 0:f2b89c6a8a16 27 EMG2 = (E2.read()-Ref.read())*3.3f;
julioefajardo 0:f2b89c6a8a16 28 EMG3 = (E3.read()-Ref.read())*3.3f;
julioefajardo 0:f2b89c6a8a16 29 pc.printf("%.10f,%.10f,%.10f\n\r",EMG1,EMG2,EMG3);
julioefajardo 0:f2b89c6a8a16 30 uint32_t m = __get_PRIMASK();
julioefajardo 0:f2b89c6a8a16 31 __disable_irq();
julioefajardo 0:f2b89c6a8a16 32 for(int j=99;j>0;j--) {
julioefajardo 0:f2b89c6a8a16 33 samples[j]=samples[j-1]; //Fill Array
julioefajardo 0:f2b89c6a8a16 34 samples2[j]=samples2[j-1]; //Fill Array
julioefajardo 0:f2b89c6a8a16 35 samples3[j]=samples3[j-1]; //Fill Array
julioefajardo 0:f2b89c6a8a16 36 }
julioefajardo 0:f2b89c6a8a16 37 samples[0]=EMG1;
julioefajardo 0:f2b89c6a8a16 38 samples2[0]=EMG2;
julioefajardo 0:f2b89c6a8a16 39 samples3[0]=EMG3;
julioefajardo 0:f2b89c6a8a16 40 //copy 25 samples on array
julioefajardo 0:f2b89c6a8a16 41 for(int j=99;j>0;j--){
julioefajardo 0:f2b89c6a8a16 42 samples[j]=samples[j-1];
julioefajardo 0:f2b89c6a8a16 43 samples2[j]=samples2[j-1];
julioefajardo 0:f2b89c6a8a16 44 samples3[j]=samples3[j-1];
julioefajardo 0:f2b89c6a8a16 45 }
julioefajardo 0:f2b89c6a8a16 46 __set_PRIMASK(m);
julioefajardo 0:f2b89c6a8a16 47 COCO = 1;
julioefajardo 0:f2b89c6a8a16 48 }
julioefajardo 0:f2b89c6a8a16 49
julioefajardo 0:f2b89c6a8a16 50 float32_t h[29] = {
julioefajardo 0:f2b89c6a8a16 51 0.005122283331907f,0.005887141527430f,0.008108906860497f,0.011692906924201f,0.016472293441426f,0.022216298876727f,0.028641952887652f,0.035428649080362f,
julioefajardo 0:f2b89c6a8a16 52 0.042234794064957f,0.048715653723188f,0.054541442583407f,0.059414685262420f,0.063085915202651f,0.065366863558607f,0.0661404253491338f,0.065366863558607f,
julioefajardo 0:f2b89c6a8a16 53 0.063085915202651f,0.059414685262420f,0.054541442583407f,0.048715653723188f,0.042234794064957f,0.035428649080362f,0.028641952887652f,0.022216298876727f,
julioefajardo 0:f2b89c6a8a16 54 0.016472293441426f,0.011692906924201f,0.008108906860497f,0.005887141527430f,0.005122283331907f
julioefajardo 0:f2b89c6a8a16 55 };
julioefajardo 0:f2b89c6a8a16 56
julioefajardo 0:f2b89c6a8a16 57 int main() {
julioefajardo 0:f2b89c6a8a16 58 pc.baud(115200); //Serial com at 115200 bauds
julioefajardo 0:f2b89c6a8a16 59 EMG_Sampler.attach(&ADC_Sampler, 0.001); //1ms ticker for ADC Sampler
julioefajardo 0:f2b89c6a8a16 60 myled = 1;
julioefajardo 0:f2b89c6a8a16 61 //Thumb = 0;
julioefajardo 0:f2b89c6a8a16 62 while(1) {
julioefajardo 0:f2b89c6a8a16 63 if(COCO){
julioefajardo 0:f2b89c6a8a16 64 //mean for threshold
julioefajardo 0:f2b89c6a8a16 65 arm_abs_f32(samples, abs_output, 100); //rectifier
julioefajardo 0:f2b89c6a8a16 66 arm_abs_f32(samples2, abs_output2, 100); //rectifier
julioefajardo 0:f2b89c6a8a16 67 arm_abs_f32(samples3, abs_output3, 100); //rectifier
julioefajardo 0:f2b89c6a8a16 68 arm_conv_f32(abs_output,100,h,29,samplesfi);//low pass filter
julioefajardo 0:f2b89c6a8a16 69 arm_conv_f32(abs_output2,100,h,29,samplesfi2);//low pass filter
julioefajardo 0:f2b89c6a8a16 70 arm_conv_f32(abs_output3,100,h,29,samplesfi3);//low pass filter
julioefajardo 0:f2b89c6a8a16 71 arm_mean_f32(samplesfi, 128, &mean);
julioefajardo 0:f2b89c6a8a16 72 arm_mean_f32(samplesfi2, 128, &mean2);
julioefajardo 0:f2b89c6a8a16 73 arm_mean_f32(samplesfi3, 128, &mean3);
julioefajardo 0:f2b89c6a8a16 74 if ((mean>0.009f)&&(mean2>0.007f)&&(mean3>0.007f)) {
julioefajardo 0:f2b89c6a8a16 75 myled = 0;
julioefajardo 0:f2b89c6a8a16 76 }
julioefajardo 0:f2b89c6a8a16 77 else {
julioefajardo 0:f2b89c6a8a16 78 myled = 1;
julioefajardo 0:f2b89c6a8a16 79 }
julioefajardo 0:f2b89c6a8a16 80 COCO = 0;
julioefajardo 0:f2b89c6a8a16 81 }
julioefajardo 0:f2b89c6a8a16 82 }
julioefajardo 0:f2b89c6a8a16 83 }