2021 Ateam auto

Dependencies:   Serial6050Yaw HCSR04 CERICA_2019

main.cpp

Committer:
GOD_NAFU
Date:
2022-04-25
Revision:
0:3c88c8c7b112

File content as of revision 0:3c88c8c7b112:

#include "mbed.h"
#include "utility.h"
#define MATO 3
#define PI 3.14159
int fSpd;

void startSpd()
{
    for(fSpd=0; fSpd<=160; fSpd+=5) {
        wait_ms(15);
    }
}

void dis() //距離測定関数-----------------------------------
{
    pc.baud(115200);
    //的との位置を把握
    int a = 3;
    while(matoDis[1]==0 || matoDis[2]==0 || matoDis[3]==0) {
        while(1) {
            move(fSpd,180);    //ひだり
            usensor.start();
            dist = usensor.get_dist_cm();
            wait_ms(10);
            /*for(int i=0; i<4; i++) {
                pc.printf("motor[%d] : %f   ",i, motor[i]);
            }
            pc.printf("\r\n");*/

            if(dist < kyoriSiki && dist != 0) {
                matoDis[a] = dist;//的との距離
                pointX[a] = -cm_X - pointSum;//的がある場所のX方向の距離
                pointSum += pointX[a];
                oto(10);
                //  pointX[a]=-cm_X;
                //  cerica.ResetX();
                pc.printf("matoDis[%d]:%f\r\n",a,matoDis[a]);
                pc.printf("pointX[%d]:%f\r\n",a,pointX[a]);

                while(1) {
bbb:
                    move(fSpd,180);    //ひだり
                    usensor.start();
                    dist = usensor.get_dist_cm();
                    wait_ms(10);
                    if(dist>kyoriSiki) {
                        while(1) {
                            move(fSpd,180);    //ひだり
                            usensor.start();
                            dist = usensor.get_dist_cm();
                            wait_ms(10);
                            if(dist<kyoriSiki && dist!=0) {
                                goto bbb;
                            }
                            a--;
                            pc.printf("a=%d\n\r",a);
                            goto aaa;
                        }
                    }
                }
            }
        }
aaa:
        // pc.printf("matoDis[%d]:%f\r\n",a-1,matoDis[a-1]);
    }
    a=1;
    wait_ms(300);  //測り終わった後 秒進む(要調整)
    stop();
    pointX[0]=-cm_X - pointSum;//kokokokokokokokoko
    //pointX[0]=-cm_X;
    for(int i=0; i<=MATO; i++) {
        pc.printf("matoDis[%d]:%f\r\n",i,matoDis[i]);
        pc.printf("pointX[%d]:%f\r\n",i,pointX[i]);
    }
    wait_ms(1000);

    //回転
    rotation(80,170);
    stop();
    encMode=1;
    cerica.ResetX();
    cerica.ResetY();


    //角度とか
    angle[0]=atan((matoDis[1]-reach)/pointX[0]);
    for(int i=1; i<MATO; i++) {
        angle[i]=atan((matoDis[i+1]-matoDis[i])/pointX[i]);
    }
    angle[MATO]=-atan((matoDis[MATO]-reach)/pointX[MATO]);

    pc.printf("------------------------\r\n");
    for(int i=0; i<=MATO; i++) {
        pc.printf("matoDis[%d]:%f\n\r",i,matoDis[i]);
    }
    pc.printf("------------------------\r\n");


    for(int i=0; i<=MATO; i++) {
        pc.printf("pointX[%d]:%f\n\r",i,pointX[i]);
    }
    //反転のずれ直す
    for(int i=0; i<=MATO; i++) {
        angle[i]=180/PI*(angle[i]+PI);
        pc.printf("angle[%d]:%f\n\r",i,angle[i]);
    }
    pointX[0]-=85;
    pointX[3]-=70;


    //進む距離
    //pc.printf("nakami:%d\r\n",(matoDis[1]-reach)*(matoDis[1]-reach)+pointX[0]*pointX[0]);
    nnmDis[0]=sqrt((matoDis[1]-reach)*(matoDis[1]-reach)+pointX[0]*pointX[0]);
    for(int i=1; i<MATO; i++) {
        nnmDis[i]=sqrt((matoDis[i]-matoDis[i+1])*(matoDis[i]-matoDis[i+1])+pointX[i]*pointX[i]);
    }
    nnmDis[MATO]=sqrt((matoDis[MATO]-reach)*(matoDis[MATO]-reach)+pointX[MATO]*pointX[MATO]);

    for(int i=0; i<=MATO; i++) {
        // nnmDis[i]=180/PI*angle[i];
        pc.printf("nnmDis[%d]:%f\n\r",i,nnmDis[i]);
    }

}


//main------------------------------
int main()
{
    mpu.init();
    cerica.ResetY();
    cerica.ResetX();

    Thread move;
    move.start(signal);

    Thread m;
    m.start(mpuR);

    Thread enc;
    enc.start(encoder);
    
    Thread bow;
    bow.start(selfShot);

    Thread wireless;
    wireless.start(send);
    
    Thread slow;
    
    boardInit();

    oto(20);

    pc.printf("start------------------------\r\n");
    //合体
    moveEnc(100,-90,70);    //本番距離変える
    wait_ms(1500);
    pc.printf("Left move");
    //x方向に移動しながら距離測定
    slow.start(startSpd);
    dis();
    wait_ms(1000);
    //じぐざくいどう
    for(int i=0; i<=3; i++) {
        moveEnc(140,angle[i],nnmDis[i]);
        sendTiming = 1;
        stop();
        //撃つタイミング送信
        wait_ms(1000);
    }

    for(int i=0; i<4; i++) {
        pc.printf("motor[%d] : 0\n\r",i);
        cerica.Motor(i,0);
    }
    for(int i=0; i<3; i++) {
        pc.printf("matoDis[%d]:%f\r\n",i,matoDis[i]);
    }
}