Robotics Term Project / Mbed 2 deprecated Robottics_Motion

Dependencies:   mbed

Committer:
smilestone520
Date:
Thu May 26 11:40:02 2016 +0000
Revision:
31:6a894ff3ed18
Parent:
30:2ce51e8719ff
Child:
32:fb8f40fde82c
hahaha;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
smilestone520 10:06cc2b1d2aaf 1 /*LAB_DCMotor*/
smilestone520 10:06cc2b1d2aaf 2 #include "mbed.h"
smilestone520 10:06cc2b1d2aaf 3
smilestone520 10:06cc2b1d2aaf 4 //The number will be compiled as type "double" in default
smilestone520 10:06cc2b1d2aaf 5 //Add a "f" after the number can make it compiled as type "float"
smilestone520 10:06cc2b1d2aaf 6 #define Ts 0.01f //period of timer1 (s)
smilestone520 10:06cc2b1d2aaf 7 #define Kp 0.003f
smilestone520 10:06cc2b1d2aaf 8 #define Ki 0.01f
smilestone520 10:06cc2b1d2aaf 9
roger5641 17:d96afd9d2692 10
roger5641 17:d96afd9d2692 11 PwmOut servo(A0);
smilestone520 10:06cc2b1d2aaf 12 PwmOut pwm1(D7);
smilestone520 10:06cc2b1d2aaf 13 PwmOut pwm1n(D11);
smilestone520 10:06cc2b1d2aaf 14 PwmOut pwm2(D8);
smilestone520 10:06cc2b1d2aaf 15 PwmOut pwm2n(A3);
smilestone520 10:06cc2b1d2aaf 16
smilestone520 10:06cc2b1d2aaf 17 Serial bluetooth(D10,D2);
smilestone520 10:06cc2b1d2aaf 18 Serial pc(D1, D0);
smilestone520 10:06cc2b1d2aaf 19
smilestone520 10:06cc2b1d2aaf 20 DigitalOut led1(A4);
smilestone520 10:06cc2b1d2aaf 21 DigitalOut led2(A5);
smilestone520 10:06cc2b1d2aaf 22
smilestone520 10:06cc2b1d2aaf 23 //Motor1 sensor
smilestone520 10:06cc2b1d2aaf 24 InterruptIn HallA_1(A1);
smilestone520 10:06cc2b1d2aaf 25 InterruptIn HallB_1(A2);
smilestone520 10:06cc2b1d2aaf 26 //Motor2 sensor
smilestone520 10:06cc2b1d2aaf 27 InterruptIn HallA_2(D13);
smilestone520 10:06cc2b1d2aaf 28 InterruptIn HallB_2(D12);
smilestone520 10:06cc2b1d2aaf 29
smilestone520 10:06cc2b1d2aaf 30 Ticker timer1;
smilestone520 10:06cc2b1d2aaf 31 void timer1_interrupt(void);
smilestone520 10:06cc2b1d2aaf 32 void CN_interrupt(void);
smilestone520 10:06cc2b1d2aaf 33
smilestone520 10:06cc2b1d2aaf 34 void init_TIMER(void);
smilestone520 10:06cc2b1d2aaf 35 void init_PWM(void);
smilestone520 10:06cc2b1d2aaf 36 void init_CN(void);
smilestone520 20:5b892e37a958 37 void funcBorder(void);
smilestone520 20:5b892e37a958 38 void smallAngle( float );
smilestone520 20:5b892e37a958 39 void turnCW(float);
smilestone520 20:5b892e37a958 40 void turnCCW(float);
smilestone520 10:06cc2b1d2aaf 41
smilestone520 10:06cc2b1d2aaf 42 int8_t stateA_1=0, stateB_1=0, stateA_2=0, stateB_2=0;
smilestone520 10:06cc2b1d2aaf 43 int8_t state_1 = 0, state_1_old = 0, state_2 = 0, state_2_old = 0;
smilestone520 10:06cc2b1d2aaf 44
smilestone520 10:06cc2b1d2aaf 45 int v1Count = 0;
smilestone520 10:06cc2b1d2aaf 46 int v2Count = 0;
smilestone520 10:06cc2b1d2aaf 47
roger5641 17:d96afd9d2692 48 float v1 = 0.0, v1_ref = 0.0;
smilestone520 10:06cc2b1d2aaf 49 float v1_err = 0.0, v1_ierr = 0.0, PIout_1 = 0.0, PIout_1_old = 0.0;
roger5641 17:d96afd9d2692 50 float v2 = 0.0, v2_ref = 0.0;
smilestone520 10:06cc2b1d2aaf 51 float v2_err = 0.0, v2_ierr = 0.0, PIout_2 = 0.0, PIout_2_old = 0.0;
roger5641 17:d96afd9d2692 52
roger5641 17:d96afd9d2692 53 int angle = 90;
roger5641 15:3e0a4079b28a 54 float servo_duty = 0.079;//0.079 +(0.084/180)*angle, -90<angle<90
roger5641 15:3e0a4079b28a 55
roger5641 18:2db6c97a4145 56 int Receive_Data[33] = {0};
roger5641 18:2db6c97a4145 57 double Distance_Target = 0, Angle_Target = 0;
roger5641 15:3e0a4079b28a 58 int X_Position_1 = 0, Y_Position_1 = 0, Angle_1 = 0;
roger5641 15:3e0a4079b28a 59 int X_Position_2 = 0, Y_Position_2 = 0, Angle_2 = 0;
roger5641 15:3e0a4079b28a 60
smilestone520 20:5b892e37a958 61 float k_forward = 20, k_turn = 10;
smilestone520 20:5b892e37a958 62
smilestone520 11:44989c0bcea5 63 //**** receive and return by bluetooth ************** // bluetooth.getc()
smilestone520 14:c46f22bcaa38 64 float xC, yC; // car's position
smilestone520 14:c46f22bcaa38 65 float angleC;// car's angle
roger5641 17:d96afd9d2692 66 double xP,yP,distance; //position that car need to reach
smilestone520 14:c46f22bcaa38 67 float angleR; // angleR = car-nextSpot direction ---> car direction
smilestone520 31:6a894ff3ed18 68 int xGate = 136, yGate = 328; //左們136 328, 右們874,316
roger5641 17:d96afd9d2692 69 double angleGate, distanceGate;
smilestone520 11:44989c0bcea5 70 int aI_State = 0;
smilestone520 21:6e8ab9487985 71 int bor_state = 1;
roger5641 17:d96afd9d2692 72 double pi = 3.1415926;
smilestone520 21:6e8ab9487985 73 double borAngle=0;
smilestone520 11:44989c0bcea5 74
smilestone520 25:7053736ea6cc 75 float ballSize; // ball size
smilestone520 25:7053736ea6cc 76
smilestone520 30:2ce51e8719ff 77 float longC = 65; // car's length //65
smilestone520 30:2ce51e8719ff 78 int yB1= 65;
smilestone520 30:2ce51e8719ff 79 int yB2 = 580;
smilestone520 30:2ce51e8719ff 80 int xB3 = 170;
smilestone520 30:2ce51e8719ff 81 int xB4 = 860; // broder conditions
smilestone520 29:47519f2b14ad 82 //65 , 580, 170,860
smilestone520 27:1696ef46b538 83 int ticCheck = 10;
smilestone520 20:5b892e37a958 84
smilestone520 10:06cc2b1d2aaf 85 int main() {
smilestone520 10:06cc2b1d2aaf 86
smilestone520 10:06cc2b1d2aaf 87 init_TIMER();
smilestone520 10:06cc2b1d2aaf 88 init_PWM();
smilestone520 10:06cc2b1d2aaf 89 init_CN();
roger5641 17:d96afd9d2692 90 servo.write(0.079 + (0.084/180)*angle);
smilestone520 10:06cc2b1d2aaf 91
smilestone520 10:06cc2b1d2aaf 92 bluetooth.baud(115200); //設定鮑率
smilestone520 10:06cc2b1d2aaf 93 pc.baud(57600);
smilestone520 10:06cc2b1d2aaf 94
smilestone520 10:06cc2b1d2aaf 95
smilestone520 10:06cc2b1d2aaf 96 while(1)
smilestone520 10:06cc2b1d2aaf 97 {
smilestone520 10:06cc2b1d2aaf 98 if(pc.readable())
smilestone520 10:06cc2b1d2aaf 99 {
smilestone520 10:06cc2b1d2aaf 100 bluetooth.putc(pc.getc());
smilestone520 10:06cc2b1d2aaf 101 }
smilestone520 10:06cc2b1d2aaf 102 if(bluetooth.readable())
smilestone520 10:06cc2b1d2aaf 103 {
smilestone520 10:06cc2b1d2aaf 104 pc.putc(bluetooth.getc());
smilestone520 10:06cc2b1d2aaf 105 }
smilestone520 10:06cc2b1d2aaf 106 }
smilestone520 10:06cc2b1d2aaf 107 }
smilestone520 10:06cc2b1d2aaf 108
smilestone520 10:06cc2b1d2aaf 109 void timer1_interrupt(void)
smilestone520 10:06cc2b1d2aaf 110 {
roger5641 26:dbdbfdb4dd41 111 for(int i=0; i<32; i++)
roger5641 26:dbdbfdb4dd41 112 {
roger5641 26:dbdbfdb4dd41 113 Receive_Data[i] = bluetooth.getc();
roger5641 26:dbdbfdb4dd41 114 }
roger5641 26:dbdbfdb4dd41 115 //read data from matlab
roger5641 26:dbdbfdb4dd41 116 //distance_target
roger5641 26:dbdbfdb4dd41 117 Distance_Target = (Receive_Data[1]-0x30)*100 + (Receive_Data[2]-0x30)*10 + (Receive_Data[3]-0x30);
roger5641 26:dbdbfdb4dd41 118
roger5641 26:dbdbfdb4dd41 119 if(Receive_Data[0] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 120 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 121
roger5641 26:dbdbfdb4dd41 122 //ang_rel_target
roger5641 26:dbdbfdb4dd41 123 Angle_Target = (Receive_Data[5]-0x30)*100 + (Receive_Data[6]-0x30)*10 + (Receive_Data[7]-0x30);
roger5641 26:dbdbfdb4dd41 124
roger5641 26:dbdbfdb4dd41 125 if(Receive_Data[4] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 126 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 127
roger5641 26:dbdbfdb4dd41 128 //x_position_car_1
roger5641 26:dbdbfdb4dd41 129 X_Position_1 = (Receive_Data[9]-0x30)*100 + (Receive_Data[10]-0x30)*10 + (Receive_Data[11]-0x30);
roger5641 26:dbdbfdb4dd41 130
roger5641 26:dbdbfdb4dd41 131 if(Receive_Data[8] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 132 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 133
roger5641 26:dbdbfdb4dd41 134 //y_position_car_1
smilestone520 31:6a894ff3ed18 135 Y_Position_1 = (Receive_Data[13]-0x30)*100 + (Receive_Data[14]-0x30)*10 + (
smilestone520 31:6a894ff3ed18 136
smilestone520 31:6a894ff3ed18 137 _Data[15]-0x30);
roger5641 26:dbdbfdb4dd41 138
roger5641 26:dbdbfdb4dd41 139 if(Receive_Data[12] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 140 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 141
roger5641 26:dbdbfdb4dd41 142 //angle_car_1
roger5641 26:dbdbfdb4dd41 143 Angle_1 = (Receive_Data[17]-0x30)*100 + (Receive_Data[18]-0x30)*10 + (Receive_Data[19]-0x30);
roger5641 26:dbdbfdb4dd41 144
roger5641 26:dbdbfdb4dd41 145 if(Receive_Data[16] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 146 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 147
roger5641 26:dbdbfdb4dd41 148 //x_position_car_2
roger5641 26:dbdbfdb4dd41 149 X_Position_2 = (Receive_Data[21]-0x30)*100 + (Receive_Data[22]-0x30)*10 + (Receive_Data[23]-0x30);
roger5641 26:dbdbfdb4dd41 150
roger5641 26:dbdbfdb4dd41 151 if(Receive_Data[20] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 152 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 153
roger5641 26:dbdbfdb4dd41 154 //y_position_car_2
roger5641 26:dbdbfdb4dd41 155 Y_Position_2 = (Receive_Data[25]-0x30)*100 + (Receive_Data[26]-0x30)*10 + (Receive_Data[27]-0x30);
roger5641 26:dbdbfdb4dd41 156
roger5641 26:dbdbfdb4dd41 157 if(Receive_Data[24] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 158 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 159
roger5641 26:dbdbfdb4dd41 160 //angle_car_1
roger5641 26:dbdbfdb4dd41 161 Angle_2 = (Receive_Data[29]-0x30)*100 + (Receive_Data[30]-0x30)*10 + (Receive_Data[31]-0x30);
roger5641 26:dbdbfdb4dd41 162
roger5641 26:dbdbfdb4dd41 163 if(Receive_Data[28] == '-')Distance_Target = -1* Distance_Target;
roger5641 26:dbdbfdb4dd41 164 else Distance_Target = Distance_Target;
roger5641 26:dbdbfdb4dd41 165
roger5641 26:dbdbfdb4dd41 166
roger5641 26:dbdbfdb4dd41 167
smilestone520 10:06cc2b1d2aaf 168 //Motor 1
smilestone520 10:06cc2b1d2aaf 169 v1 = (float)v1Count * 100.0f / 12.0f * 60.0f / 29.0f; //unit: rpm
smilestone520 10:06cc2b1d2aaf 170 v1Count = 0;
smilestone520 10:06cc2b1d2aaf 171
smilestone520 10:06cc2b1d2aaf 172 ///code for PI control///
smilestone520 10:06cc2b1d2aaf 173 v1_err = v1_ref - v1;
smilestone520 10:06cc2b1d2aaf 174 v1_ierr = 0.01f*v1_err + v1_ierr;
smilestone520 10:06cc2b1d2aaf 175 PIout_1 = Kp*v1_err + Ki*v1_ierr;
smilestone520 10:06cc2b1d2aaf 176
smilestone520 10:06cc2b1d2aaf 177 if(PIout_1 >= 0.5f)PIout_1 = 0.5f;
smilestone520 10:06cc2b1d2aaf 178 else if(PIout_1 <= -0.5f)PIout_1 = -0.5f;
smilestone520 10:06cc2b1d2aaf 179 pwm1.write(PIout_1 + 0.5f);
roger5641 17:d96afd9d2692 180 TIM1->CCER |= 0x4;
smilestone520 10:06cc2b1d2aaf 181
smilestone520 10:06cc2b1d2aaf 182 //Motor 2
smilestone520 10:06cc2b1d2aaf 183 v2 = (float)v2Count * 100.0f / 12.0f * 60.0f / 29.0f; //unit: rpm
smilestone520 10:06cc2b1d2aaf 184 v2Count = 0;
smilestone520 10:06cc2b1d2aaf 185
smilestone520 10:06cc2b1d2aaf 186 ///code for PI control///
smilestone520 10:06cc2b1d2aaf 187 v2_err = v2_ref - v2;
smilestone520 10:06cc2b1d2aaf 188 v2_ierr = 0.01f*v2_err + v2_ierr;
smilestone520 10:06cc2b1d2aaf 189 PIout_2 = Kp*v2_err + Ki*v2_ierr;
smilestone520 10:06cc2b1d2aaf 190
smilestone520 10:06cc2b1d2aaf 191 if(PIout_2 >= 0.5f)PIout_2 = 0.5f;
smilestone520 10:06cc2b1d2aaf 192 else if(PIout_2 <= -0.5f)PIout_2 = -0.5f;
smilestone520 10:06cc2b1d2aaf 193 pwm2.write(PIout_2 + 0.5f);
smilestone520 10:06cc2b1d2aaf 194 TIM1->CCER |= 0x40;
smilestone520 10:06cc2b1d2aaf 195
roger5641 17:d96afd9d2692 196
smilestone520 11:44989c0bcea5 197 //***** main AI **************************
smilestone520 11:44989c0bcea5 198
smilestone520 11:44989c0bcea5 199
smilestone520 11:44989c0bcea5 200 //***** get position information from the bluetooth
roger5641 17:d96afd9d2692 201 xC = X_Position_1;
roger5641 17:d96afd9d2692 202 yC = Y_Position_1; // car's position
smilestone520 11:44989c0bcea5 203
roger5641 17:d96afd9d2692 204 angleC = Angle_1; // car's angle
roger5641 17:d96afd9d2692 205
roger5641 17:d96afd9d2692 206 distance = Distance_Target;
roger5641 18:2db6c97a4145 207 xP = Distance_Target*cos(Angle_Target*pi/180);
roger5641 18:2db6c97a4145 208 yP = Distance_Target*sin(Angle_Target*pi/180);//position that car need to reach
smilestone520 11:44989c0bcea5 209
roger5641 17:d96afd9d2692 210 angleR = Angle_Target; // angleR = car-nextSpot direction ---> car direction
smilestone520 11:44989c0bcea5 211
smilestone520 29:47519f2b14ad 212 yB1 += longC;
smilestone520 29:47519f2b14ad 213 yB2 -= longC ;
smilestone520 29:47519f2b14ad 214 xB3 += longC ;
smilestone520 29:47519f2b14ad 215 xB4 -= longC;
smilestone520 20:5b892e37a958 216
smilestone520 11:44989c0bcea5 217 //**** AI_State ********************
smilestone520 11:44989c0bcea5 218
smilestone520 11:44989c0bcea5 219 switch(aI_State)
smilestone520 11:44989c0bcea5 220 {
smilestone520 12:c1a667ca6c53 221 case 0: // IDLE
smilestone520 12:c1a667ca6c53 222 // IDLE check if stop color appear
smilestone520 12:c1a667ca6c53 223 //check purple color appear or not
roger5641 17:d96afd9d2692 224 if(xP==0 && yP==0 && angleR==0)
roger5641 17:d96afd9d2692 225 {
roger5641 17:d96afd9d2692 226 v1_ref = 0;
roger5641 17:d96afd9d2692 227 v2_ref = 0;
roger5641 17:d96afd9d2692 228 }
roger5641 17:d96afd9d2692 229 else
roger5641 17:d96afd9d2692 230 aI_State = 1;
smilestone520 14:c46f22bcaa38 231 //****setSpecs();
smilestone520 11:44989c0bcea5 232 break;
smilestone520 16:a102929b2228 233
roger5641 17:d96afd9d2692 234 case 1: /// border condition
smilestone520 12:c1a667ca6c53 235 // check if car fit border conditions
smilestone520 21:6e8ab9487985 236 switch(bor_state){
smilestone520 21:6e8ab9487985 237 case 1:
smilestone520 21:6e8ab9487985 238 funcBorder();
smilestone520 21:6e8ab9487985 239 break;
smilestone520 22:d7b98234291c 240 case 2: // 前進 再判別 v1+ v2-
smilestone520 27:1696ef46b538 241 if(ticCheck >0) //誤差容忍正負五度
smilestone520 22:d7b98234291c 242 {
smilestone520 22:d7b98234291c 243 v1_ref = 100;
smilestone520 22:d7b98234291c 244 v2_ref = -100;
smilestone520 27:1696ef46b538 245 ticCheck -- ;
smilestone520 22:d7b98234291c 246 }
smilestone520 27:1696ef46b538 247 else
smilestone520 27:1696ef46b538 248 {
smilestone520 27:1696ef46b538 249 bor_state = 1;
smilestone520 27:1696ef46b538 250 ticCheck = 10;
smilestone520 27:1696ef46b538 251 }
smilestone520 27:1696ef46b538 252 break;
smilestone520 27:1696ef46b538 253 case 3: // 後退 再判別 v1- v2+
smilestone520 27:1696ef46b538 254
smilestone520 27:1696ef46b538 255 if(ticCheck >0) //誤差容忍正負五度
smilestone520 27:1696ef46b538 256 {
smilestone520 27:1696ef46b538 257 v1_ref = -100;
smilestone520 27:1696ef46b538 258 v2_ref = +100;
smilestone520 27:1696ef46b538 259 ticCheck -- ;
smilestone520 27:1696ef46b538 260 }
smilestone520 27:1696ef46b538 261 else
smilestone520 27:1696ef46b538 262 {
smilestone520 27:1696ef46b538 263 bor_state = 1;
smilestone520 27:1696ef46b538 264 ticCheck = 10;
smilestone520 27:1696ef46b538 265 }
smilestone520 22:d7b98234291c 266 break;
smilestone520 22:d7b98234291c 267 case 4: // 順時轉到特定角 結束 v1-- v2 --
smilestone520 27:1696ef46b538 268
smilestone520 28:d576b1190610 269 if((borAngle-angleC)> 5 || (borAngle-angleC)<-5)//誤差容忍正負五度
smilestone520 28:d576b1190610 270 {
smilestone520 22:d7b98234291c 271 v1_ref = -100;
smilestone520 22:d7b98234291c 272 v2_ref = -100;
smilestone520 28:d576b1190610 273 }
smilestone520 27:1696ef46b538 274 else
smilestone520 27:1696ef46b538 275 {
smilestone520 27:1696ef46b538 276 borAngle = 0;
smilestone520 27:1696ef46b538 277 aI_State = 2;
smilestone520 27:1696ef46b538 278 bor_state = 1;
smilestone520 22:d7b98234291c 279 }
smilestone520 21:6e8ab9487985 280 break;
smilestone520 22:d7b98234291c 281 case 5: // 逆時轉到特定角 結束 v1 ++ v2++
smilestone520 25:7053736ea6cc 282 if((borAngle-angleC)> 5 || (borAngle-angleC)<-5)//誤差容忍正負五度
smilestone520 23:948ce071cbb6 283 {
smilestone520 23:948ce071cbb6 284 v1_ref = 100;
smilestone520 23:948ce071cbb6 285 v2_ref = 100;
smilestone520 23:948ce071cbb6 286 }
smilestone520 27:1696ef46b538 287 else
smilestone520 27:1696ef46b538 288 {
smilestone520 27:1696ef46b538 289 borAngle = 0;
smilestone520 27:1696ef46b538 290 aI_State = 2;
smilestone520 27:1696ef46b538 291 bor_state = 1;
smilestone520 27:1696ef46b538 292 }
smilestone520 21:6e8ab9487985 293 break;
smilestone520 21:6e8ab9487985 294
smilestone520 21:6e8ab9487985 295 }
smilestone520 21:6e8ab9487985 296
roger5641 17:d96afd9d2692 297 //****to case2
smilestone520 11:44989c0bcea5 298 break;
roger5641 17:d96afd9d2692 299 case 2://move to get ball
roger5641 17:d96afd9d2692 300 if(-3<=angleR<=3) // direct to the ball
roger5641 17:d96afd9d2692 301 {
roger5641 17:d96afd9d2692 302 if(distance<=10) // check夾具距離
roger5641 17:d96afd9d2692 303 {
roger5641 17:d96afd9d2692 304 v1_ref = 0;
roger5641 17:d96afd9d2692 305 v2_ref = 0;
roger5641 17:d96afd9d2692 306 aI_State = 3;
roger5641 17:d96afd9d2692 307 }
roger5641 17:d96afd9d2692 308 else if(10<distance<50)
roger5641 17:d96afd9d2692 309 {
roger5641 17:d96afd9d2692 310 v1_ref = 100;
roger5641 17:d96afd9d2692 311 v2_ref = -100;
roger5641 17:d96afd9d2692 312 }
roger5641 17:d96afd9d2692 313 else
roger5641 17:d96afd9d2692 314 {
roger5641 17:d96afd9d2692 315 v1_ref = 300;
roger5641 17:d96afd9d2692 316 v2_ref = -300;
roger5641 17:d96afd9d2692 317 }
roger5641 17:d96afd9d2692 318 }
roger5641 17:d96afd9d2692 319
roger5641 17:d96afd9d2692 320 else if(3<angleR<=15) // small angle right
roger5641 17:d96afd9d2692 321 {
roger5641 17:d96afd9d2692 322 if(distance<50)
roger5641 17:d96afd9d2692 323 {
roger5641 17:d96afd9d2692 324 v1_ref = 200;
smilestone520 20:5b892e37a958 325 v2_ref = -(v1_ref-angleR*k_turn);
roger5641 17:d96afd9d2692 326 }
roger5641 17:d96afd9d2692 327 else
roger5641 17:d96afd9d2692 328 {
roger5641 17:d96afd9d2692 329 v1_ref = 300;
smilestone520 20:5b892e37a958 330 v2_ref = -(v1_ref-angleR*k_turn);
roger5641 17:d96afd9d2692 331 }
roger5641 17:d96afd9d2692 332
roger5641 17:d96afd9d2692 333 }
smilestone520 20:5b892e37a958 334 else if(-15 <= angleR < -3) // small angle left
roger5641 17:d96afd9d2692 335 {
roger5641 17:d96afd9d2692 336 if(distance<50)
roger5641 17:d96afd9d2692 337 {
smilestone520 20:5b892e37a958 338 v1_ref = -(v2_ref+angleR*k_turn);
roger5641 17:d96afd9d2692 339 v2_ref = 200;
roger5641 17:d96afd9d2692 340 }
roger5641 17:d96afd9d2692 341 else
roger5641 17:d96afd9d2692 342 {
smilestone520 20:5b892e37a958 343 v1_ref = -(v2_ref+angleR*k_turn);
roger5641 17:d96afd9d2692 344 v2_ref = 300;
roger5641 17:d96afd9d2692 345 }
roger5641 17:d96afd9d2692 346
roger5641 17:d96afd9d2692 347 }
roger5641 17:d96afd9d2692 348 else if(15<angleR<=180) // big angle right
roger5641 17:d96afd9d2692 349 {
roger5641 17:d96afd9d2692 350 v1_ref = 200;
roger5641 17:d96afd9d2692 351 v2_ref = 200;
roger5641 17:d96afd9d2692 352 wait(10); //need to count the relation between angle and time in v = 200
roger5641 17:d96afd9d2692 353 if(distance<50)
roger5641 17:d96afd9d2692 354 {
roger5641 17:d96afd9d2692 355 v1_ref = 100;
roger5641 17:d96afd9d2692 356 v2_ref = -100;
roger5641 17:d96afd9d2692 357 }
roger5641 17:d96afd9d2692 358 else
roger5641 17:d96afd9d2692 359 {
roger5641 17:d96afd9d2692 360 v1_ref = 300;
roger5641 17:d96afd9d2692 361 v2_ref = -300;
roger5641 17:d96afd9d2692 362 }
roger5641 17:d96afd9d2692 363
roger5641 17:d96afd9d2692 364 }
roger5641 17:d96afd9d2692 365 else if(-180<=angleR<-15) // big angle left
roger5641 17:d96afd9d2692 366 {
roger5641 17:d96afd9d2692 367 v1_ref = -200;
roger5641 17:d96afd9d2692 368 v2_ref = -200;
roger5641 17:d96afd9d2692 369 wait(10); //need to count the relation between angle and time in v = 200
roger5641 17:d96afd9d2692 370 if(0<distance<50)
roger5641 17:d96afd9d2692 371 {
roger5641 17:d96afd9d2692 372 v1_ref = 100;
roger5641 17:d96afd9d2692 373 v2_ref = -100;
roger5641 17:d96afd9d2692 374 }
roger5641 17:d96afd9d2692 375 else
roger5641 17:d96afd9d2692 376 {
roger5641 17:d96afd9d2692 377 v1_ref = 300;
roger5641 17:d96afd9d2692 378 v2_ref = -300;
roger5641 17:d96afd9d2692 379 }
roger5641 17:d96afd9d2692 380
roger5641 17:d96afd9d2692 381 }
roger5641 17:d96afd9d2692 382
roger5641 17:d96afd9d2692 383 break;
roger5641 17:d96afd9d2692 384 case 3: //****getBall();
roger5641 17:d96afd9d2692 385 if((distance == 10) && (-3<=angleR<=3))
roger5641 17:d96afd9d2692 386 {
roger5641 17:d96afd9d2692 387 angle = -10;
roger5641 17:d96afd9d2692 388 servo_duty = 0.079 + (0.084/180)*angle;
roger5641 17:d96afd9d2692 389 servo.write(servo_duty);
roger5641 17:d96afd9d2692 390 servo = 1;
roger5641 17:d96afd9d2692 391 wait(0.1);
roger5641 17:d96afd9d2692 392 servo = 0;
roger5641 17:d96afd9d2692 393 }
roger5641 17:d96afd9d2692 394 else
roger5641 17:d96afd9d2692 395 aI_State = 2;
roger5641 17:d96afd9d2692 396
smilestone520 11:44989c0bcea5 397 break;
smilestone520 12:c1a667ca6c53 398 case 4: /// move to the gate and release ball
smilestone520 12:c1a667ca6c53 399 // move to the point in front of the gate first
smilestone520 12:c1a667ca6c53 400 // then head to the gate
roger5641 18:2db6c97a4145 401 distanceGate = sqrt(((xGate-xP)*(xGate-xP))+((yGate-yP)*(yGate-yP)));
roger5641 17:d96afd9d2692 402 angleGate = atan2((yGate-yP),(xGate-xP))*180/pi;
roger5641 17:d96afd9d2692 403 if(-3<=angleGate<=3) // direct to the gate
roger5641 17:d96afd9d2692 404 {
roger5641 17:d96afd9d2692 405 if(distanceGate<=10) // check distance between car cemtroid and gate
roger5641 17:d96afd9d2692 406 {
roger5641 17:d96afd9d2692 407 v1_ref = 0;
roger5641 17:d96afd9d2692 408 v2_ref = 0;
roger5641 17:d96afd9d2692 409 aI_State = 5;
roger5641 17:d96afd9d2692 410 }
roger5641 17:d96afd9d2692 411 else if(10<distanceGate<50)
roger5641 17:d96afd9d2692 412 {
roger5641 17:d96afd9d2692 413 v1_ref = 100;
roger5641 17:d96afd9d2692 414 v2_ref = -100;
roger5641 17:d96afd9d2692 415 }
roger5641 17:d96afd9d2692 416 else
roger5641 17:d96afd9d2692 417 {
roger5641 17:d96afd9d2692 418 v1_ref = 300;
roger5641 17:d96afd9d2692 419 v2_ref = -300;
roger5641 17:d96afd9d2692 420 }
roger5641 17:d96afd9d2692 421 }
roger5641 17:d96afd9d2692 422 else if(3<angleGate<=15) // small angle right
roger5641 17:d96afd9d2692 423 {
roger5641 17:d96afd9d2692 424 if(distanceGate<50)
roger5641 17:d96afd9d2692 425 {
roger5641 17:d96afd9d2692 426 v1_ref = 200;
smilestone520 20:5b892e37a958 427 v2_ref = -(v1_ref-angleGate*k_turn);
roger5641 17:d96afd9d2692 428 }
roger5641 17:d96afd9d2692 429 else
roger5641 17:d96afd9d2692 430 {
roger5641 17:d96afd9d2692 431 v1_ref = 300;
smilestone520 20:5b892e37a958 432 v2_ref = -(v1_ref-angleGate*k_turn);
roger5641 17:d96afd9d2692 433 }
roger5641 17:d96afd9d2692 434 }
roger5641 17:d96afd9d2692 435 else if(-15<=angleGate<-3) // small angle left
roger5641 17:d96afd9d2692 436 {
roger5641 17:d96afd9d2692 437 if(distanceGate<50)
roger5641 17:d96afd9d2692 438 {
smilestone520 20:5b892e37a958 439 v1_ref = -(v2_ref+angleGate*k_turn);
roger5641 17:d96afd9d2692 440 v2_ref = 200;
roger5641 17:d96afd9d2692 441 }
roger5641 17:d96afd9d2692 442 else
roger5641 17:d96afd9d2692 443 {
smilestone520 20:5b892e37a958 444 v1_ref = -(v2_ref+angleGate*k_turn);
roger5641 17:d96afd9d2692 445 v2_ref = 300;
roger5641 17:d96afd9d2692 446 }
roger5641 17:d96afd9d2692 447 }
roger5641 17:d96afd9d2692 448 else if(15<angleGate<=180) // big angle right
roger5641 17:d96afd9d2692 449 {
roger5641 17:d96afd9d2692 450 v1_ref = 200;
roger5641 17:d96afd9d2692 451 v2_ref = 200;
roger5641 17:d96afd9d2692 452 wait(10); //need to count the relation between angle and time in v = 200
roger5641 17:d96afd9d2692 453 if(distanceGate<50)
roger5641 17:d96afd9d2692 454 {
roger5641 17:d96afd9d2692 455 v1_ref = 100;
roger5641 17:d96afd9d2692 456 v2_ref = -100;
roger5641 17:d96afd9d2692 457 }
roger5641 17:d96afd9d2692 458 else
roger5641 17:d96afd9d2692 459 {
roger5641 17:d96afd9d2692 460 v1_ref = 300;
roger5641 17:d96afd9d2692 461 v2_ref = -300;
roger5641 17:d96afd9d2692 462 }
roger5641 17:d96afd9d2692 463 }
roger5641 17:d96afd9d2692 464 else if(-180<=angleGate<-15) // big angle left
roger5641 17:d96afd9d2692 465 {
roger5641 17:d96afd9d2692 466 v1_ref = -200;
roger5641 17:d96afd9d2692 467 v2_ref = -200;
roger5641 17:d96afd9d2692 468 wait(10); //need to count the relation between angle and time in v = 200
roger5641 17:d96afd9d2692 469 if(0<distanceGate<50)
roger5641 17:d96afd9d2692 470 {
roger5641 17:d96afd9d2692 471 v1_ref = 100;
roger5641 17:d96afd9d2692 472 v2_ref = -100;
roger5641 17:d96afd9d2692 473 }
roger5641 17:d96afd9d2692 474 else
roger5641 17:d96afd9d2692 475 {
roger5641 17:d96afd9d2692 476 v1_ref = 300;
roger5641 17:d96afd9d2692 477 v2_ref = -300;
roger5641 17:d96afd9d2692 478 }
roger5641 17:d96afd9d2692 479 }
roger5641 17:d96afd9d2692 480
smilestone520 12:c1a667ca6c53 481 break;
roger5641 17:d96afd9d2692 482 case 5: // release ball
roger5641 17:d96afd9d2692 483 if((-3<=angleGate<=3) && (distanceGate<=10)) // direct to the gate
roger5641 17:d96afd9d2692 484 {
roger5641 17:d96afd9d2692 485 angle = 90; // Fixture up
roger5641 17:d96afd9d2692 486 servo_duty = 0.079 + (0.084/180)*angle;
roger5641 17:d96afd9d2692 487 servo.write(servo_duty);
roger5641 17:d96afd9d2692 488 servo = 1;
roger5641 17:d96afd9d2692 489 wait(0.1);
roger5641 17:d96afd9d2692 490 servo = 0;
roger5641 17:d96afd9d2692 491
roger5641 17:d96afd9d2692 492 pwm1.write(0.1f + 0.5f); // push
roger5641 17:d96afd9d2692 493 pwm2.write(-0.1f + 0.5f);
roger5641 17:d96afd9d2692 494 wait(0.5);
roger5641 17:d96afd9d2692 495
roger5641 17:d96afd9d2692 496 angle = -10; // Fixture down
roger5641 17:d96afd9d2692 497 servo_duty = 0.079 + (0.084/180)*angle;
roger5641 17:d96afd9d2692 498 servo.write(servo_duty);
roger5641 17:d96afd9d2692 499 servo = 1;
roger5641 17:d96afd9d2692 500 wait(0.1);
roger5641 17:d96afd9d2692 501 servo = 0;
roger5641 17:d96afd9d2692 502
roger5641 17:d96afd9d2692 503 pwm1.write(-0.3f + 0.5f); // back and leave gate
roger5641 17:d96afd9d2692 504 pwm2.write(0.3f + 0.5f);
roger5641 17:d96afd9d2692 505 wait(1);
roger5641 17:d96afd9d2692 506
roger5641 18:2db6c97a4145 507 aI_State = 0;
roger5641 17:d96afd9d2692 508
roger5641 17:d96afd9d2692 509 }
roger5641 17:d96afd9d2692 510
roger5641 17:d96afd9d2692 511 break;
roger5641 26:dbdbfdb4dd41 512
smilestone520 11:44989c0bcea5 513 }
roger5641 26:dbdbfdb4dd41 514
smilestone520 10:06cc2b1d2aaf 515 }
smilestone520 10:06cc2b1d2aaf 516
smilestone520 10:06cc2b1d2aaf 517 void CN_interrupt(void)
smilestone520 10:06cc2b1d2aaf 518 {
smilestone520 10:06cc2b1d2aaf 519 //Motor 1
smilestone520 10:06cc2b1d2aaf 520 stateA_1 = HallA_1.read();
smilestone520 10:06cc2b1d2aaf 521 stateB_1 = HallB_1.read();
smilestone520 10:06cc2b1d2aaf 522
smilestone520 10:06cc2b1d2aaf 523 ///code for state determination///
smilestone520 10:06cc2b1d2aaf 524 if(stateA_1==0&&stateB_1==0){
smilestone520 10:06cc2b1d2aaf 525 state_1 = 1;}
smilestone520 10:06cc2b1d2aaf 526 else if(stateA_1==0&&stateB_1==1){
smilestone520 10:06cc2b1d2aaf 527 state_1 = 2;}
smilestone520 10:06cc2b1d2aaf 528 else if(stateA_1==1&&stateB_1==1){
smilestone520 10:06cc2b1d2aaf 529 state_1 = 3;}
smilestone520 10:06cc2b1d2aaf 530 else if(stateA_1==1&&stateB_1==0){
smilestone520 10:06cc2b1d2aaf 531 state_1 = 4;}
smilestone520 10:06cc2b1d2aaf 532
smilestone520 10:06cc2b1d2aaf 533 if(state_1 == 1)
smilestone520 10:06cc2b1d2aaf 534 {
smilestone520 10:06cc2b1d2aaf 535 if(state_1-state_1_old == -3)
smilestone520 10:06cc2b1d2aaf 536 v1Count=v1Count+1;
smilestone520 10:06cc2b1d2aaf 537 else if(state_1-state_1_old == -1)
smilestone520 10:06cc2b1d2aaf 538 v1Count=v1Count-1;
smilestone520 10:06cc2b1d2aaf 539 }
smilestone520 10:06cc2b1d2aaf 540 else if(state_1 == 2)
smilestone520 10:06cc2b1d2aaf 541 {
smilestone520 10:06cc2b1d2aaf 542 if(state_1-state_1_old == 1)
smilestone520 10:06cc2b1d2aaf 543 v1Count=v1Count+1;
smilestone520 10:06cc2b1d2aaf 544 else if(state_1-state_1_old == -1)
smilestone520 10:06cc2b1d2aaf 545 v1Count=v1Count-1;
smilestone520 10:06cc2b1d2aaf 546 }
smilestone520 10:06cc2b1d2aaf 547 else if(state_1 == 3)
smilestone520 10:06cc2b1d2aaf 548 {
smilestone520 10:06cc2b1d2aaf 549 if(state_1-state_1_old == 1)
smilestone520 10:06cc2b1d2aaf 550 v1Count=v1Count+1;
smilestone520 10:06cc2b1d2aaf 551 else if(state_1-state_1_old == -1)
smilestone520 10:06cc2b1d2aaf 552 v1Count=v1Count-1;
smilestone520 10:06cc2b1d2aaf 553 }
smilestone520 10:06cc2b1d2aaf 554 else if(state_1 == 4)
smilestone520 10:06cc2b1d2aaf 555 {
smilestone520 10:06cc2b1d2aaf 556 if(state_1-state_1_old == 1)
smilestone520 10:06cc2b1d2aaf 557 v1Count=v1Count+1;
smilestone520 10:06cc2b1d2aaf 558 else if(state_1-state_1_old == 3)
smilestone520 10:06cc2b1d2aaf 559 v1Count=v1Count-1;
smilestone520 10:06cc2b1d2aaf 560 }
smilestone520 10:06cc2b1d2aaf 561 state_1_old = state_1;
smilestone520 10:06cc2b1d2aaf 562
smilestone520 10:06cc2b1d2aaf 563
smilestone520 10:06cc2b1d2aaf 564 //////////////////////////////////
smilestone520 10:06cc2b1d2aaf 565
smilestone520 10:06cc2b1d2aaf 566 //Forward
smilestone520 10:06cc2b1d2aaf 567 //v1Count +1
smilestone520 10:06cc2b1d2aaf 568 //Inverse
smilestone520 10:06cc2b1d2aaf 569 //v1Count -1
smilestone520 10:06cc2b1d2aaf 570
smilestone520 10:06cc2b1d2aaf 571
smilestone520 10:06cc2b1d2aaf 572 //Motor 2
smilestone520 10:06cc2b1d2aaf 573 stateA_2 = HallA_2.read();
smilestone520 10:06cc2b1d2aaf 574 stateB_2 = HallB_2.read();
smilestone520 10:06cc2b1d2aaf 575
smilestone520 10:06cc2b1d2aaf 576 ///code for state determination///
smilestone520 10:06cc2b1d2aaf 577 if(stateA_2==0&&stateB_2==0){
smilestone520 10:06cc2b1d2aaf 578 state_2 = 1;}
smilestone520 10:06cc2b1d2aaf 579 else if(stateA_2==0&&stateB_2==1){
smilestone520 10:06cc2b1d2aaf 580 state_2 = 2;}
smilestone520 10:06cc2b1d2aaf 581 else if(stateA_2==1&&stateB_2==1){
smilestone520 10:06cc2b1d2aaf 582 state_2 = 3;}
smilestone520 10:06cc2b1d2aaf 583 else if(stateA_2==1&&stateB_2==0){
smilestone520 10:06cc2b1d2aaf 584 state_2 = 4;}
smilestone520 10:06cc2b1d2aaf 585
smilestone520 10:06cc2b1d2aaf 586 if(state_2 == 1)
smilestone520 10:06cc2b1d2aaf 587 {
smilestone520 10:06cc2b1d2aaf 588 if(state_2-state_2_old == -3)
smilestone520 10:06cc2b1d2aaf 589 v2Count=v2Count+1;
smilestone520 10:06cc2b1d2aaf 590 else if(state_2-state_2_old == -1)
smilestone520 10:06cc2b1d2aaf 591 v2Count=v2Count-1;
smilestone520 10:06cc2b1d2aaf 592 }
smilestone520 10:06cc2b1d2aaf 593 else if(state_2 == 2)
smilestone520 10:06cc2b1d2aaf 594 {
smilestone520 10:06cc2b1d2aaf 595 if(state_2-state_2_old == 1)
smilestone520 10:06cc2b1d2aaf 596 v2Count=v2Count+1;
smilestone520 10:06cc2b1d2aaf 597 else if(state_2-state_2_old == -1)
smilestone520 10:06cc2b1d2aaf 598 v2Count=v2Count-1;
smilestone520 10:06cc2b1d2aaf 599 }
smilestone520 10:06cc2b1d2aaf 600 else if(state_2 == 3)
smilestone520 10:06cc2b1d2aaf 601 {
smilestone520 10:06cc2b1d2aaf 602 if(state_2-state_2_old == 1)
smilestone520 10:06cc2b1d2aaf 603 v2Count=v2Count+1;
smilestone520 10:06cc2b1d2aaf 604 else if(state_2-state_2_old == -1)
smilestone520 10:06cc2b1d2aaf 605 v2Count=v2Count-1;
smilestone520 10:06cc2b1d2aaf 606 }
smilestone520 10:06cc2b1d2aaf 607 else if(state_2 == 4)
smilestone520 10:06cc2b1d2aaf 608 {
smilestone520 10:06cc2b1d2aaf 609 if(state_2-state_2_old == 1)
smilestone520 10:06cc2b1d2aaf 610 v2Count=v2Count+1;
smilestone520 10:06cc2b1d2aaf 611 else if(state_2-state_2_old == 3)
smilestone520 10:06cc2b1d2aaf 612 v2Count=v2Count-1;
smilestone520 10:06cc2b1d2aaf 613 }
smilestone520 10:06cc2b1d2aaf 614 state_2_old = state_2;
smilestone520 10:06cc2b1d2aaf 615
smilestone520 10:06cc2b1d2aaf 616 //////////////////////////////////
smilestone520 10:06cc2b1d2aaf 617
smilestone520 10:06cc2b1d2aaf 618 //Forward
smilestone520 10:06cc2b1d2aaf 619 //v2Count +1
smilestone520 10:06cc2b1d2aaf 620 //Inverse
smilestone520 10:06cc2b1d2aaf 621 //v2Count -1
smilestone520 10:06cc2b1d2aaf 622 }
smilestone520 10:06cc2b1d2aaf 623
smilestone520 10:06cc2b1d2aaf 624 void init_TIMER(void)
smilestone520 10:06cc2b1d2aaf 625 {
smilestone520 10:06cc2b1d2aaf 626 timer1.attach_us(&timer1_interrupt, 10000);//10ms interrupt period (100 Hz)
smilestone520 10:06cc2b1d2aaf 627 }
smilestone520 10:06cc2b1d2aaf 628
smilestone520 10:06cc2b1d2aaf 629 void init_PWM(void)
smilestone520 10:06cc2b1d2aaf 630 {
smilestone520 10:06cc2b1d2aaf 631 pwm1.period_us(50);
smilestone520 10:06cc2b1d2aaf 632 pwm1.write(0.5);
smilestone520 10:06cc2b1d2aaf 633 TIM1->CCER |= 0x4;
smilestone520 10:06cc2b1d2aaf 634
smilestone520 10:06cc2b1d2aaf 635 pwm2.period_us(50);
smilestone520 10:06cc2b1d2aaf 636 pwm2.write(0.5);
smilestone520 10:06cc2b1d2aaf 637 TIM1->CCER |= 0x40;
smilestone520 10:06cc2b1d2aaf 638 }
smilestone520 10:06cc2b1d2aaf 639
smilestone520 10:06cc2b1d2aaf 640 void init_CN(void)
smilestone520 10:06cc2b1d2aaf 641 {
smilestone520 10:06cc2b1d2aaf 642 HallA_1.rise(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 643 HallA_1.fall(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 644 HallB_1.rise(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 645 HallB_1.fall(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 646
smilestone520 10:06cc2b1d2aaf 647 HallA_2.rise(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 648 HallA_2.fall(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 649 HallB_2.rise(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 650 HallB_2.fall(&CN_interrupt);
smilestone520 10:06cc2b1d2aaf 651
smilestone520 10:06cc2b1d2aaf 652 stateA_1 = HallA_1.read();
smilestone520 10:06cc2b1d2aaf 653 stateB_1 = HallB_1.read();
smilestone520 10:06cc2b1d2aaf 654 stateA_2 = HallA_2.read();
smilestone520 10:06cc2b1d2aaf 655 stateB_2 = HallB_2.read();
smilestone520 20:5b892e37a958 656 }
smilestone520 20:5b892e37a958 657
smilestone520 20:5b892e37a958 658 //**************** funcBorder() *****************************************
smilestone520 20:5b892e37a958 659
smilestone520 20:5b892e37a958 660 void funcBorder(void) // check if car is too close to the border // miss the ball restriction part
smilestone520 20:5b892e37a958 661 {
smilestone520 20:5b892e37a958 662 if(yC > yB1 || yC < yB2 || xC < xB3 || xC > xB4){
smilestone520 20:5b892e37a958 663
smilestone520 20:5b892e37a958 664 if(yC > yB1) // 靠近上邊界 *****************************
smilestone520 20:5b892e37a958 665 {
smilestone520 20:5b892e37a958 666 if(xC < xB3) //左上角
smilestone520 20:5b892e37a958 667 {
smilestone520 20:5b892e37a958 668 if(angleC <0 && angleC >=-90) // I
smilestone520 23:948ce071cbb6 669 {
smilestone520 23:948ce071cbb6 670 bor_state = 4; //clockwise, to angleC = 45
smilestone520 23:948ce071cbb6 671 borAngle = 45;
smilestone520 23:948ce071cbb6 672 }
smilestone520 20:5b892e37a958 673
smilestone520 20:5b892e37a958 674 else if(angleC > -180 && angleC <-90) // II
smilestone520 23:948ce071cbb6 675 bor_state = 3; //back 0.5*longC, judge again
smilestone520 20:5b892e37a958 676
smilestone520 20:5b892e37a958 677 else if(angleC <=180 && angleC >=90) // III
smilestone520 23:948ce071cbb6 678 {
smilestone520 23:948ce071cbb6 679 bor_state = 5;//counter clockwise, to angleC = 45
smilestone520 23:948ce071cbb6 680 borAngle = 45;
smilestone520 23:948ce071cbb6 681 }
smilestone520 20:5b892e37a958 682
smilestone520 20:5b892e37a958 683 else if(angleC < 90 && angleC >=0) // IV
smilestone520 23:948ce071cbb6 684 bor_state = 2;//forward 0.5*longC, judge again
smilestone520 20:5b892e37a958 685
smilestone520 20:5b892e37a958 686 }
smilestone520 20:5b892e37a958 687 else if(xC > xB4) //右上角
smilestone520 20:5b892e37a958 688 {
smilestone520 20:5b892e37a958 689 if(angleC <0 && angleC >=-90) // I
smilestone520 23:948ce071cbb6 690 bor_state = 3;//back 0.5*longC, judge again
smilestone520 20:5b892e37a958 691
smilestone520 20:5b892e37a958 692 else if(angleC > -180 && angleC <-90) // II
smilestone520 23:948ce071cbb6 693 {
smilestone520 23:948ce071cbb6 694 bor_state = 5;//counter clockwise, to angleC = 135
smilestone520 23:948ce071cbb6 695 borAngle = 135;
smilestone520 23:948ce071cbb6 696 }
smilestone520 20:5b892e37a958 697
smilestone520 20:5b892e37a958 698 else if(angleC <=180 && angleC >=90) // III
smilestone520 23:948ce071cbb6 699 bor_state = 2;//forward 0.5*longC, judge again
smilestone520 20:5b892e37a958 700
smilestone520 20:5b892e37a958 701 else if(angleC < 90 && angleC >=0) // IV
smilestone520 23:948ce071cbb6 702 {
smilestone520 23:948ce071cbb6 703 bor_state = 4;//clockwise, to angleC = 135
smilestone520 23:948ce071cbb6 704 borAngle = 135;
smilestone520 23:948ce071cbb6 705 }
smilestone520 23:948ce071cbb6 706
smilestone520 20:5b892e37a958 707 }
smilestone520 20:5b892e37a958 708 else //上邊界
smilestone520 20:5b892e37a958 709 {
smilestone520 20:5b892e37a958 710 if(angleC == -90 || angleC == 90)
smilestone520 24:f61847968e72 711 aI_State = 2; // do nothing, turn to next point
smilestone520 20:5b892e37a958 712 else
smilestone520 24:f61847968e72 713 {
smilestone520 24:f61847968e72 714 if(0 > borAngle >= -90 || 90< borAngle <=0) //CW
smilestone520 24:f61847968e72 715 {
smilestone520 24:f61847968e72 716 bor_state = 4;
smilestone520 24:f61847968e72 717 borAngle = 90;
smilestone520 24:f61847968e72 718 }
smilestone520 24:f61847968e72 719 else
smilestone520 24:f61847968e72 720 {
smilestone520 24:f61847968e72 721 bor_state = 5;
smilestone520 24:f61847968e72 722 borAngle = 90;
smilestone520 24:f61847968e72 723 }
smilestone520 24:f61847968e72 724 } // turn to 90, then turn to next point
smilestone520 20:5b892e37a958 725 }
smilestone520 20:5b892e37a958 726
smilestone520 20:5b892e37a958 727
smilestone520 20:5b892e37a958 728 }
smilestone520 20:5b892e37a958 729 else if(yC < yB2) // 靠近下邊界 *E****************************************************88
smilestone520 20:5b892e37a958 730 {
smilestone520 20:5b892e37a958 731 if(xC < xB3) //左下角
smilestone520 20:5b892e37a958 732 {
smilestone520 20:5b892e37a958 733 if(angleC <0 && angleC >=-90) // I
smilestone520 23:948ce071cbb6 734 bor_state = 2; //forward 0.5*longC, judge again
smilestone520 23:948ce071cbb6 735
smilestone520 20:5b892e37a958 736 else if(angleC > -180 && angleC <-90) // II
smilestone520 23:948ce071cbb6 737 {
smilestone520 23:948ce071cbb6 738 bor_state = 4; //clockwise, to angleC = -45
smilestone520 23:948ce071cbb6 739 borAngle = -45;
smilestone520 23:948ce071cbb6 740 }
smilestone520 20:5b892e37a958 741
smilestone520 20:5b892e37a958 742 else if(angleC <=180 && angleC >=90) // III
smilestone520 23:948ce071cbb6 743 bor_state = 3;//back 0.5*longC, judge again
smilestone520 20:5b892e37a958 744
smilestone520 20:5b892e37a958 745 else if(angleC < 90 && angleC >=0) // IV
smilestone520 23:948ce071cbb6 746 {
smilestone520 23:948ce071cbb6 747 bor_state = 5;//counter clockwise, to angleC = -45
smilestone520 23:948ce071cbb6 748 borAngle = -45;
smilestone520 23:948ce071cbb6 749 }
smilestone520 20:5b892e37a958 750
smilestone520 20:5b892e37a958 751 }
smilestone520 20:5b892e37a958 752 else if(xC > xB4) //右下角
smilestone520 20:5b892e37a958 753 {
smilestone520 20:5b892e37a958 754 if(angleC <0 && angleC >=-90) // I
smilestone520 23:948ce071cbb6 755 {
smilestone520 23:948ce071cbb6 756 bor_state = 5;//counter clockwise, to angleC = -135
smilestone520 23:948ce071cbb6 757 borAngle = -135;
smilestone520 23:948ce071cbb6 758 }
smilestone520 20:5b892e37a958 759
smilestone520 20:5b892e37a958 760 else if(angleC > -180 && angleC <-90) // II
smilestone520 23:948ce071cbb6 761 bor_state = 2;//forward 0.5*longC, judge again
smilestone520 20:5b892e37a958 762
smilestone520 20:5b892e37a958 763 else if(angleC <=180 && angleC >=90) // III
smilestone520 23:948ce071cbb6 764 {
smilestone520 23:948ce071cbb6 765 bor_state = 4;//clockwise, to angleC = -135
smilestone520 23:948ce071cbb6 766 borAngle = -135;
smilestone520 23:948ce071cbb6 767 }
smilestone520 20:5b892e37a958 768
smilestone520 20:5b892e37a958 769 else if(angleC < 90 && angleC >=0) // IV
smilestone520 23:948ce071cbb6 770 bor_state = 3;//back 0.5*longC, judge again
smilestone520 20:5b892e37a958 771
smilestone520 20:5b892e37a958 772 }
smilestone520 20:5b892e37a958 773 else //下邊界
smilestone520 20:5b892e37a958 774 {
smilestone520 20:5b892e37a958 775 if(angleC == -90 || angleC == 90)
smilestone520 24:f61847968e72 776 aI_State = 2; // do nothing, turn to next point
smilestone520 20:5b892e37a958 777 else
smilestone520 24:f61847968e72 778 {
smilestone520 24:f61847968e72 779 if(0 > borAngle >= -90 || 90< borAngle <=0) //CCW
smilestone520 24:f61847968e72 780 {
smilestone520 24:f61847968e72 781 bor_state = 5;
smilestone520 24:f61847968e72 782 borAngle = -90;
smilestone520 24:f61847968e72 783 }
smilestone520 24:f61847968e72 784 else
smilestone520 24:f61847968e72 785 {
smilestone520 24:f61847968e72 786 bor_state = 4;
smilestone520 24:f61847968e72 787 borAngle = -90;
smilestone520 24:f61847968e72 788 }
smilestone520 24:f61847968e72 789 } // turn to -90, then turn to next point
smilestone520 20:5b892e37a958 790 }
smilestone520 20:5b892e37a958 791
smilestone520 20:5b892e37a958 792
smilestone520 20:5b892e37a958 793 }
smilestone520 20:5b892e37a958 794 else if(xC < xB3) //靠近左邊界****************************************************************
smilestone520 20:5b892e37a958 795 {
smilestone520 20:5b892e37a958 796 if(angleC == 0 || angleC == 180)
smilestone520 23:948ce071cbb6 797 aI_State = 2; // do nothing, turn to next point
smilestone520 24:f61847968e72 798
smilestone520 24:f61847968e72 799 else if(-180 < angleC < 0) // CW
smilestone520 24:f61847968e72 800 {
smilestone520 24:f61847968e72 801 bor_state = 4;
smilestone520 24:f61847968e72 802 borAngle = 0;
smilestone520 24:f61847968e72 803 }
smilestone520 20:5b892e37a958 804 else
smilestone520 23:948ce071cbb6 805 {
smilestone520 24:f61847968e72 806 bor_state = 5;
smilestone520 24:f61847968e72 807 borAngle = 0;
smilestone520 24:f61847968e72 808 }
smilestone520 24:f61847968e72 809 // turn to 0, then turn to next point
smilestone520 20:5b892e37a958 810 }
smilestone520 20:5b892e37a958 811
smilestone520 20:5b892e37a958 812 else if(xC > xB4) //靠近右邊界 *********************************************88
smilestone520 20:5b892e37a958 813 {
smilestone520 20:5b892e37a958 814 if(angleC == 0 || angleC == 180)
smilestone520 23:948ce071cbb6 815 aI_State = 2; // do nothing, turn to next point
smilestone520 24:f61847968e72 816
smilestone520 24:f61847968e72 817 else if(-180 < angleC < 0) // CCW
smilestone520 24:f61847968e72 818 {
smilestone520 24:f61847968e72 819 bor_state = 5;
smilestone520 24:f61847968e72 820 borAngle = 180;
smilestone520 24:f61847968e72 821 } // turn to 90, then turn to next point
smilestone520 23:948ce071cbb6 822 else
smilestone520 24:f61847968e72 823 {
smilestone520 24:f61847968e72 824 bor_state = 4;
smilestone520 24:f61847968e72 825 borAngle = 180;
smilestone520 24:f61847968e72 826 }
smilestone520 23:948ce071cbb6 827 }
smilestone520 23:948ce071cbb6 828 }
smilestone520 23:948ce071cbb6 829 else
smilestone520 23:948ce071cbb6 830 {aI_State = 2;}
smilestone520 23:948ce071cbb6 831 } // funcBorder()
smilestone520 23:948ce071cbb6 832
smilestone520 20:5b892e37a958 833 //**************** smallAngle() *****************************************
smilestone520 20:5b892e37a958 834
smilestone520 20:5b892e37a958 835 void smallAngle( float goodAngle ) // use the smallest turn to right angle ccw / cw, based on 0~360 degree system
smilestone520 24:f61847968e72 836 {
smilestone520 20:5b892e37a958 837 if(angleR > 0) // CW
smilestone520 20:5b892e37a958 838 {
smilestone520 20:5b892e37a958 839 // turn clockwise to goodAngle;
smilestone520 20:5b892e37a958 840 }
smilestone520 20:5b892e37a958 841 else if(angleR < 0) //CCW
smilestone520 20:5b892e37a958 842 {
smilestone520 20:5b892e37a958 843 // turn counter clockwise to goodAngle;
smilestone520 20:5b892e37a958 844 }
smilestone520 20:5b892e37a958 845
smilestone520 24:f61847968e72 846 }
smilestone520 20:5b892e37a958 847 //*************** turnCW() ***********************************
smilestone520 20:5b892e37a958 848
smilestone520 20:5b892e37a958 849 void turnCW(float goodAngle)
smilestone520 20:5b892e37a958 850 {
smilestone520 20:5b892e37a958 851 // turn clockwise to goodAngle;
smilestone520 20:5b892e37a958 852 }
smilestone520 20:5b892e37a958 853
smilestone520 20:5b892e37a958 854 //*************** turnCCW() ***********************************
smilestone520 20:5b892e37a958 855
smilestone520 20:5b892e37a958 856 void turnCCW(float goodAngle)
smilestone520 20:5b892e37a958 857 {
smilestone520 20:5b892e37a958 858 // turn counter clockwise to goodAngle;
smilestone520 10:06cc2b1d2aaf 859 }