2014_Ensoul_Capstone

Dependencies:   TextLCD Ultrasonic mbed BufferedSoftSerial

Revision:
2:c9740fccf3a7
Parent:
1:2859bfed20b4
Child:
3:59a400d203cc
--- a/main.cpp	Thu Jul 03 05:24:13 2014 +0000
+++ b/main.cpp	Thu Jul 03 07:34:06 2014 +0000
@@ -3,6 +3,10 @@
 #include "mbed.h"
 #include "Ultrasonic.h"
 
+Serial xbee1(p9, p10); // tx, rx
+Serial xbee2(p13, p14);
+Serial xbee3(p28, p27);
+
 AnalogIn Sharp(p20);
 Ultrasonic F_sonic_R(p11,p11);
 Ultrasonic F_sonic_L(p12,p12);
@@ -14,12 +18,67 @@
 PwmOut LMotor_Back(p24);
 DigitalOut RMotor_EN(p5);
 DigitalOut LMotor_EN(p6);
+
+Ticker control;
 Timeout motortime;
 Timeout backmotortime;
 Timeout Rightmotortime;
 Timeout Leftmotortime;
+
 float a,b =0;
 float length;
+int dis_L,dis_R,dis_F = 80;
+int F_len;
+int move,measure,flag=1;
+int rssi1[5],rssi2[5],rssi3[5];
+
+double d1, d2, d3, alpha, angle, distance; //정면, 좌측, 우측, 각도, 최종 각도, 최종 거리
+double rssi1_sum,rssi2_sum,rssi3_sum,rssi1_avg,rssi2_avg,rssi3_avg;
+
+char xbeechar1, xbeebuf1[3], xbeechar2, xbeebuf2[3] ,xbeechar3, xbeebuf3[3];
+int xbeeflag1=0, xbeecount1=0, xbeeflag2=0, xbeecount2=0, xbeeflag3=0, xbeecount3=0;
+
+char *stop;
+
+void callback1()
+{
+    xbeechar1 = xbee1.getc();
+    if(xbeechar1 == '\r') {
+        //pc.printf("\n");
+    } else if ((xbeechar1 != 'T')&&(xbeechar1 != 'O')&&(xbeechar1 != 'K')) {
+        //pc.printf("%c", xbeechar1);
+    }
+    if(xbeeflag1 == 1) {
+        xbeebuf1[xbeecount1++]=xbeechar1;
+    }
+}
+void callback2()
+{
+    xbeechar2 = xbee2.getc();
+    if(xbeechar2 == '\r') {
+        //pc.printf("\n");
+
+    } else if ((xbeechar2 != 'T')&&(xbeechar2 != 'O')&&(xbeechar2 != 'K')) {
+        //pc.printf("%c", xbeechar2);
+    }
+    if(xbeeflag2 == 1) {
+        xbeebuf2[xbeecount2++]=xbeechar2;
+    }
+}
+void callback3()
+{
+    xbeechar3 = xbee3.getc();
+    if(xbeechar3 == '\r') {
+        //pc.printf("\n");
+
+    } else if ((xbeechar3 != 'T')&&(xbeechar3 != 'O')&&(xbeechar3 != 'K')) {
+        //pc.printf("%c", xbeechar3);
+    }
+    if(xbeeflag3 == 1) {
+        xbeebuf3[xbeecount3++]=xbeechar3;
+    }
+}
+
 void Front()
 {
     RMotor_EN = 1;
@@ -79,9 +138,7 @@
 }
 
 
-int dis_L,dis_R,dis_F = 80;
-int F_len;
-int move,measure,flag=1;
+
 
 void count()
 {
@@ -93,119 +150,241 @@
     flag=1;
 }
 
-void backcount(){
-    move = 1; measure =0;
+void backcount()
+{
+    move = 1;
+    measure =0;
+}
+void Rightcount()
+{
+    move = 2;
+    measure =0;
+}
+void Leftcount()
+{
+    move = 3;
+    measure =0;
+}
+
+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;
     }
