yuka_tks

Dependencies:   mbed HCSR04

main.cpp

Committer:
tks1
Date:
2021-12-20
Revision:
6:dd35cc3b5ca0
Parent:
5:f21e1a75f98b

File content as of revision 6:dd35cc3b5ca0:

//2021/12/20更新
//aoki
#include "yuka.h"
Timer t_obj;
double auto_time = 0;
int main()
{
    pc.attach(SerialRX);
    //pc.baud(115200);
    //CAN
    canPort.frequency(1000000); //Bit Rate:1MHz
    canPort.attach(CANdataRX,CAN::RxIrq);
    //CAN node Setting
    int node1 = 1;
    int node2 = 2;
    int node3 = 3;
    int node4 = 4;

    //エンコーダ関係
    int ActPos1 = 0;
    int ActPos2 = 0;
    
    int Init_Pos = 0;
    //超音波センサ関係パラメータ
    int dist1;
    int dist2;
    int dist3;

    pc.printf("YUKA PROGRAM START\r\n");
    wait(0.1);
    //-------------起動時に必ず送信---------------
    //オペレーティングモードを送信
    sendOPModeT(node1);
    sendOPModeT(node2);
    sendOPModeT(node3);
    sendOPModeT(node4);
    //Shutdown,Enableコマンド送信|リセット
    sendCtrlSD(node1);
    sendCtrlSD(node2);
    sendCtrlSD(node3);
    sendCtrlSD(node4);

    sendCtrlEN(node1);
    sendCtrlEN(node2);
    sendCtrlEN(node3);
    sendCtrlEN(node4);

    //初期加減速度
    int Acc = 2000;
    int Dec = 2000;
    sendProAcc(1,Acc);
    sendProAcc(2,Acc);
    sendProAcc(3,Acc);
    sendProAcc(4,Acc);

    sendProDec(1,Dec);
    sendProDec(2,Dec);
    sendProDec(3,Dec);
    sendProDec(4,Dec);
    //トルク設定
    int trq = 100;   //torque Setting[mA]

    sendTgtTrq(1,trq);
    sendTgtTrq(2,trq);
    sendTgtTrq(3,trq);
    sendTgtTrq(4,trq);

    int state_1 = 0;
    int state_2 = 0;
    int ride_count = 0;

    int X_POS_TMP = 0;
    int dist1_ori = 0;
    int dist2_ori = 0;

    readActPos(1);
    ActPos=canmsgRx.data[4]+canmsgRx.data[5]*256+canmsgRx.data[6]*65536;
    if(ActPos > 8388608) {
        ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
    }
    Init_Pos = ActPos;//起動時の角度を保存
    t_obj.reset();
    t_obj.start();
    //set_MODE_T();
    printf("\nstart\r\n");
    while(1) {
        auto_time = t_obj.read();
        pc.printf("state_1:%d  state_2:%d\r\n",state_1,state_2);
        LED.printf("%d",state_1);
        readActPos(1);
        ActPos=canmsgRx.data[4]+canmsgRx.data[5]*256+canmsgRx.data[6]*65536;
        if(ActPos > 8388608) {
            ActPos -= 0x1000000;//16進数でのマイナス処理 16^7 = 16,777,216 = 0x1000000
            //printf("check\r\n");
        }
        dist1 = get_cm_n(u1, 3);
        dist2 = get_cm_n(u2, 3);
        dist3 = get_cm_n(u3, 3);
        /*--------------------------*/
        if(state_1 == 0) { //入力判断フェーズ
            state_2 = 0;
            if(ride_count >= 2 && auto_time > Standby_Time) {
                state_1 = 20;
            } else {
                if(ActPos < (Init_Pos - KICK)) { //前入力検出
                    ride_count++;
                    state_1 = 1;
                } else if(ActPos > (Init_Pos + KICK)) { //右入力検出
                    ride_count++;
                    state_1 = 11;
                } else {
                    set_MODE_T();
                }
            }

        } else if(state_1 == 1) { //前進→壁検出フェーズ
            if(dist1 < WALL && dist1 >= WALL_MIN) {
                vel_stop();
                wait(GETOFF_TIME);
                state_1 = 2;
            } else {
                set_ACC(ACC_RIDE);//加速度設定
                set_DEC(DEC_CLEAN);//減速度設定
                set_MODE_V();//速度制御モード送信
                vel_forward_con(RPM_RIDE);//前進速度指令
            }
        } else if(state_1 == 2) { //前進からの帰還フェーズ
            if(ActPos > -3000) {
                vel_stop();
                t_obj.reset();
                t_obj.start();
                state_1 = 0;
                wait(1.0);
            } else {
                vel_backward_con(RPM_RIDE);
            }
        } else if(state_1 == 11) { //右進→壁検出フェーズ
            if(dist3 < WALL && dist3 >= WALL_MIN) {
                vel_stop();
                wait(GETOFF_TIME);
                state_1 = 12;
            } else {
                set_ACC(ACC_RIDE);//加速度設定
                set_DEC(DEC_RIDE);//減速度設定
                set_MODE_V();//速度制御モード送信
                vel_right(RPM_RIDE);//R進速度指令
            }
        } else if(state_1 == 12) { //右進からの帰還フェーズ
            if(ActPos < 3000) {
                vel_stop();
                t_obj.reset();
                t_obj.start();
                state_1 = 0;
                wait(1.0);
            } else {
                vel_left(RPM_RIDE);
            }
        } else if(state_1 == 20) { //消毒モード
            if(state_2 == 0) {
                if(dist1 < WALL && dist1 >= WALL_MIN) {
                    X_POS_TMP = ActPos;
                    state_2 = 1;
                } else {
                    set_ACC(ACC_CLEAN);//加速度設定
                    set_DEC(DEC_CLEAN);//減速度設定
                    set_MODE_V();//速度制御モード送信
                    vel_forward_con(RPM_CLEAN);//前進速度指令
                }
            } else if(state_2 == 1) {
                if(abs(ActPos - X_POS_TMP) > CLEAN_OFFSET) {
                    state_2 == 2;
                } else {
                    if(dist3 < WALL && dist3 >= WALL_MIN) {
                        state_2 = 4;
                    } else {
                        set_ACC(ACC_CLEAN);//加速度設定
                        set_DEC(DEC_CLEAN);//減速度設定
                        set_MODE_V();//速度制御モード送信
                        vel_right(RPM_CLEAN);//右進速度指令
                    }
                }
            } else if(state_2 == 2) {
                if(ActPos > -3000) {
                    state_2 = 3;
                } else {
                    set_ACC(ACC_CLEAN);//加速度設定
                    set_DEC(DEC_CLEAN);//減速度設定
                    set_MODE_V();//速度制御モード送信
                    vel_backward_con(RPM_CLEAN);//後進速度指令
                }
            } else if(state_2 == 3) {
                if(abs(ActPos - X_POS_TMP ) > CLEAN_OFFSET) {
                    state_2 == 0;
                } else {
                    if(dist3 < WALL && dist3 >= WALL_MIN) {
                        state_2 = 4;
                    } else {
                        set_ACC(ACC_CLEAN);//加速度設定
                        set_DEC(DEC_CLEAN);//減速度設定
                        set_MODE_V();//速度制御モード送信
                        vel_right(RPM_CLEAN);//右進速度指令
                    }
                }
            } else if(state_2 == 4) {
                if(ActPos < 3000) {
                    state_2 = 5;
                } else {
                    vel_left(RPM_CLEAN);
                }
            } else if(state_2 == 5) {
                if(ActPos > -3000) {
                    t_obj.reset();
                    t_obj.start();
                    state_1 = 0;
                    state_2 = 0;
                } else {
                    vel_backward_con(RPM_CLEAN);
                }
            }
        }
    }
}