The code of the claw with filter

Dependencies:   MODSERIAL Motordriver QEI Servo mbed HIDScope

Fork of The_Claw by Meike Froklage

Files at this revision

API Documentation at this revision

Comitter:
meikefrok
Date:
Tue Nov 01 13:02:00 2016 +0000
Parent:
6:803234ba7071
Commit message:
New restrictions;

Changed in this revision

HIDScope.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
diff -r 803234ba7071 -r defb5001b787 HIDScope.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HIDScope.lib	Tue Nov 01 13:02:00 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/tomlankhorst/code/HIDScope/#188304906687
diff -r 803234ba7071 -r defb5001b787 main.cpp
--- a/main.cpp	Tue Nov 01 09:15:33 2016 +0000
+++ b/main.cpp	Tue Nov 01 13:02:00 2016 +0000
@@ -6,6 +6,7 @@
 #include "Servo.h"
 #include "BiQuad.h"
 #include <math.h>
+#include "HIDScope.h"
 
 //======== Serial Communication ================================================
 MODSERIAL pc(USBTX,USBRX);
@@ -25,6 +26,8 @@
 // servo
 Servo servo(D9);
 
+HIDScope    scope(2); //scope has two ports for the two EMG signals
+
 //======== Miscellaneous =======================================================
 // button
 InterruptIn btn(SW2);
@@ -79,7 +82,7 @@
 // miscellaneous
 const float kTimeToggle = 0.25f;        // period with which to toggle the parts
 const int LedOn = 0;                    // LED on if 0
-volatile int part_id = 2;               // ID of what part should move, begins with the cart
+volatile int part_id = 1;               // ID of what part should move, begins with the cart
 volatile int servo_id = 1;              // ID to the side the servo should move, begins in center position
 
 
@@ -102,6 +105,17 @@
 double rno_a1 = -1.603;    
 double rno_a2 = 0.9822;    
 
+double lno2_b0 = 0.9824;
+double lno2_b1 = -0.6071;
+double lno2_b2 = 0.9824;
+double lno2_a1 = -0.6071;
+double lno2_a2 = 0.9647;
+   
+double rno2_b0 = 0.9824;
+double rno2_b1 = -0.6071;
+double rno2_b2 = 0.9824;
+double rno2_a1 = -0.6071;
+double rno2_a2 = 0.9647;
 
 double lhf_b0 = 0.9355;    
 double lhf_b1 = -1.8711;   
@@ -131,10 +145,12 @@
 
 //starting values of the biquads of the corresponding filters
 double lno_v1 = 0, lno_v2 = 0;
+double lno2_v1 = 0, lno2_v2 = 0;
 double lhf_v1 = 0, lhf_v2 = 0;
 double llf_v1 = 0, llf_v2 = 0;
 
 double rno_v1 = 0, rno_v2 = 0;
+double rno2_v1 = 0, rno2_v2 = 0;
 double rhf_v1 = 0, rhf_v2 = 0;
 double rlf_v1 = 0, rlf_v2 = 0;
 
@@ -143,17 +159,21 @@
 so lno_y goes into lhf_y etc.
 */ 
 double lno_y;
+double lno2_y;
 double lhf_y;
 double llf_y;
 double lrect_y;
 double rno_y;
+double rno2_y;
 double rhf_y;
 double rlf_y;
 double rrect_y;
 
 // set the threshold value for the filtered signal
 //if the signal exceeds this value the motors will start to rotate 
