190605
Dependencies: WS2812 RemoteIR PixelArray Adafruit_GFX
Revision 107:94134c6f90e8, committed 2019-06-12
- 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