Mechatro5 / Mbed OS LINE_TRACE_CAR

Dependencies:   BMX055 Motor Way

Revision:
3:efc081576a33
Parent:
2:09ea66e396c1
Child:
4:5588f67b8c48
diff -r 09ea66e396c1 -r efc081576a33 main.cpp
--- a/main.cpp	Wed Dec 04 02:32:00 2019 +0000
+++ b/main.cpp	Thu Dec 12 07:27:36 2019 +0000
@@ -2,14 +2,19 @@
 #include "motor.h"
 
 DigitalOut  motor_mode(D9);
-DigitalOut  LED(A6);
+DigitalOut  LED(D10);
 Motor       motorL(D5, D6);
 Motor       motorR(D3, D4);
 InterruptIn pg1(D12);
 InterruptIn pg2(D11);
-AnalogIn    reflectorF(A2);
-AnalogIn    reflectorL(A1);
-AnalogIn    reflectorR(A0);
+AnalogIn    reflectorFL(A6);
+AnalogIn    reflectorFM(A3);
+AnalogIn    reflectorFR(A2);
+AnalogIn    reflectorBL(A1);
+AnalogIn    reflectorBR(A0);
+//AnalogIn    reflectorF(A2);
+//AnalogIn    reflectorL(A1);
+//AnalogIn    reflectorR(A0);
 
 Thread thread_trace;
 Thread thread_motor;
@@ -20,7 +25,9 @@
 const float INTVAL_MOTOR     (0.25);
 
 float dist = 0.0;
+float fast_rpm     = 0;
 float standard_rpm = 0;
