Clark Lin
/
1407102
AVGG
Fork of 7_7Boboobooo by
main.cpp
- Committer:
- even
- Date:
- 2014-07-10
- Revision:
- 12:a3cee7619b77
- Parent:
- 11:9b4788de75fe
- Child:
- 13:e276703d5a5d
File content as of revision 12:a3cee7619b77:
#include "mbed.h" #include "servo_api.h" #include "camera_api.h" #include "motor_api.h" #define Debug_cam_uart Serial pc(USBTX, USBRX); BX_servo servo; BX_camera cam; BX_motor MotorA('A'); BX_motor MotorB('B'); //PID cam_to_M_ctrlr(10.0, 118.0, 0.06, 0.11, (0.104/30), 0.0, 0.0, 10); int main() { double left = 0.025, middle = 0.038, right = 0.057; double error, turn, last_turn = middle, avg = middle; double last_error = 0; double Kp = 0.000327, Ki = 0.0001; int black_centerR, black_centerL, center, times = 0; int flag = 0, sp = 64; char psudo_line[128]; #ifdef Debug_cam_uart pc.baud(115200); while(1){ cam.read(); MotorA.rotate(0.0); MotorB.rotate(0.0); black_centerL = cam.black_centerL(); black_centerR = cam.black_centerR(); //center = (black_centerL + black_centerR) / 2; /*while(1){ for(double i = 0.025; i < 0.058; i+= 0.001){ servo.set_angle(0.038); wait_ms(1000); } }*/ MotorA.rotate(0.15); MotorB.rotate(0.15); //catch little error if(black_centerL > 64 && black_centerR > 64){ center = (black_centerL <= black_centerR) ? black_centerL : black_centerR; } else if(black_centerL > 64 && black_centerR < 64){ center = (black_centerL-64 <= 64-black_centerR) ? black_centerL : black_centerR; } else if(black_centerL < 64 && black_centerR > 64){ center = (64-black_centerL <= black_centerR-64) ? black_centerL : black_centerR; } else if(black_centerL < 64 && black_centerR < 64){ center = (black_centerL >= black_centerR) ? black_centerL : black_centerR; } else{ center = 64; } if(black_centerL == 118 && black_centerR == 10){//no line flag = 0 error = 0; turn = avg; flag = 0; } else if (black_centerL == 118 && black_centerR != 10){//no left line turn right flag = 1 sp = 30; if(flag == 2){ sp = 64; } error = sp - black_centerR; turn = middle + Kp * error; flag = 1; last_error = (1/3)*last_error + error; } else if (black_centerL != 118 && black_centerR == 10){//no right line turn left flag = 2 sp = 90; if(flag == 1){ sp = 64; } error = 90 - black_centerL; turn = middle + Kp * error; flag = 2; last_error = (1/3)*last_error + error; } else {//flag = 3 if(60 < center && center < 68){ turn = middle; } else{ error = 64 - center; turn = Kp * error + middle; } if(flag == 1){ if(black_centerL < 100){ servo.set_angle(avg-0.004); turn = avg; } } else if(flag == 2){ if(black_centerR > 28){ servo.set_angle(avg+0.004); turn = avg; } } flag = 3; } last_turn += turn; times++; if(times == 2){ avg = last_turn / times; servo.set_angle(avg); times = last_turn = 0; } for(int i = 128; i > 64;i--){ if(i==64) pc.printf("X"); else pc.printf("%c", cam.sign_line_imageL[i]); } pc.printf(" || "); for(int i = 64; i > 0; i--){ if(i==64) pc.printf("X"); else pc.printf("%c", cam.sign_line_imageR[i]); } pc.printf("\r\n"); pc.printf("black centerL: %d black_centerR: %d psudo_line: %d avg: %lf flag: %d \r\n", black_centerL, black_centerR, center, avg, flag); //output the psudo map /*for(int i = 127; i >= 0; i--) psudo_line[i] = '0'; for(int i = center-5; i < center+5; i++) psudo_line[i] = ' '; for(int i = 117; i > 10; i--){ pc.printf("%c", psudo_line[i]); }*/ } // pc.printf("ang :%d\r\n ",( (64.0-center) /64.0 )*90); //-------------------------------------------- // servo.set_angle(( (64.0-center) /64.0 )*90 ); #endif return 0; }