fancy lampje

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL FXOS8700Q FastPWM

Revision:
26:88639564e3af
Parent:
25:2cc29fa67345
Child:
27:c15170a5cd3d
--- a/main.cpp	Tue Oct 29 14:37:55 2019 +0000
+++ b/main.cpp	Wed Oct 30 11:34:26 2019 +0000
@@ -48,6 +48,12 @@
 states currentState=Waiting;
 volatile bool motor1_calibrated=false;
 
+volatile bool motorx_on=false;
+volatile float signx=0.075;
+volatile bool motory_on=false;
+volatile float signy=0.075;
+
+volatile bool demo_done=false;
 volatile float x_ref=0.175;
 volatile float y_ref=0.175;
 static float v_refx; //reference speeds 
@@ -66,9 +72,9 @@
 //PID controller variables
 bool q = true;
 float error_prev;
-static float Kp = 24.6;
-static float Ki = 28.3;
-static float Kd = 20;
+volatile float Kp = 24.6;
+volatile float Ki = 28.3;
+volatile float Kd = 0.1;
 float u;
 float u_p;
 float u_i;
@@ -235,12 +241,8 @@
 
 void set_v_refxy(void)
 {
-   static bool motorx_on=false;
-   static float signx=0.075;
    float Q0;
    Q0=2.0f*(P0-(EMG_min0+EMG_max0)/2.0f)/(EMG_max0-EMG_min0);
-   static bool motory_on=false;
-   static float signy=0.075;
    float Q1;
    Q1=2.0f*(P1-(EMG_min1+EMG_max1)/2.0f)/(EMG_max1-EMG_min1);
    if (Q0>-0.2f && !ignore_peaksx)
@@ -323,8 +325,6 @@
 
 void left_fake_emg(void)
 {
-    static bool motorx_on=false;
-    static float signx=0.075;
     if (!ignore_peaksx)
    {
         if (motorx_on)
@@ -358,8 +358,6 @@
 
 void right_fake_emg(void)
 {
-    static bool motory_on=false;
-    static float signy=0.075;
     if (!ignore_peaksy)
    {
         if (motory_on)
@@ -495,7 +493,9 @@
 float PID1(float err){
     //P action
     u_p = Kp * err;
-    
+    float x_pos=0.35*tan(theta2)/(tan(theta1)+tan(theta2));
+    float y_pos=tan(theta1)*x_pos;
+    float r1=0.1+sqrt(pow(x_pos,2)+pow(y_pos,2));
     //I action 
     error_integral1 = error_integral1 + err * T;
     u_i = Ki * error_integral1;
@@ -511,7 +511,7 @@
     u_d = Kd * filtered_error_derivativex;
     error_prevx = err;
     
-    u = u_p + u_i+u_d;
+    u = r1/0.3f*(u_p + u_i+u_d);
     if(filtered_error_derivativex>0.3)
     {
         u=0;
@@ -522,7 +522,9 @@
 float PID2(float err){
     //P action
     u_p = Kp * err;
-    
+    float x_pos=0.35*tan(theta2)/(tan(theta1)+tan(theta2));
+    float y_pos=tan(theta1)*x_pos;
+    float r2=0.1+sqrt(pow(0.35f-x_pos,2)+pow(y_pos,2));
     //I action 
     error_integral2 = error_integral2 + err * T;
     u_i = Ki * error_integral2;
@@ -540,13 +542,19 @@
     error_prevy = err;
     
     
-    u = u_p + u_i+u_d;
+    u = r2/0.3f*(u_p + u_i+u_d);
     return u;
     }
 void set_refxy(void)
 {
     float t=state_time.read();
     int tfloor=floor(t)/1;
+    float x_pos=0.35*tan(theta2)/(tan(theta1)+tan(theta2));
+    float y_pos=tan(theta1)*x_pos;
+    static float x_start=x_pos;
+    static float y_start=y_pos;
+    static int demo_subpart=1;
+    float v_demo=0.015;
     /* Rectangle
     if(tfloor%12==0||tfloor%12==1||tfloor%12==2)
     {
@@ -575,73 +583,82 @@
     */
     if(tfloor<3)
     {
-        x_ref=0.025;
-        y_ref=0.1;
+        x_ref=0.025+(3.0f-t)/3.0f*(x_start-0.025);
+        y_ref=0.1+(3.0f-t)/3.0f*(y_start-0.1);
     }
-    else if(tfloor>=3&&tfloor<=8)
+    else if(demo_subpart==1&&y_pos<0.4)
     {
         x_ref=0.025;
-        y_ref=0.1+0.05*(t-3);
+        y_ref=min(0.41f,y_pos+v_demo);
     }
-    else if(tfloor==9)
+    else if(demo_subpart==2&&x_pos<0.075)
     {
-        x_ref=0.025+0.05*(t-9);
-        y_ref=0.4;
+        x_ref=0.085;
+        y_ref=y_pos;
     }
-    else if(tfloor>=10&&tfloor<=15)
+    else if(demo_subpart==3&&y_pos>0.1)
     {
         x_ref=0.075;
-        y_ref=0.4-0.05*(t-10);
+        y_ref=max(0.09f,y_pos-v_demo);
     }
-    else if(tfloor==16)
+    else if(demo_subpart==4&&x_pos<0.125)
     {
-        x_ref=0.075+0.05*(t-16);
-        y_ref=0.1;
+        x_ref=0.135;
+        y_ref=y_pos;
     }
-    else if(tfloor>=17&&tfloor<=22)
+    else if(demo_subpart==5&&y_pos<0.4)
     {
         x_ref=0.125;
-        y_ref=0.1+0.05*(t-17);
+        y_ref=min(0.41f,y_pos+v_demo);
     }
-    else if(tfloor==23)
+    else if(demo_subpart==6&&x_pos<0.175)
     {
-        x_ref=0.125+0.05*(t-23);
-        y_ref=0.4;
+        x_ref=0.185;
+        y_ref=y_pos;
     }
-    else if(tfloor>=24&&tfloor<=29)
+    else if(demo_subpart==7&&y_pos>0.1)
     {
         x_ref=0.175;
-        y_ref=0.4-0.05*(t-24);
+        y_ref=max(0.09f,y_pos-v_demo);
     }
-    else if(tfloor==30)
+    else if(demo_subpart==8&&x_pos<0.225)
     {
-        x_ref=0.175+0.05*(t-25);
-        y_ref=0.1;
+        x_ref=0.235;
+        y_ref=y_pos;
     }
-    else if(tfloor>=31&&tfloor<=36)
+    else if(demo_subpart==9&&y_pos<0.4)
     {
         x_ref=0.225;
-        y_ref=0.1+0.05*(t-31);
+        y_ref=min(0.41f,y_pos+v_demo);
     }
-    else if(tfloor==37)
+    else if(demo_subpart==10&&x_pos<0.275)
     {
-        x_ref=0.225+0.05*(t-37);
-        y_ref=0.4;
+        x_ref=0.285;
+        y_ref=y_pos;
     }
-    else if(tfloor>=38&&tfloor<=43)
+    else if(demo_subpart==11&&y_pos>0.1)
     {
         x_ref=0.275;
-        y_ref=0.4-0.05*(t-38);
+        y_ref=max(0.09f,y_pos-v_demo);
     }
-    else if(tfloor==44)
+    else if(demo_subpart==12&&x_pos<0.325)
     {
-        x_ref=0.275+0.05*(t-44);
-        y_ref=0.1;
+        x_ref=0.335;
+        y_ref=y_pos;
     }
-    else if(tfloor>=45&&tfloor<=50)
+    else if(demo_subpart==13&&y_pos<0.4)
     {
         x_ref=0.325;
-        y_ref=0.1+0.05*(t-45);
+        y_ref=min(0.41f,y_pos+v_demo);
+    }
+    else if(demo_subpart==14)
+    {
+        
+        wait(10);   
+    }
+    else
+    {
+        demo_subpart+=1;
     }
     //float asdfgh=x_ref;
     //x_ref=y_ref-0.075;
@@ -707,7 +724,7 @@
             break;
         case Operating:
             read_emg();
-            //set_v_refxy();
+            set_v_refxy();
             set_ref_fake_emg();
             setPWM_controller();
             ledred=1;
@@ -715,8 +732,16 @@
             ledblue=1;
             break;
         case Demo:
-            set_refxy();
-            setPWM_controller();
+            if(!demo_done)
+            {
+                set_refxy();
+                setPWM_controller();
+            }
+            else
+            {
+                motor1_pwm.write(0.0f);
+                motor2_pwm.write(0.0f);
+            }
             ledred=0;
             ledgreen=0;
             ledblue=0;
@@ -737,6 +762,22 @@
     currentState=Failure;
 }
 
+void return_home()
+{
+    theta1_ref=pi/4.0f;
+    theta2_ref=pi/4.0f;
+    theta1_old=pi/4.0f;
+    theta2_old=pi/4.0f;
+    v_refx=0;
+    EMG_peakx.attach(unignore_peaksx,0.8);
+    ignore_peaksx=true;
+    motorx_on=false;
+    v_refy=0;
+    EMG_peaky.attach(unignore_peaksy,0.8);
+    ignore_peaksy=true;
+    motory_on=false;
+}
+
 void button_press(void) 
 //Press button to change state
 {
@@ -775,14 +816,14 @@
             currentState=Demo;
             Kp=24.6;
             Ki=28.3;
-            Kd=20;
+            Kd=0.1;
             wait(1);
             break;
         case Demo:
             currentState=Operating;
             Kp=15;
             Ki=38.3;
-            Kd=20;
+            Kd=10;
             wait(1);
             break;
     }
@@ -798,9 +839,9 @@
     button.fall(button_press);
     left_button.fall(left_fake_emg);
     left_button.rise(left_fake_emg);
-    right_button.fall(right_fake_emg);
-    right_button.rise(right_fake_emg);
-    int frequency_pwm=10000;
+    right_button.fall(return_home);
+    right_button.rise(return_home);
+    int frequency_pwm=21000;
     motor1_pwm.period(1.0/frequency_pwm);
     motor2_pwm.period(1.0/frequency_pwm);
     state_time.start();