190605

Dependencies:   WS2812 RemoteIR PixelArray Adafruit_GFX

Revision:
107:94134c6f90e8
Parent:
106:d14f340f1fe0
Child:
108:64e7d7025e2f
--- a/main.cpp	Mon Jun 10 11:10:06 2019 +0000
+++ b/main.cpp	Wed Jun 12 07:47:47 2019 +0000
@@ -13,7 +13,6 @@
 #define NUM_COLORS 6
 #define NUM_LEDS_PER_COLOR 4
 
-//Motor motor(D6, D5, PA_0, PA_1, PB_0, PA_4, 0.3);
 ReceiverIR motor(D4, 0.2, D6, D5, PA_0, PA_1, PB_0, PA_4);
 SPI spi(D11, D12, D13);
 DigitalOut spi_cs(D10, 1);
@@ -124,6 +123,11 @@
     msec_t %= 1000;
     sec_t = timer_s.read();
     
+    if(sec_t > 60){ 
+        min_t = 1;
+        sec_t %= 60;
+    }
+    
     while (1);
 }
 
@@ -169,11 +173,10 @@
     motor.cal_start = 0;
     motor.cal_stop = 0; 
     
-    motor.kp = 0.1;
-    motor.kd = 0.0;
-    motor.ki = 5000;
-    motor.max = 200;
-    motor.standard = 500.0;
+    motor.kp = 10.0;
+    motor.kd = 1.0;
+//    motor.ki = 5000;
+    motor.max = 100;
  
     DataComm = 0;
  
@@ -204,15 +207,10 @@
 void oled_disp(void){
     myOled.begin();
     while(1){
-        myOled.printf("%.2f %.2f %.f %.f\r", motor.kp, motor.kd, motor.max, motor.standard);
+        myOled.printf("timer: %d:%d:%d sec\r",min_t, sec_t, msec_t);
 //        myOled.printf("%spl: %.3f spr:%.3f\r", motor.base_spl, motor.base_spr); 
         myOled.display();
-       // myOled.clearDisplay();
-//        wait(0.3);
-//        myOled.begin();
-//        myOled.printf("%d %.0f\r", motor.max, motor.standard);
-//        myOled.display();
-//        myOled.clearDisplay();
+
     }
 }
  
@@ -255,11 +253,7 @@
  
         sensor_values[i] = value;
     }
-    
-//    for(int i = 0; i < 5; i++){
-//        pc.printf("raw sensor values[%d]: %d\r\n",i, sensor_values[i]);
-//    }
-//    pc.printf("\r\n");
+
     
 }
  
@@ -303,11 +297,11 @@
  
         // get current position
         get_pos();
-//        pc.printf("pos: %d\r\n", pos);
+        pc.printf("pos: %d\r\n", pos);
+        pc.printf("on_line: %d\r\n\n", on_line);
+
         tracing_pid();
-        
-        //control
-//        control();
+    
     }
 }
  
@@ -323,35 +317,25 @@
             x = (((signed long)sensor_values[i]) - calibratedMin[i]) * 1000 / denominator;
         if(x < 0)   x = 0;
         else if(x > 1000)   x = 1000;
-//method2
-//        if(x < 250) x = 1; //black
-//        else x = 0;
         
         sensor_values[i] = x;
              
    }
-   
-//   for(int i = 0; i < NUM_SENSORS; i++){
-//        pc.printf("(after)sensor_values[%d] = %d\r\n", i, sensor_values[i]);
-//    }
-//   
-//    pc.printf("\r\n");
-//    wait(0.5);
 
 
    // finish line
-   //if(sensor_values[0] < 500 && sensor_values[1] < 500 && sensor_values[2] < 500 && sensor_values[3] < 500 && sensor_values[4] < 500){
-//        count_stop ++;
-//        if(count_stop > 7){
-//            timer_flag = 1;
-//            motor.stop();
-//        
-//            bottom_led();     
-//        }  
-//    }
-//    else{
-//        count_stop = 0;
-//    }
+   if(sensor_values[0] < 500 && sensor_values[1] < 500 && sensor_values[2] < 500 && sensor_values[3] < 500 && sensor_values[4] < 500){
+        count_stop ++;
+        if(count_stop > 7){
+            timer_flag = 1;
+            motor.stop();
+        
+            bottom_led();     
+        } 
+    }
+    else{
+        count_stop = 0;
+    }
 
 }
  
@@ -364,7 +348,7 @@
         int val = sensor_values[i];
  
         // determine "on_line" or "out_line"
