Galileo Hand Basic Example implemented on FRDM K64F
Dependencies: NOKIA_5110 mbed-dsp mbed
Fork of Nucleo_EMG_Galileo_Hand by
Diff: main.cpp
- Revision:
- 0:f2b89c6a8a16
- Child:
- 1:9472990d8bb4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Aug 12 17:52:38 2015 +0000 @@ -0,0 +1,84 @@ +#include "mbed.h" +#include "arm_math.h" + +Ticker EMG_Sampler; +Serial pc(SERIAL_TX, SERIAL_RX); +DigitalOut myled(LED1); +AnalogIn Ref(A0); +AnalogIn E1(A1); +AnalogIn E2(A2); +AnalogIn E3(A3); +Servo Thumb(D11); + +float32_t EMG1, EMG2, EMG3; +float32_t samples[100]; +float32_t samples2[100]; +float32_t samples3[100]; +float32_t abs_output[100]; +float32_t abs_output2[100]; +float32_t abs_output3[100]; +float32_t samplesfi[128]; +float32_t samplesfi2[128]; +float32_t samplesfi3[128]; +float32_t mean = 0.0f, mean2 = 0.0f, mean3 = 0.0f; +uint8_t COCO = 0; + +void ADC_Sampler() { + EMG1 = (E1.read()-Ref.read())*3.3f; + EMG2 = (E2.read()-Ref.read())*3.3f; + EMG3 = (E3.read()-Ref.read())*3.3f; + pc.printf("%.10f,%.10f,%.10f\n\r",EMG1,EMG2,EMG3); + uint32_t m = __get_PRIMASK(); + __disable_irq(); + for(int j=99;j>0;j--) { + samples[j]=samples[j-1]; //Fill Array + samples2[j]=samples2[j-1]; //Fill Array + samples3[j]=samples3[j-1]; //Fill Array + } + samples[0]=EMG1; + samples2[0]=EMG2; + samples3[0]=EMG3; + //copy 25 samples on array + for(int j=99;j>0;j--){ + samples[j]=samples[j-1]; + samples2[j]=samples2[j-1]; + samples3[j]=samples3[j-1]; + } + __set_PRIMASK(m); + COCO = 1; +} + +float32_t h[29] = { + 0.005122283331907f,0.005887141527430f,0.008108906860497f,0.011692906924201f,0.016472293441426f,0.022216298876727f,0.028641952887652f,0.035428649080362f, + 0.042234794064957f,0.048715653723188f,0.054541442583407f,0.059414685262420f,0.063085915202651f,0.065366863558607f,0.0661404253491338f,0.065366863558607f, + 0.063085915202651f,0.059414685262420f,0.054541442583407f,0.048715653723188f,0.042234794064957f,0.035428649080362f,0.028641952887652f,0.022216298876727f, + 0.016472293441426f,0.011692906924201f,0.008108906860497f,0.005887141527430f,0.005122283331907f +}; + +int main() { + pc.baud(115200); //Serial com at 115200 bauds + EMG_Sampler.attach(&ADC_Sampler, 0.001); //1ms ticker for ADC Sampler + myled = 1; + //Thumb = 0; + while(1) { + if(COCO){ + //mean for threshold + arm_abs_f32(samples, abs_output, 100); //rectifier + arm_abs_f32(samples2, abs_output2, 100); //rectifier + arm_abs_f32(samples3, abs_output3, 100); //rectifier + arm_conv_f32(abs_output,100,h,29,samplesfi);//low pass filter + arm_conv_f32(abs_output2,100,h,29,samplesfi2);//low pass filter + arm_conv_f32(abs_output3,100,h,29,samplesfi3);//low pass filter + arm_mean_f32(samplesfi, 128, &mean); + arm_mean_f32(samplesfi2, 128, &mean2); + arm_mean_f32(samplesfi3, 128, &mean3); + if ((mean>0.009f)&&(mean2>0.007f)&&(mean3>0.007f)) { + myled = 0; + } + else { + myled = 1; + } + COCO = 0; + } + } +}