+float slow_rpm     = 0;
 
 void count_pg1()
 {
@@ -30,14 +37,16 @@
 void count_pg2()
 {
     motorR.count();
-} 
+}   
 
 void line_trace()
 {
-    //const float fast_rpm = 2000;
-    //const float standard_rpm = 1200;
-    //const float slow_rpm = 1000;
-    const float K = 750;//850;
+    //const float fast_rpm = 0;
+    //const float standard_rpm = 0;
+    //const float slow_rpm = 0;
+    static float pre = 0.0;
+    const float KP = 700;//850;
+    const float KD = 500;
     const int   L = 0;
     const int   R = 1;
     
@@ -48,22 +57,97 @@
     
     while(1)
     {
-        if( /*reflectorF<=0.4 &&*/ reflectorR<=0.4 && reflectorL<= 0.4 )
+        if( reflectorFM<=0.4 && reflectorFL<=0.4 && reflectorFR<=0.4 )
         {      
             if( flag == L )
             {
-               motorL.Set_phase(0);//1);
-               motorL.Set_target(0);//slow_rpm);
+               motorL.Set_phase(0);
+               motorL.Set_target(0);
                motorR.Set_phase(1);
-               motorR.Set_target(standard_rpm);//slow_rpm);
+               motorR.Set_target(standard_rpm);
                //printf("turnL\n");
             }
             else
             {
                motorL.Set_phase(0);
-               motorL.Set_target(standard_rpm);//slow_rpm);
-               motorR.Set_phase(1);//0);
-               motorR.Set_target(0);//slow_rpm);
+               motorL.Set_target(standard_rpm);
+               motorR.Set_phase(1);
+               motorR.Set_target(0);
+               //printf("turnR\n");
+            }  
+        }
+        else
+        {
+            if( reflectorFM > 0.4 )
+            {
+                motorL.Set_phase(0);
+                motorL.Set_target(fast_rpm);
+                motorR.Set_phase(1);
+                motorR.Set_target(fast_rpm);
+            }
+            else
+            {
+                if( reflectorFL.read() >= reflectorFR.read() )
+                {
+                    motorR.Set_phase(1);
+                    motorR.Set_target(standard_rpm + KP * reflectorFL.read() + KD * (reflectorFL.read() - pre));
+                    motorL.Set_phase(0);
+                    motorL.Set_target(standard_rpm - KP * reflectorFL.read() + KD * (reflectorFL.read() - pre));
+                    pre = reflectorFL.read();
+                    flag = L;
+                }
+                else
+                {
+                    motorR.Set_phase(1);
+                    motorR.Set_target(standard_rpm - KP * reflectorFR.read() + KD * (reflectorFR.read() - pre));
+                    motorL.Set_phase(0); 
+                    motorL.Set_target(standard_rpm + KP * reflectorFR.read() + KD * (reflectorFR.read() - pre));
+                    pre = reflectorFR.read();
+                    flag = R;
+                }
+            }
+            wait(INTVAL_REFLECTOR);
+        }
+        
+        printf("%f %f %f %f %f flag: %d \n", reflectorFL.read(), reflectorFM.read(), reflectorFR.read(), reflectorBL.read(), reflectorBR.read(), flag);
+    }
+}
+
+/*
+void line_trace()
+{
+    //const float fast_rpm = 0;
+    //const float standard_rpm = 0;
+    //const float slow_rpm = 0;
+    static float gap_pre = 0.0;
+    const float KP = 700;//850;
+    const float KD = 500;
+    const int   L = 0;
+    const int   R = 1;
+    
+    int flag;
+    
+    motorL.Set_phase(0);
+    motorR.Set_phase(1);
+    
+    while(1)
+    {
+        if( reflectorF<=0.4 && reflectorR<=0.4 && reflectorL<= 0.4 )
+        {      
+            if( flag == L )
+            {
+               motorL.Set_phase(0);
+               motorL.Set_target(0);
+               motorR.Set_phase(1);
+               motorR.Set_target(standard_rpm);
+               //printf("turnL\n");
+            }
+            else
+            {
+               motorL.Set_phase(0);
+               motorL.Set_target(standard_rpm);
+               motorR.Set_phase(1);
+               motorR.Set_target(0);
                //printf("turnR\n");
             }  
         }
@@ -82,18 +166,20 @@
                 {
                     float voltage_gap = reflectorL.read() - reflectorR.read();
                     motorR.Set_phase(1);
-                    motorR.Set_target(standard_rpm + K * voltage_gap);
+                    motorR.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre));
                     motorL.Set_phase(0);
-                    motorL.Set_target(standard_rpm - K * voltage_gap);
+                    motorL.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre));
+                    gap_pre = voltage_gap;
                     flag = L;
                 }
                 else
                 {
                     float voltage_gap = reflectorR.read() - reflectorL.read();
                     motorR.Set_phase(1);
-                    motorR.Set_target(standard_rpm - K * voltage_gap);
+                    motorR.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre));
                     motorL.Set_phase(0); 
-                    motorL.Set_target(standard_rpm + K * voltage_gap);
+                    motorL.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre));
+                    gap_pre = voltage_gap;
                     flag = R;
                 }
             }
@@ -102,7 +188,7 @@
         
         //printf("F: %f L: %f R: %f flag: %d \n", reflectorF.read(), reflectorL.read(), reflectorR.read(), flag);
     }
-}
+}*/
 
 void odometry()
 {
@@ -121,12 +207,32 @@
     dist_count += ( v + v_pre ) * INTVAL_MOTOR/2;
     v_pre = v;
     
-    if     (dist<=2000) standard_rpm = 2000;
-    else if(dist<=2400) standard_rpm = 1200;
-    else if(dist<=4400) standard_rpm = 2000;
-    else                standard_rpm = 1000;
+    if     (dist<=2000)
+    {
+        fast_rpm     = 2500;
+        standard_rpm = 2000;
+        slow_rpm     = 1200;
+    }
+    else if(dist<=2400)
+    {
+        fast_rpm     = 2000;
+        standard_rpm = 1500;
+        slow_rpm     = 1200;
+    }
+    else if(dist<=4400)
+    {
+        fast_rpm     = 2500;
+        standard_rpm = 2000;
+        slow_rpm     = 1200;
+    }
+    else
+    {
+        fast_rpm     = 1500;
+        standard_rpm = 1200;
+        slow_rpm     = 1200;
+    }
     
-    printf("%f\n", dist);
+    //printf("%f\n", dist);
     
     if( dist_count >= 200 )
     {