-void Rightcount(){
-    move = 2; measure =0;
+
+    /* 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;
+                        measure =1;
+                    }
+                } else if(dis_L <50) {
+                    if((dis_L + 5) < dis_R) {
+                        move =3;
+                        measure =1;
+                    }
+                } else {
+                    move =0;
+                    measure =1;
+                }
+            } else if(dis_F<30) {
+                move =1;
+                measure =1;
+            }
+            break;
     }
-void Leftcount(){
-    move = 3;   measure =0;
+
+
+    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;
     }
+
+    switch(move) {
+        case 0://Front
+            Front();
+            measure =0;
+            break;
+
+        case 1://Back
+            Stop();
+            measure =0;
+            break;
+
+        case 2://Right
+            Turn_R();
+            if (flag==1) {
+                flag=0;
+                motortime.attach(&count,1);
+            }
+            wait(1);
+            break;
+
+        case 3://Left
+            Turn_L();
+            if (flag==1) {
+                flag=0;
+                motortime.attach(&count,1);
+            }
+            wait(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()
 {
 
-    while(1) {
+    int Gc=0;
 
-        //거리측정
-        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;
-        }
-       
-        printf("Front: %d\n",dis_F);
-        printf("Right: %d\n",dis_L);
-        printf("Left : %d\n",dis_R);
-        printf("move : %d\n",move);
+    control.attach(&control_func,0.1);
+    xbee1.attach(&callback1);
+    xbee2.attach(&callback2);
+    xbee3.attach(&callback3);
 
-       /* 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; measure =1;}
-            } else if(dis_L <50) {
-                if((dis_L + 5) < dis_R){
-                move =3;measure =1;}
-            } else {
-                move =0; measure =1;
-            }
-            } else if(dis_F<30) {
-            move =1; measure =1;
+    while(1) {
+        xbee1.printf("+++");
+        wait(0.1);
+        xbee2.printf("+++");
+        wait(0.1);
+        xbee3.printf("+++");
+        wait(1);
+        xbeecount1=0;
+        xbeeflag1 = 1;
+        xbee1.printf("ATDB\r");
+        wait(0.1);
+        xbeecount2=0;
+        xbeeflag2 = 1;
+        xbee2.printf("ATDB\r");
+        wait(0.1);
+        xbeecount3=0;
+        xbeeflag3 = 1;
+        xbee3.printf("ATDB\r");
+        wait(1);
+        xbeeflag1 = 0;
+        xbeeflag2 = 0;
+        xbeeflag3 = 0;
+        rssi1[Gc] = strtol( xbeebuf1, &stop , 16 );
+        rssi2[Gc] = strtol( xbeebuf2, &stop , 16 );
+        rssi3[Gc] = strtol( xbeebuf3, &stop , 16 );
+        xbee1.printf("ATCN\r");
+        wait(0.1);
+        xbee2.printf("ATCN\r");
+        wait(0.1);
+        xbee3.printf("ATCN\r");
+        wait(1);
+
+        rssi1_sum = 0;
+        rssi2_sum = 0;
+        rssi3_sum = 0;
+
+        for (int i=0; i<5; i++) {
+            rssi1_sum += rssi1[i];
+            rssi2_sum += rssi2[i];
+            rssi3_sum += rssi3[i];
+        }
+        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]);
+        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);
+
+        if (d2 == d3) { //center
+            if(d1 <= d3) { //front
+                alpha = acos( (d3*d3+400.0*400.0-d2*d2)/(2*d3*400.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) );
+                angle = 3.14;
+                distance =  d3 * sin(alpha) / sin(1.57-angle);
             }
-            break;
+        } 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
+                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
+                distance = d3 * sin(alpha) / sin(1.57-angle);
             }
-            
-        
-        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;}
-            
-        switch(move) {
-            case 0://Front
-                Front();
-                measure =0;
-                break;
-
-            case 1://Back
-                Stop();
-                measure =0;
-                break;
 
-            case 2://Right
-                Turn_R();
-                if (flag==1) {
-                    flag=0;
-                    motortime.attach(&count,1);
-                }
-                wait(1);
-                break;
+        } 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
+                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
+                distance = d2 * sin(alpha) / sin(1.57+angle);
+            }
+        }
 
-            case 3://Left
-                Turn_L();
-                if (flag==1) {
-                    flag=0;
-                    motortime.attach(&count,1);
-                }
-                wait(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;
+        printf("alpha : %f, angle : %f, distance : %f\n\n",alpha*180/3.14,angle*180/3.14,distance);
+
+        if(Gc>=4) {
+            Gc=0;
+        } else {
+            Gc++;
         }
     }