-const double threshold_value = 0.13;
+const double threshold_value_left= 0.13;
+const double threshold_value= 0.13;
+
 
 /* declaration of each biquad
 The coefficients will be filled in later on in void scopeSend
@@ -171,6 +191,16 @@
     return y;
 }
 
+double biquad_lno2(double u, double&v1 , double&v2 , const double a1 , const double a2 , const double b0 ,
+    const double b1 , const double b2 )
+{
+    double v = u - a1*v1 - a2*v2;
+    double y = b0*v + b1*v1 + b2*v2;
+    v2 = v1;
+    v1 = v;
+    return y;
+}
+
 double biquad_lhf(double u, double&v1 , double&v2 , const double a1 , const double a2 , const double b0 ,
     const double b1 , const double b2 )
 {
@@ -200,6 +230,16 @@
     return y;
 }
 
+double biquad_rno2(double u, double&v1 , double&v2 , const double a1 , const double a2 , const double b0 ,
+    const double b1 , const double b2 )
+{
+    double v = u - a1*v1 - a2*v2;
+    double y = b0*v + b1*v1 + b2*v2;
+    v2 = v1;
+    v1 = v;
+    return y;
+}
+
 double biquad_rhf(double u, double&v1 , double&v2 , const double a1 , const double a2 , const double b0 ,
     const double b1 , const double b2 )
 {
@@ -234,13 +274,18 @@
 The filtered left signal (llf_y) is shown in channel 1, the filtered right signal (rlf_y)is shown in channel 0 (scope.set)*/
 void scopeSend(void){
     lno_y = biquad_lno(emgl.read(), lno_v1, lno_v2, lno_a1, lno_a2, lno_b0, lno_b1, lno_b2);
-    lhf_y = biquad_lhf(lno_y, lhf_v1, lhf_v2, lhf_a1, lhf_a2, lhf_b0, lhf_b1, lhf_b2);
+    lno2_y = biquad_lno2(lno_y, lno2_v1, lno2_v2, lno2_a1, lno2_a2, lno2_b0, lno2_b1, lno2_b2);
+    lhf_y = biquad_lhf(lno2_y, lhf_v1, lhf_v2, lhf_a1, lhf_a2, lhf_b0, lhf_b1, lhf_b2);
     lrect_y = fabs(lhf_y);
     llf_y = biquad_llf(lrect_y, llf_v1, llf_v2, llf_a1, llf_a2, llf_b0, llf_b1, llf_b2)/0.2;
     rno_y = biquad_rno(emgr.read(), rno_v1, rno_v2, rno_a1, rno_a2, rno_b0, rno_b1, rno_b2);
-    rhf_y = biquad_rhf(rno_y, rhf_v1, rhf_v2, rhf_a1, rhf_a2, rhf_b0, rhf_b1, rhf_b2);
+    rno2_y = biquad_rno2(rno_y, rno2_v1, rno2_v2, rno2_a1, rno2_a2, rno2_b0, rno2_b1, rno2_b2);
+    rhf_y = biquad_rhf(rno2_y, rhf_v1, rhf_v2, rhf_a1, rhf_a2, rhf_b0, rhf_b1, rhf_b2);
     rrect_y = fabs(rhf_y);
     rlf_y = biquad_rlf(rrect_y, rlf_v1, rlf_v2, rlf_a1, rlf_a2, rlf_b0, rlf_b1, rlf_b2)/0.2;  
+       scope.set(1, llf_y);
+    scope.set(0, rlf_y);
+    scope.send();
     }
 
 
@@ -254,7 +299,7 @@
             if(led_r == LedOn){
                 num_turned_on_0++;
             
-            if (rlf_y > threshold_value) {
+            if (rlf_y > threshold_value) {            
                     if(position_cart <= -95){                                  //If the cart is at the right side, it stops
                     Cart.stop(1)==1;
                     
@@ -270,8 +315,12 @@
                     }else{
                     Cart.speed(cart_speed)==cart_speed;
                     }
+                    
+                    if (llf_y > threshold_value){
+                    Cart.stop(1)==1;
+                    }
          
-                }else if (llf_y > threshold_value) {
+                }else if (llf_y > threshold_value) {                
                     if(position_cart >= 95){                                   //If the cart is at the left side, it stops
                     Cart.stop(1)==1;
                     
@@ -287,6 +336,10 @@
                     }else{
                     Cart.speed(-cart_speed)==-cart_speed;
                     }
+                    
+                    if (rlf_y > threshold_value){
+                    Cart.stop(1)==1;
+                    }
                                             
                 }else {
                 Cart.stop(1)==1;
@@ -308,8 +361,8 @@
         
             wait(0.1);
             pc.baud(115200);
-            pc.printf("Distance in mm: %i\n", position_cart);
-            
+            pc.printf("Distance in mm: %i\n\c", position_cart);
+                        
             break;
         }
         
@@ -326,21 +379,21 @@
                     }else if(position_cart > -95 && position_arm >= 25 && position_claw == 27){
                     Arm.stop(1)==1;
                         
-                    }else if(position_cart<= -95 && position_arm>=80){         //If the cart is at the right end, the arm can't move any further than 70 degrees
+                    }else if(position_cart<= -95 && position_arm>=50){         //If the cart is at the right end, the arm can't move any further than 70 degrees
                     Arm.stop(1)==1;
     
                     }else{
                     Arm.speed(arm_speed)==arm_speed;
                     } 
          
-                }else if (llf_y > threshold_value) {
+                }else if (llf_y > threshold_value_left) {
                     if(position_cart < 95 && position_arm <= -30){             //If the cart is not at the end, the arm can't move any further than 45 degrees 
                     Arm.stop(1)==1;
                     
                     }else if(position_cart < 95 && position_arm <= -25 && position_claw == -18){
                     Arm.stop(1)==1;
                     
-                    }else if(position_cart>=95 && position_arm<=-80){          //If the cart is at the left end, the arm can't move any further than 70 degrees
+                    }else if(position_cart>=95 && position_arm<=-50){          //If the cart is at the left end, the arm can't move any further than 70 degrees
                     Arm.stop(1)==1;
     
                     }else{
@@ -422,7 +475,7 @@
                         }
                     }
                  
-                }else if(llf_y > threshold_value){
+                }else if(llf_y > threshold_value_left){
                 servo_id --;
                 
                 switch (servo_id) {