2014_Ensoul_Capstone

Dependencies:   TextLCD Ultrasonic mbed BufferedSoftSerial

Revision:
4:fd36ff807a91
Parent:
3:59a400d203cc
Child:
5:58e37c4502ea
--- a/main.cpp	Thu Jul 03 17:50:19 2014 +0000
+++ b/main.cpp	Fri Jul 04 06:34:04 2014 +0000
@@ -21,7 +21,6 @@
 DigitalOut RMotor_EN(p5);
 DigitalOut LMotor_EN(p6);
 
-Ticker control;
 Timeout casemeasure;
 Timeout motortime;
 Timeout backmotortime;
@@ -32,7 +31,7 @@
 float length;
 int dis_L,dis_R,dis_F = 80;
 int F_len;
-int move,measure=1,flag=1,clag =1;
+int move=1,measure=1,flag=1,clag =1;
 int rssi1[5],rssi2[5],rssi3[5];
 
 double d1, d2, d3, alpha, angle, distance; //정면, 좌측, 우측, 각도, 최종 각도, 최종 거리
@@ -145,24 +144,24 @@
     dis_F =100;
     dis_L =100;
     dis_R =100;
-   // measure =0;
+    // measure =0;
     flag=1;
 }
 
 void backcount()
 {
     move = 1;
-   // measure =0;
+    // measure =0;
 }
 void Rightcount()
 {
     move = 2;
-   // measure =0;
+    // measure =0;
 }
 void Leftcount()
 {
     move = 3;
-   // measure =0;
+    // measure =0;
 }
 
 void measure_case1()
@@ -176,232 +175,224 @@
     //measure =0;
     clag =1;
 }
