大会本番用

Dependencies:   mbed SpeedController hcsr04 Encoder CruizCore_R1370P

Revision:
1:a692014d8e41
Parent:
0:c0e9bbc27454
Child:
2:0be4cfbdf408
--- a/main.cpp	Wed Mar 11 05:54:39 2020 +0000
+++ b/main.cpp	Thu Mar 12 05:52:39 2020 +0000
@@ -7,7 +7,14 @@
 #define RESOLUTION 500
 
 CAN can1(PB_5,PB_13);
-
+/*
+0 start
+1 to 4 , 6 to 9
+5 stop
+10 clock move
+11 not clock move
+12 speed change
+*/
 Ec2multi ec[]= {
     Ec2multi(PC_5,PB_2,RESOLUTION),
     Ec2multi(PA_11,PB_1,RESOLUTION),
@@ -38,10 +45,10 @@
     ,HCSR04(PC_3,PB_10)//B
 };
 
-Ticker ticker;
+//自己位置取得
+double theta;
+double angle;
 
-//自己位置取得
-double theta=0;
 class Location
 {
 public:
@@ -177,7 +184,7 @@
 //超音波
 class Sonic
 {
-private:
+public:
     Sonic()
     {
         for(int i=0; i<4; i++) {
@@ -203,10 +210,118 @@
     double sonic_cm[4];
 };
 
+class CAN_ticker
+{
+public:
+    CAN_ticker():x(0),data(0) {}
+    void can_read()
+    {
+        CANMessage msg;
+        if(can1.read(msg)) {
+            if(msg.id == 1) {
+                x=(short)(msg.data);
+            }
+        }
+    }
+    int get_xCAN()
+    {
+        return x;
+    }
+private:
+    char data;
+    int x;
+};
+//手動出力
+void calOmega_CAN(int canx)
+{
+    int a=10,count=0;
+    double canOmega[4];
+    switch(canx) {
+        case 1:
+            canOmega[0]=0;
+            canOmega[1]=-a;
+            canOmega[2]=0;
+            canOmega[3]=a;
+            break;
+        case 2:
+            canOmega[0]=-a*1.4;
+            canOmega[1]=-a*1.4;
+            canOmega[2]=a*1.4;
+            canOmega[3]=a*1.4;
+            break;
+        case 3:
+            canOmega[0]=-a;
+            canOmega[1]=0;
+            canOmega[2]=a;
+            canOmega[3]=0;
+            break;
+        case 4:
+            canOmega[0]=a*1.4;
+            canOmega[1]=-a*1.4;
+            canOmega[2]=-a*1.4;
+            canOmega[3]=a*1.4;
+            break;
+        case 5:
+            for(int i=0; i<4; i++) {
+                canOmega[i]=0;
+            }
+            break;
+        case 6:
+            canOmega[0]=-a*1.4;
+            canOmega[1]=a*1.4;
+            canOmega[2]=a*1.4;
+            canOmega[3]=-a*1.4;
+            break;
+        case 7:
+            canOmega[0]=a;
+            canOmega[1]=0;
+            canOmega[2]=-a;
+            canOmega[3]=0;
+            break;
+        case 8:
+            canOmega[0]=a*1.4;
+            canOmega[1]=a*1.4;
+            canOmega[2]=-a*1.4;
+            canOmega[3]=-a*1.4;
+            break;
+        case 9:
+            canOmega[0]=0;
+            canOmega[1]=a;
+            canOmega[2]=0;
+            canOmega[3]=-a;
+            break;
+        case 10:
+            for(int i=0; i<4; i++) {
+                canOmega[i]=-a;
+            }
+            break;
+        case 11:
+            for(int i=0; i<4; i++) {
+                canOmega[i]=a;
+            }
+            break;
+        case 12:
+            if(count%2==1) {
+                a=20;
+            } else {
+                a=10;
+            }
+            break;
+
+
+    }
+    for(int i=0; i<4; i++) {
+        motor[i].Sc(canOmega[i]);
+    }
+
+}
+
+//ticker に入れる関数
+Ticker ticker;
+Ticker canTicker;
+Ticker locTicker;
 
 //出力
-//int a=0;
-//int j=0;
 void motorOut()
 {
     for(int i=0; i<4; i++) {
@@ -214,13 +329,24 @@
     }
 }
 
+CAN_ticker canx;
+void ticker_CanRead()
+{
+    canx.can_read();
+}
+
+Location location;
+void calLoc()
+{
+    theta=gyro.getAngle()-angle;    //角度受け取り
+    location.calXY();
+}
 int main()
 {
+    angle=gyro.getAngle();//角度初期化
     can1.frequency(1000000);
     gyro.initialize();    //main関数の最初に一度だけ実行
     gyro.acc_offset();
-    double angle;
-    angle=gyro.getAngle();
     double z;
     printf("start\r\n");
     motor[0].setEquation(0.008031,-0.022300,-0.008839,-0.016290);
@@ -238,25 +364,53 @@
     motor[2].setPDparam( 0.1790, 0.00620);
     motor[3].setPDparam( 0.1680, 0.00560);
 
-    while(1) {
+    int first=0;
+    while(first==0) {
         printf("waiting\r\n");
         if(button==0) {
             wait(1);
-            ticker.attach(motorOut,0.05);
+            ticker.attach(&motorOut,0.05);
+            first++;
             break;
         }
     }
 
+    int canX=20;//can変数
     int n=1,dx,dy,aimX,aimY;
     double vx_,vy_,vx,vy,newtime,distance;
-    Location location;
     Timer time;
     time.start();
+    locTicker.attach(&calLoc,0.05);
+    canTicker.attach(&ticker_CanRead,0.1);//can読み込み
     while(1) {
+        canX=canx.get_xCAN();//0で手動化
+        if(canX==0) {//手動化
+            ticker.detach();
+            while(1) {
+                canX=canx.get_xCAN();
+                calOmega_CAN(canX);
+                //自己位置取得
+                x=location.getX();
+                y=location.getY();
+                //目的地決定(syuusoku check)
+                aimX = plot[n][0];
+                aimY = plot[n][1];
+                dx=aimX-x;
+                dy=aimY-y;
+                distance = sqrt((float)dx*dx+dy*dy);
+                if(distance<800) {
+                    n++;
+                    printf("reach%d\r\n",n);
+                    time.reset();
+                }
+                if(canX==0) {//自動化
+                    canX=20;
+                    ticker.attach(&motorOut,0.05);
+                    break;
+                }
+            }
+        }
         //自己位置取得
-        theta=gyro.getAngle()-angle;    //角度の値を受け取る
-        location.calXY();
-
         x=location.getX();
         y=location.getY();
         printf("X=%d,Y=%d,theta=%5.3f z=%5.3f  %f\r\n",x,y,theta,z,time.read());
@@ -287,7 +441,7 @@
 
         if(n>=5) {
             for(int j=0; j<4; j++) {
-                motor[j].Sc(0);
+                motor[j].stop();
             }
             printf("fin\r\n");
             ticker.detach();