Script 15-10-2019

Dependencies:   Servoaansturing mbed QEI HIDScope biquadFilter MODSERIAL FastPWM

Revision:
17:e371bced66da
Parent:
16:733a71a177e8
Child:
18:315a7670d0ca
--- a/main.cpp	Tue Oct 15 13:52:25 2019 +0000
+++ b/main.cpp	Fri Oct 18 13:30:09 2019 +0000
@@ -17,14 +17,44 @@
 DigitalOut motor2_dir(D4);
   
 DigitalIn Power_button_pressed(D1); // Geen InterruptIn gebruiken!
-DigitalIn Emergency_button_pressed(D2);
+DigitalIn Emergency_button_pressed(D2);  
 
 AnalogIn EMG_biceps_right_raw (A0);
 AnalogIn EMG_biceps_left_raw (A1);
 Analogin EMG_calf_raw (A2);
 
 Ticker loop_ticker;
-Ticker sample_timer;
+Ticker HIDScope_ticker;
+Ticker emgSampleTicker;
+
+HIDScope scope(3);
+
+BiQuadChain bqc; // Let op !!! Deze coëfficiënten moeten nog worden veranderd
+BiQuad bq1(0.0030, 0.0059, 0.0030, -1.8404,0.8522); //voor low-pass
+BiQuad bq2(0.9737, -1.9474, 0.9737, -1.9467, 0.9481); //voor high-pass
+BiQuad bq3(0.9912, -1.9823,0.9912, -1.9822, 0.9824); //lage piek eruit-> voor coëfficienten, zie matlab
+
+void emgSampleFilter() // Deze functie wordt aangeroepen dmv een ticker. Het sampled 
+                       // hierdoor het EMG signaal en het haalt er een filter overheen
+{   
+    double filtered_EMG_biceps_right=bqc.step(EMG_biceps_right_raw.read());
+    double filtered_EMG_biceps_left=bqc.step(EMG_biceps_left_raw.read());
+    double filtered_EMG_calf=bqc.step(EMG_calf_raw.read());
+}
+
+void sendHIDScope() // Deze functie geeft de gefilterde EMG-signalen weer in de HIDScope
+                    // Wordt eveneens gerund dmv een ticker
+{
+    /* Set the sampled emg values in channel 0 (the first channel) and 1 (the second channel) in the 'HIDScope' instance named 'scope' */
+    scope.set(0, filtered_EMG_biceps_right() ); // Werkt dit zo? Of nog met .read?
+    scope.set(1, filtered_EMG_biceps_left() );
+    scope.set(2, filtered_EMG_calf() );
+    /* Repeat the step above if required for more channels of required (channel 0 up to 5 = 6 channels) 
+    *  Ensure that enough channels are available (HIDScope scope( 2 ))
+    *  Finally, send all channels to the PC at once */
+    scope.send();
+    // Eventueel nog een ledje laten branden
+}
 
 // Emergency    
 void emergency()
@@ -55,30 +85,20 @@
         motor1_dir.write(1);
         pc.printf("Motoren aan functie\r\n");
     }
-
-// EMG inladen
-void emg_load()
-    {
-        EMG_biceps_right_raw.read(); 
-        EMG_biceps_left_raw.read();
-        EMG_calf_raw.read();
-        pc.printf("EMG data inladen\r\n");
-    }
-    
-    
-void  emg_discrete_filter()
-    {
-        // De ticker functie sample_timer hier toepassen voor het discretiseren?
-        // -> werkt een ticker in dit geval binnnen een void?
-        // Gemaakte filter toepassen op ruwe EMG data
-    }
         
 // EMG kalibreren        
 void  emg_calibration()   
      {
-         // Spieren maximaal aanspannen om het maximale potentiaal te 
-         // verkrijgen. Een fractie hiervan kan als drempel worden gebruikt voor
-         // beweging 
+        // Gedurende bijv. 5 seconden EMG meten, wanneer de spieren maximaal
+        // worden aangespannen -> maximaal potentiaal verkrijgen. Een fractie 
+        // hiervan kan als drempel worden gebruikt voor beweging
+        
+        // *Tijd instellen* 
+        
+        filtered_EMG_biceps_right_max 
+        filtered_EMG_biceps_left_max
+        filtered_EMG_calf_max
+         
      }
 
 // Finite state machine programming (calibration servo motor?)
@@ -201,6 +221,9 @@
 int main(void)
     {
         pc.printf("Opstarten\r\n");
+        bqc.add(&bq1).add(&bq2).add(&bq3);
+        emgSampleTicker.attach(&emgSampleFilter, 0.01f);
+        HIDScope_ticker.attach(&sendHIDScope, 0.01f);
         loop_ticker.attach(&ProcessStateMachine, 5.0f);  
         while(true) 
         { /* do nothing */}