Galileo Hand Basic Example implemented on FRDM K64F
Dependencies: NOKIA_5110 mbed-dsp mbed
Fork of Nucleo_EMG_Galileo_Hand by
main.cpp
- Committer:
- julioefajardo
- Date:
- 2015-09-30
- Revision:
- 4:d8fd3c4484cc
- Parent:
- 3:f784301a5166
- Child:
- 5:49c5553b6e2c
File content as of revision 4:d8fd3c4484cc:
#include "mbed.h" #include "arm_math.h" #define FLEXION 0.2f #define EXTENSION 0.2f #define FLEXION2 0.00f Ticker EMG_Sampler; Serial pc(SERIAL_TX, SERIAL_RX); DigitalOut myled(LED1); AnalogIn Ref(A0); AnalogIn E1(A1); AnalogIn E2(A2); AnalogIn E3(A3); PwmOut Thumb(D11); PwmOut Index(D10); PwmOut Middle(D9); PwmOut Pinky(D6); PwmOut ThumbRot(D5); float32_t EMG1, EMG2, EMG3; float32_t samples[25]; float32_t samples2[25]; float32_t samples3[25]; float32_t abs_output[25]; float32_t abs_output2[25]; float32_t abs_output3[25]; float32_t mean = 0.0f, mean2 = 0.0f, mean3 = 0.0f; uint8_t state = 0; uint8_t COCO = 0; void ADC_Sampler(void); void Close(void); void Open(void); int main() { pc.baud(115200); //Serial com at 115200 bauds EMG_Sampler.attach(&ADC_Sampler, 0.001); //1 ms ticker for ADC Sampler //Open -> 0.6ms - Close 2.4ms Thumb.period(0.02f/2.0f); Thumb.pulsewidth(0.0010f/2.0f); //Open -> 2.4ms - Close 0.6ms Index.period(0.02f*2.0f); Index.pulsewidth(0.0024f*2.0f); //Open -> 2.4ms - Close 0.6ms Middle.period(0.02f*2.0f); Middle.pulsewidth(0.0024f*2.0f); //Open -> 0.6ms - Close 2.4ms Pinky.period(0.02f*2.0f); Pinky.pulsewidth(0.0006f*2.0f); //Open -> 0.6ms - Close 2.4ms //ThumbRot.period(0.02f/2.0f); ThumbRot.pulsewidth(0.0006f*2.0f); myled = 1; while(1) { if(COCO){ arm_abs_f32(samples, abs_output, 25); //rectifier arm_abs_f32(samples2, abs_output2, 25); //rectifier arm_abs_f32(samples3, abs_output3, 25); //rectifier arm_mean_f32(abs_output, 25, &mean); //mean arm_mean_f32(abs_output2, 25, &mean2); //mean arm_mean_f32(abs_output3, 25, &mean3); //mean //pc.printf("%.10f,%.10f\n\r",mean,mean2); switch(state){ case 0: { if (mean>FLEXION){ myled = 0; state = 1; Close(); } } break; case 1: { if (mean2>EXTENSION){ myled = 1; state = 0; Open(); } } } 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); //pc.printf("%.10f,%.10f\n\r",EMG1,EMG2); uint32_t m = __get_PRIMASK(); __disable_irq(); for(int j=24;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; __set_PRIMASK(m); COCO = 1; } void Close(void){ Thumb.pulsewidth(0.0024f/2.0f); Index.pulsewidth(0.0006f*2.0f); Middle.pulsewidth(0.0006f*2.0f); Pinky.pulsewidth(0.0024f*2.0f); ThumbRot.pulsewidth(0.0024f*2.0f); } void Open(void){ Thumb.pulsewidth(0.0010f/2.0f); Index.pulsewidth(0.0024f*2.0f); Middle.pulsewidth(0.0024f*2.0f); Pinky.pulsewidth(0.0006f*2.0f); ThumbRot.pulsewidth(0.0006f*2.0f); }