-void control_func()
-{
-
-    //거리측정
-    if(dis_F==F_sonic_F.read()/10) {
-        dis_F = 80;
-    }
-    if(dis_R==F_sonic_R.read()/10) {
-        dis_R = 90;
-    }
-    if(dis_L==F_sonic_L.read()/10) {
-        dis_L = 90;
-    }
-
-    if(dis_F!=F_sonic_F.read()/10) {
-        dis_F = F_sonic_F.read()/10;
-    }
-    if(dis_R!=F_sonic_R.read()/10) {
-        dis_R = F_sonic_R.read()/10;
-    }
-    if(dis_L!=F_sonic_L.read()/10) {
-        dis_L = F_sonic_L.read()/10;
-    }
-
-    /* if(dis_R <50) {
-             if(dis_L <50){
-                 if(dis_F >50){
-             move =0;}}}
-     else if(dis_L <50) {
-             if(dis_R <50){
-                 if(dt is_F >50){
-             move =0;}}}*/
-
-
-    switch(measure) {
-        case 0:
-            if(dis_F >30) {
-                if(dis_R <50) {
-                    if((dis_R + 5) < dis_L) {
-                        move =2;
-                    }
-                } else if(dis_L <50) {
-                    if((dis_L + 5) < dis_R) {
-                        move =3;
-                    }
-                } else {
-                    move =0;
-                }
-            } else if(dis_F<30) {
-                move =1;
-            }
-            if(dis_R <10) {
-                move=5;
-            } else if(dis_L <10) {
-                move =6;
-            } else if((dis_R <25) &&(dis_L<25)) {
-                move =4;
-            } else if(dis_R <35) {
-                move =2;
-            } else if(dis_L <35) {
-                move =3;
-            }
-            if(clag ==1) {
-                clag =0;
-                casemeasure.attach(&measure_case1,3.0);
-            }
-            break;
-
-        case 1:
-            if((distance >500.0) && ((angle*180/3.14) < 10.0) && ((angle*180/3.14) > -10.0)) {
-                move = 1;// measure =0; flag =0;
-            } else if((distance >500.0) && ((angle*180/3.14) > 10.0)) {
-                move = 2;
-            } else if((distance >500.0) && ((angle*180/3.14) < -10.0)) {
-                move = 3;
-            }
-           /* if(clag ==1){
-                if(distance >500.0) {
-                    clag =0;
-                    casemeasure.attach(&measure_case0,1);
-                }
-            }*/
-            break;
-    }
-    switch(move) {
-        case 0://Front
-            Front();
-            break;
-
-        case 1://Back
-            Stop();
-            break;
-
-        case 2://Right
-            Turn_R();
-            if (flag==1) {
-                flag=0;
-                motortime.attach(&count,1);
-            }
-            break;
-
-        case 3://Left
-            Turn_L();
-            if (flag==1) {
-                flag=0;
-                motortime.attach(&count,1);
-            }
-            break;
-
-        case 4://back
-            Back();
-            backmotortime.attach(&backcount,2);
-            break;
-        case 5://Right
-            Back();
-            Rightmotortime.attach(&Rightcount,2);
-            break;
-        case 6://back
-            Back();
-            Leftmotortime.attach(&Leftcount,2);
-            break;
-    }
-}
 
 int main()
 {
 
     int Gc=0;
 
-    control.attach(&control_func,0.1);
     xbee1.attach(&callback1);
     xbee2.attach(&callback2);
     xbee3.attach(&callback3);
 
+    xbee1.printf("+++");
+    wait(0.05);
+    xbee2.printf("+++");
+    wait(0.05);
+    xbee3.printf("+++");
+    wait(1);
+
     while(1) {
-        xbee1.printf("+++");
-        wait(0.05);
-        xbee2.printf("+++");
-        wait(0.05);
-        xbee3.printf("+++");
-        wait(1);
+
         xbeecount1=0;
+        xbeecount2=0;
+        xbeecount3=0;
         xbeeflag1 = 1;
+        xbeeflag2 = 1;
+        xbeeflag3 = 1;
         xbee1.printf("ATDB\r");
         wait(0.05);
-        xbeecount2=0;
-        xbeeflag2 = 1;
         xbee2.printf("ATDB\r");
         wait(0.05);
-        xbeecount3=0;
-        xbeeflag3 = 1;
         xbee3.printf("ATDB\r");
-        wait(1);
+        wait(0.05);
         xbeeflag1 = 0;
         xbeeflag2 = 0;
         xbeeflag3 = 0;
+        //xbee1.printf("ATCN\r");
+        //wait(0.05);
+        //xbee2.printf("ATCN\r");
+        //wait(0.05);
+        //xbee3.printf("ATCN\r");
+
         rssi1[Gc] = strtol( xbeebuf1, &stop , 16 );
         rssi2[Gc] = strtol( xbeebuf2, &stop , 16 );
         rssi3[Gc] = strtol( xbeebuf3, &stop , 16 );
-        xbee1.printf("ATCN\r");
-        wait(0.05);
-        xbee2.printf("ATCN\r");
-        wait(0.05);
-        xbee3.printf("ATCN\r");
-        wait(1);
 
         rssi1_sum = 0;
         rssi2_sum = 0;
         rssi3_sum = 0;
 
-        for (int i=0; i<3; i++) {
+        for (int i=0; i<5; i++) {
             rssi1_sum += rssi1[i];
             rssi2_sum += rssi2[i];
             rssi3_sum += rssi3[i];
         }
-        rssi1_avg = rssi1_sum / 3.0;
-        rssi2_avg = rssi2_sum / 3.0;
-        rssi3_avg = rssi3_sum / 3.0;
-
+        rssi1_avg = rssi1_sum / 5.0;
+        rssi2_avg = rssi2_sum / 5.0;
+        rssi3_avg = rssi3_sum / 5.0;
 
-        printf("RSSI:%ddBm,%ddBm,%ddBm\n",rssi1[Gc],rssi2[Gc],rssi3[Gc]);
-        bt.printf("RSSI:%ddBm,%ddBm,%ddBm\n",rssi1[Gc],rssi2[Gc],rssi3[Gc]);
-        printf("AVG :%fdBm,%fdBm,%fdBm\n",rssi1_avg,rssi2_avg,rssi3_avg);
-
-        d1 = rssi1_avg*20;
-        d2 = rssi2_avg*20;
-        d3 = rssi3_avg*20;
-
-        printf("DIST:%f, %f, %f\n\n",d1,d2,d3);
+        d1 = (rssi1_avg-20)*10;
+        d2 = (rssi2_avg-20)*10;
+        d3 = (rssi3_avg-20)*10;
 
         if (d2 == d3) { //center
             if(d1 <= d3) { //front
-                alpha = acos( (d3*d3+400.0*400.0-d2*d2)/(2*d3*400.0) );
+                alpha = acos( (d3*d3+200.0*200.0-d2*d2)/(2*d3*200.0) );
                 angle = 0;
                 distance =  d3 * sin(alpha) / sin(1.57-angle);
             } else if (d1 > d3) { //rear
-                alpha = acos( (d3*d3+400.0*400.0-d2*d2)/(2*d3*400.0) );
+                alpha = acos( (d3*d3+200.0*200.0-d2*d2)/(2*d3*200.0) );
                 angle = 3.14;
                 distance =  d3 * sin(alpha) / sin(1.57-angle);
             }
         } else if(d2 < d3) { //left
             if(d1 <= d3) { //front
-                alpha = acos( (d3*d3+400.0*400.0-d2*d2)/(2*d3*400.0) );
-                angle = 1.57 - atan( (d3 * sin(alpha))/(d3 * cos(alpha) - 200.0)); // +0 ~ +90
+                alpha = acos( (d3*d3+200.0*200.0-d2*d2)/(2*d3*200.0) );
+                angle = 1.57 - atan( (d3 * sin(alpha))/(d3 * cos(alpha) - 100.0)); // +0 ~ +90
                 distance = d3 * sin(alpha) / sin(1.57-angle);
             } else if (d1 > d3) { //rear
-                alpha = acos( (d3*d3+400.0*400.0-d2*d2)/(2*d3*400.0) );
-                angle = 1.57 + atan( (d3 * sin(alpha))/(d3 * cos(alpha) - 200.0)); // // +90 ~ +180
+                alpha = acos( (d3*d3+200.0*200.0-d2*d2)/(2*d3*200.0) );
+                angle = 1.57 + atan( (d3 * sin(alpha))/(d3 * cos(alpha) - 100.0)); // // +90 ~ +180
                 distance = d3 * sin(alpha) / sin(1.57-angle);
             }
 
         } else if(d2 > d3) { //right
             if(d1 <= d2) { //front
-                alpha = acos( (d2*d2+400.0*400.0-d3*d3)/(2*d2*400.0) );
-                angle = -1.57 + atan( (d2 * sin(alpha))/(d2 * cos(alpha) - 200.0)) ; // -0 ~ -90
+                alpha = acos( (d2*d2+200.0*200.0-d3*d3)/(2*d2*200.0) );
+                angle = -1.57 + atan( (d2 * sin(alpha))/(d2 * cos(alpha) - 100.0)) ; // -0 ~ -90
                 distance = d2 * sin(alpha) / sin(1.57+angle);
             } else if (d1 > d2) { //rear
-                alpha = acos( (d2*d2+400.0*400.0-d3*d3)/(2*d2*400.0) );
-                angle = -1.57 - atan( (d2 * sin(alpha))/(d2 * cos(alpha) - 200.0)); // -90 ~ -180
+                alpha = acos( (d2*d2+200.0*200.0-d3*d3)/(2*d2*200.0) );
+                angle = -1.57 - atan( (d2 * sin(alpha))/(d2 * cos(alpha) - 100.0)); // -90 ~ -180
                 distance = d2 * sin(alpha) / sin(1.57+angle);
             }
         }
 
-        printf("alpha : %f, angle : %f, distance : %f move = %d %d\n\n",alpha*180/3.14,angle*180/3.14,distance,move,measure);//++ left
-bt.printf("alpha : %f, angle : %f, distance : %f move = %d %d\n\n",alpha*180/3.14,angle*180/3.14,distance,move,measure);//++ left
-        if(Gc<2) {
+        printf("RSSI:%ddBm,%ddBm,%ddBm   AVG :%fdBm,%fdBm,%fdBm    alpha : %f, angle : %f, distance : %f move = %d   \r",rssi1[Gc],rssi2[Gc],rssi3[Gc],rssi1_avg,rssi2_avg,rssi3_avg,alpha*180/3.14,angle*180/3.14,distance,move);
+        bt.printf("RSSI:%ddBm,%ddBm,%ddBm   AVG :%fdBm,%fdBm,%fdBm    alpha : %f, angle : %f, distance : %f move = %d   \r",rssi1[Gc],rssi2[Gc],rssi3[Gc],rssi1_avg,rssi2_avg,rssi3_avg,alpha*180/3.14,angle*180/3.14,distance,move);
+
+        //거리측정
+        if(dis_F==F_sonic_F.read()/10) {
+            dis_F = 80;
+        }
+        if(dis_R==F_sonic_R.read()/10) {
+            dis_R = 90;
+        }
+        if(dis_L==F_sonic_L.read()/10) {
+            dis_L = 90;
+        }
+
+        if(dis_F!=F_sonic_F.read()/10) {
+            dis_F = F_sonic_F.read()/10;
+        }
+        if(dis_R!=F_sonic_R.read()/10) {
+            dis_R = F_sonic_R.read()/10;
+        }
+        if(dis_L!=F_sonic_L.read()/10) {
+            dis_L = F_sonic_L.read()/10;
+        }
+
+        /* if(dis_R <50) {
+                 if(dis_L <50){
+                     if(dis_F >50){
+                 move =0;}}}
+         else if(dis_L <50) {
+                 if(dis_R <50){
+                     if(dt is_F >50){
+                 move =0;}}}*/
+
+
+        switch(measure) {
+            case 0:
+                if(dis_F >30) {
+                    if(dis_R <50) {
+                        if((dis_R + 5) < dis_L) {
+                            move =2;
+                        }
+                    } else if(dis_L <50) {
+                        if((dis_L + 5) < dis_R) {
+                            move =3;
+                        }
+                    } else {
+                        move =0;
+                    }
+                } else if(dis_F<30) {
+                    move =1;
+                }
+                if(dis_R <10) {
+                    move=5;
+                } else if(dis_L <10) {
+                    move =6;
+                } else if((dis_R <25) &&(dis_L<25)) {
+                    move =4;
+                } else if(dis_R <35) {
+                    move =2;
+                } else if(dis_L <35) {
+                    move =3;
+                }
+                if(clag ==1) {
+                    clag =0;
+                    casemeasure.attach(&measure_case1,3.0);
+                }
+                break;
+
+            case 1:
+                if((distance >500.0) && ((angle*180/3.14) < 20.0) && ((angle*180/3.14) > -20.0)) {
+                    move = 1;// measure =0; flag =0;
+                } else if((distance >500.0) && ((angle*180/3.14) > 20.0)) {
+                    move = 2;
+                } else if((distance >500.0) && ((angle*180/3.14) < -20.0)) {
+                    move = 3;
+                }
+                /* if(clag ==1){
+                     if(distance >500.0) {
+                         clag =0;
+                         casemeasure.attach(&measure_case0,1);
+                     }
+                 }*/
+                break;
+        }
+        switch(move) {
+            case 0://Front
+                Front();
+                break;
+
+            case 1://Back
+                Stop();
+                break;
+
+            case 2://Right
+                Turn_R();
+                if (flag==1) {
+                    flag=0;
+                    motortime.attach(&count,1);
+                }
+                break;
+
+            case 3://Left
+                Turn_L();
+                if (flag==1) {
+                    flag=0;
+                    motortime.attach(&count,1);
+                }
+                break;
+
+            case 4://back
+                Back();
+                backmotortime.attach(&backcount,2);
+                break;
+            case 5://Right
+                Back();
+                Rightmotortime.attach(&Rightcount,2);
+                break;
+            case 6://back
+                Back();
+                Leftmotortime.attach(&Leftcount,2);
+                break;
+        }
+
+        if(Gc<4) {
             Gc++;
         } else {
             Gc=0;