190605

Dependencies:   WS2812 RemoteIR PixelArray Adafruit_GFX

Files at this revision

API Documentation at this revision

Comitter:
Jeonghoon
Date:
Wed Jun 12 07:47:47 2019 +0000
Parent:
106:d14f340f1fe0
Child:
108:64e7d7025e2f
Commit message:
very_stable

Changed in this revision

RemoteIR.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
--- a/RemoteIR.lib	Mon Jun 10 11:10:06 2019 +0000
+++ b/RemoteIR.lib	Wed Jun 12 07:47:47 2019 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/teams/embedded1/code/RemoteIR/#bbedc231c6a9
+https://os.mbed.com/teams/embedded1/code/RemoteIR/#f963ccdb48d1
--- 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