2 losse EMG signalen van de biceps en deltoid

Dependencies:   HIDScope MODSERIAL mbed-dsp mbed Encoder

Fork of Lampje_EMG_Gr6 by Jesse Kaiser

Files at this revision

API Documentation at this revision

Comitter:
jessekaiser
Date:
Wed Oct 15 14:07:03 2014 +0000
Child:
1:099b19376f16
Commit message:
Begin met EMG implementeren;

Changed in this revision

HIDScope.lib Show annotated file Show diff for this revision Revisions of this file
MODSERIAL.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-dsp.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HIDScope.lib	Wed Oct 15 14:07:03 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/tomlankhorst/code/HIDScope/#e44574634162
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MODSERIAL.lib	Wed Oct 15 14:07:03 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Sissors/code/MODSERIAL/#180e968a751e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 15 14:07:03 2014 +0000
@@ -0,0 +1,171 @@
+#include "mbed.h"
+#include "HIDScope.h"
+#include "arm_math.h"
+#include "MODSERIAL.h"
+
+Serial pc(USBTX, USBRX); // tx, rx
+DigitalOut myled1(LED_RED);
+DigitalOut myled2(LED_GREEN);
+DigitalOut myled3(LED_BLUE);
+PwmOut     filtered_emg(PTD4); 
+
+//Define objects
+AnalogIn    emg0(PTB1); //Analog input
+HIDScope scope(2);
+
+arm_biquad_casd_df1_inst_f32 lowpass;
+//constants for 5Hz lowpass
+float lowpass_const[] = {0.8005910266528647, 1.6011820533057295, 0.8005910266528647, -1.5610153912536877, -0.6413487153577715};
+//state values
+float lowpass_states[4];
+arm_biquad_casd_df1_inst_f32 highpass;
+//constants for 0.5Hz highpass
+float highpass_const[] = {0.956542835577484, -1.913085671154968, 0.956542835577484, 1.911196288237583, -0.914975054072353};
+//state values
+float highpass_states[4];
+
+
+/** Looper function
+* functions used for Ticker and Timeout should be of type void <name>(void)
+* i.e. no input arguments, no output arguments.
+* if you want to change a variable that you use in other places (for example in main)
+* you will have to make that variable global in order to be able to reach it both from
+* the function called at interrupt time, and in the main function.
+* To make a variable global, define it under the includes.
+* variables that are changed in the interrupt routine (written to) should be made
+* 'volatile' to let the compiler know that those values may change outside the current context.
+* i.e.: "volatile uint16_t emg_value;" instead of "uint16_t emg_value"
+* in the example below, the variable is not re-used in the main function, and is thus declared
+* local in the looper function only.
+**/
+void looper()
+{
+    /*variable to store value in*/    
+    uint16_t emg_value;
+    float filtered_emg;
+    float emg_value_f32;
+    /*put raw emg value both in red and in emg_value*/
+    emg_value = emg0.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V)
+    emg_value_f32 = emg0.read();
+
+    //process emg
+    arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32, &filtered_emg, 1 );
+    filtered_emg = fabs(filtered_emg);
+    arm_biquad_cascade_df1_f32(&lowpass, &filtered_emg, &filtered_emg, 1 );
+    
+    /*send value to PC. */
+    scope.set(0,emg_value);     //uint value
+    scope.set(1,filtered_emg);  //processed float
+    scope.send();
+
+}
+
+void BlinkRed(int n)
+{
+    for (int i=0; i<n; i++) {
+        myled1 = 1;
+        myled2 = 1;
+        myled3 = 1;
+        wait(1);
+        myled1 = 0;
+        myled2 = 1;
+        myled3 = 1;
+        wait(1);
+    }
+}
+
+int main()
+{   
+    pc.baud(115200);
+    
+    Ticker log_timer;
+   //set up filters. Use external array for constants
+    arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states);
+    arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const,highpass_states);
+
+    /**Here you attach the 'void looper(void)' function to the Ticker object
+    * The looper() function will be called every 0.01 seconds.
+    * Please mind that the parentheses after looper are omitted when using attach.
+    */
+    log_timer.attach(looper, 0.001);
+    while(1) //Loop
+    {
+      /*Empty!*/
+      /*Everything is handled by the interrupt routine now!*/
+      {
+    char c = '0';
+    while(1) {
+        pc.printf("Het programma blijft knipperen totdat er op '1' wordt gedrukt.\n");
+        do {
+            myled1 = 1;
+            myled2 = 1;
+            myled3 = 1;
+            wait(1);
+            myled1 = 1;
+            myled2 = 0;
+            myled3 = 1;
+            wait(1);
+            if(pc.readable()) {
+                c = pc.getc();
+            }
+        } while(filtered_emg < 0.04);
+        //c = pc.getc();
+        while(filtered_emg.read() > 0.04) {     //Wanneer er op 1 wordt gedrukt gaat het lampje rood knipperen
+            c = '0';
+            BlinkRed(2);
+
+            if (pc.readable()) { //Wanneer er binnen de vastgestelde tijd weer op 1 wordt gedrukt, gaat het lampje blauw knipperen, anders reset.
+                c = pc.getc();
+                c = '0';
+                myled1 = 1;
+                myled2 = 1;
+                myled3 = 1;
+                wait(1);
+                myled1 = 1;
+                myled2 = 1;
+                myled3 = 0;
+                wait(1);
+                myled1 = 1;
+                myled2 = 1;
+                myled3 = 1;
+                wait(1);
+                myled1 = 1;
+                myled2 = 1;
+                myled3 = 0;
+                wait(1);}
+             else if (c != '1') {
+                 break; }
+
+                if(pc.readable()) {
+                    c = pc.getc();
+                    myled1 = 1;
+                    myled2 = 0;
+                    myled3 = 1;
+                    wait(5); //Dit wordt de duur van het slaan en teruggaan naar de beginpositie totdat er opnieuw gemeten kan worden.
+                    c = '0';
+                }
+            }
+        }
+    }
+    }
+}
+
+int i;
+
+int a(void)
+{
+    i=22;
+    return i;
+}
+
+void b (void)
+{
+    int i;
+    
+    i=66;
+    int j = a();
+    pc.print(i);
+ }
+
+b();
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-dsp.lib	Wed Oct 15 14:07:03 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/mbed-official/code/mbed-dsp/#7a284390b0ce
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Oct 15 14:07:03 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1
\ No newline at end of file