-        if(val < 500){
+        if(val < 450){
             on_line = 1;
         }
  
@@ -377,13 +361,11 @@
  
     // out_line
     if(!on_line){
-        //if(pos <= (NUM_SENSORS - 1) * 1000 / 2) { // left -> out-line (under 2000)
-        if(pos <= 1800){       // left -> out-line (under 2000)
-            pos = 300;                             // last_vlaue = 0
+        if(pos <= (NUM_SENSORS - 1) * 1000 / 2) { // left -> out-line (under 2000)
+            pos = 0;                             // last_vlaue = 0
         }
         else{                                    // right -> out-line (over 2000)
-//             pos = (NUM_SENSORS - 1) * 1000;     // pos = 4000
-            pos = 3800;
+             pos = (NUM_SENSORS - 1) * 1000;     // pos = 4000
         }
     }
     // on_line
@@ -396,66 +378,37 @@
  
 void tracing_pid(void){
     
-    int proportional = pos - 2050;
+    int proportional = pos - 2000;
     
-    int derivative = proportional - last_proportional; 
-
+    int derivative = proportional - last_proportional;
     integral += proportional;
-    
+ 
     last_proportional  = proportional;
  
-    int power_difference = proportional*motor.kp + derivative * motor.kd;
-                                                                                                                                                                                                                                                                                                                                                                                                                             
-    
+    int power_difference = proportional / motor.kp+ derivative * motor.kd;
+
+    const float std = 990.0;
+ 
     if(power_difference > motor.max)
         power_difference = motor.max;
  
     if(power_difference < -motor.max)
         power_difference = -motor.max;
     
-    //완전 online일 때 init_spl, init_spr  
-    motor.speed_r((motor.max + power_difference)/motor.standard);
-    motor.speed_l((motor.max - power_difference)/motor.standard); 
+    // bot position: right
+    if(power_difference > 15){ //0.1 + p_d/std
+        motor.speed_r((motor.max + power_difference)/std);
+        motor.speed_l((motor.max - power_difference)/std);
+    }
+    // bot position: left
+    else if(power_difference < -15){
+        motor.speed_r((motor.max + power_difference)/std);
+        motor.speed_l((motor.max - power_difference)/std);
+    }
+    else{ //online
+        motor.speed_l(motor.init_sp_l);
+        motor.speed_r(motor.init_sp_r);
+    }    
 
 }
-//method2
-void control(void){
-    if((sensor_values[0] == 0) && (sensor_values[1] == 0) && (sensor_values[2] == 0) && (sensor_values[3] == 0) && (sensor_values[4] == 1)){
-        err = 4;
-}
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 0) && (sensor_values[2] == 0) && (sensor_values[3] == 1) && (sensor_values[4] == 1)){
-        err = 3;
-    }
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 0) && (sensor_values[2] == 0) && (sensor_values[3] == 1) && (sensor_values[4] == 0)){
-        err = 2;
-    }
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 0) && (sensor_values[2] == 1) && (sensor_values[3] == 1) && (sensor_values[4] == 0)){
-        err = 1;
-    }
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 0) && (sensor_values[2] == 1) && (sensor_values[3] == 0) && (sensor_values[4] == 0)){
-        err = 0;
-    }
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 1) && (sensor_values[2] == 1) && (sensor_values[3] == 0) && (sensor_values[4] == 0)){
-        err = -1;
-    }
-    else if((sensor_values[0] == 0) && (sensor_values[1] == 1) && (sensor_values[2] == 0) && (sensor_values[3] == 0) && (sensor_values[4] == 0)){
-        err = -2;
-    }
-    else if((sensor_values[0] == 1) && (sensor_values[1] == 1) && (sensor_values[2] == 0) && (sensor_values[3] == 0) && (sensor_values[4] == 0)){
-        err = -3;
-    }
-    else if((sensor_values[0] == 1) && (sensor_values[1] == 0) && (sensor_values[2] == 0) && (sensor_values[3] == 0) && (sensor_values[4] == 0)){
-        err = -4;
-    } 
-    pid = err*motor.kp;
-    
-    if(motor.base_spr < pid){
-        pid = motor.base_spr;
-    }
-    if( pid < - motor.base_spl){
-        pid = -motor.base_spl;
-    }
 
-    motor.speed_r(motor.base_spr - pid);
-    motor.speed_l(motor.base_spl + pid); 
-}
\ No newline at end of file