00001
00002
00003
00004
00005
00006
00007
00008 #include "asuro.h"
00009 #include <stdlib.h>
00010
00011 unsigned char speed;
00012 int speedLeft,speedRight;
00013 unsigned int lineData[2];
00014 int x, xalt, don, doff, kp, kd, ki, yp, yd, yi, drest, y, y2, isum;
00015
00016 void FollowLine (void)
00017 {
00018 unsigned char leftDir = FWD, rightDir = FWD;
00019 FrontLED(OFF);
00020 LineData(lineData);
00021 doff = (lineData[0] - lineData[1]);
00022 FrontLED(ON);
00023 LineData(lineData);
00024 don = (lineData[0] - lineData[1]);
00025 x = don - doff;
00026 isum += x;
00027 if (isum > 16000) isum =16000;
00028 if (isum < -16000) isum =-16000;
00029 yi = isum/625 * ki;
00030 yd = (x - xalt)*kd;
00031 yd += drest;
00032 if (yd > 255) drest = yd - 255;
00033 else if (yd < -255) drest = yd + 255;
00034 else drest = 0;
00035 if (isum > 15000) BackLED(OFF,ON);
00036 else if (isum < -15000) BackLED(ON,OFF);
00037 else BackLED(OFF,OFF);
00038 yp = x*kp;
00039 y = yp + yi + yd;
00040 y2 = y/2;
00041 xalt = x;
00042 speedLeft = speedRight = speed;
00043 MotorDir(FWD,FWD);
00044 if ( y > 0) {
00045 StatusLED(GREEN);
00046 speedLeft = speed + y2;
00047 if (speedLeft > 255) {
00048 speedLeft = 255;
00049 y2 = speedLeft - speed;
00050 }
00051 y = y - y2;
00052 speedRight = speed - y;
00053 if (speedRight < 0) {
00054 speedRight = 0;
00055 }
00056 }
00057 if ( y < 0) {
00058 StatusLED(RED);
00059 speedRight = speed - y2;
00060 if (speedRight > 255) {
00061 speedRight = 255;
00062 y2 = speed - speedRight;
00063 }
00064 y = y - y2;
00065 speedLeft = speed + y;
00066 if (speedLeft < 0) {
00067 speedLeft = 0;
00068 }
00069 }
00070 leftDir = rightDir = FWD;
00071 if (speedLeft < 20) leftDir = BREAK;
00072 if (speedRight < 20) rightDir = BREAK;
00073 MotorDir(leftDir,rightDir);
00074 MotorSpeed(abs(speedLeft),abs(speedRight));
00075 }
00076
00077 int main(void)
00078 {
00079 unsigned char sw;
00080 Init();
00081 MotorDir(FWD,FWD);
00082 StatusLED(GREEN);
00083 speed = 150;
00084 kp = 3; ki = 10; kd = 70;
00085 sw = PollSwitch();
00086 if (sw & 0x01)
00087 {ki=20;}
00088 if (sw & 0x02)
00089 {speed = 200;}
00090 if (sw & 0x04)
00091 speed = 100;
00092 if (sw & 0x08)
00093 kd = 35;
00094 if (sw & 0x10)
00095 kd = 70;
00096 if (sw & 0x20)
00097 kd = 140;
00098 FrontLED(ON);
00099 LineData(lineData);
00100 speedLeft = speedRight = speed;
00101 while(1){
00102 FollowLine();
00103 }
00104 return 0;
00105 }
00106