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