Galileo Hand Basic Example implemented on FRDM K64F

Dependencies:   NOKIA_5110 mbed-dsp mbed

Fork of Nucleo_EMG_Galileo_Hand by Julio Fajardo

main.cpp

Committer:
julioefajardo
Date:
2015-08-12
Revision:
1:9472990d8bb4
Parent:
0:f2b89c6a8a16
Child:
2:12f979d695db

File content as of revision 1:9472990d8bb4:

#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);
 
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;   
    }   
  }
}