kourobo 2019 tag number 5 program

Dependencies:   mbed omuni_power ikarashiMDC PS3

main.cpp

Committer:
THtakahiro702286
Date:
2019-02-28
Revision:
0:b2c626a3336d
Child:
1:6078ee91e5d7

File content as of revision 0:b2c626a3336d:

#include "mbed.h"
#include "ikarashiMDC.h"
#include "PS3.h"
#include "wheel.h"
#define PI 3.14159265
Serial serial(PC_6,PC_7);
DigitalOut serialcontrol(D2);
DigitalOut stop(PB_1,PB_15);

ikarashiMDC ikarashi[] {
    ikarashiMDC(&serialcontrol,2,0,SM,&serial),
    ikarashiMDC(&serialcontrol,2,1,SM,&serial),
    ikarashiMDC(&serialcontrol,2,2,SM,&serial),
    ikarashiMDC(&serialcontrol,2,3,SM,&serial)
};

PS3 ps3(PC_12, PD_2);
Serial pc(USBTX,USBRX,115200);

int main()
{
    serial.baud(115200);
    ikarashi[0].braking = true;
    int b[12], stick[4], trigger[2],neutral[4],count = 0;
    double X,Y,acc[5],power;
    /*ジョイスティック ニュートラル設定*/
    do{
        for(int i = 0; i < 4; i++) {
            neutral[i] =  ps3.getStick(i);
            pc.printf("%4d",neutral[i]);
        }
        count++;
    } while(count <= 50);
    for(int i = 0; i < 4; i++) {
        neutral[i] =  ps3.getStick(i);
        pc.printf("%4d",neutral[i]);
    }
    while(1){
        stop = 1;
    /*ボタン0=上 1=下 2=左  3=右 4=L1 5=R1 6=△ 7=× 8=□ 9=〇 10=L3 11=R3*/
        for(int i = 0; i < 12; i++) {
            b[i] = ps3.getButton(i);
            pc.printf("%2d",b[i]);
        }
    /*ジョイスティック*/
        for(int i = 0; i < 4; i++) {
            stick[i] = ps3.getStick(i);
            pc.printf("%4d",stick[i] - neutral[i]);
        }
    /*トリガースイッチ*/
        for(int i = 0; i < 2; i++) {
            trigger[i] = ps3.getTrigger(i);
            pc.printf("%4d",trigger[i]);
        }
        X = stick[0] - neutral[0];
        Y = neutral[1] - stick[1];
    /*微調整用コマンド*/
        power = 1;
        if(b[0] == 1 && b[1] == 0 && b[2] == 0 && b[3] == 0 && (stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20)) {
            X = 0;
            Y = 1;
            power = 0.2;
        }
        if(b[0] == 0 && b[1] == 1 && b[2] == 0 && b[3] == 0 && (stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20)) {
            X = 0;
            Y = -1;
            power = 0.2;
        }
        if(b[0] == 0 && b[1] == 0 && b[2] == 1 && b[3] == 0 && (stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20)) {
            X = -1;
            Y = 0;
            power = 0.2;
        }
        if(b[0] == 0 && b[1] == 0 && b[2] == 0 && b[3] == 1 && (stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20)) {
            X = 1;
            Y = 0;
            power = 0.2;
        }
    /*オムニ制御*/
        if((stick[0] == 0 && stick[1] == 0 && stick[2] == 0 && stick [3] == 0) || ((stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20))) {
            acc[0] = 0;
            acc[1] = 0;
            acc[2] = 0;
        } else { 
            acc[0] = omuni_speed(X,Y,PI * 1 / 3) * power;
            acc[1] = omuni_speed(X,Y,PI * 3 / 3) * power;
            acc[2] = omuni_speed(X,Y,PI * 5 / 3) * power;
       }
       if((trigger[0] <= 200 && trigger[1] >= 200) && ((stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20))) {
            acc[0] = -0.5;
            acc[1] = -0.5;
            acc[2] = -0.5;
        }
        if((trigger[1] <= 200 && trigger[0] >= 200) && ((stick[0] >= neutral[0] - 20 && stick[0] <= neutral[0] + 20) && (stick[1]>= neutral[1] - 20 && stick[1] <= neutral[1] + 20))) {
            acc[0] = 0.5;
            acc[1] = 0.5;
            acc[2] = 0.5;
        }
    /*機構制御*/
        if(b[4] == 1 && b[5] == 0){
            acc[3] = -0.2;
        }
        if(b[4] == 0 && b[5] == 1){
            acc[3] = 0.2; 
        }
        if(b[4] == 0 && b[5] == 0){
            acc[3] = 0;
        }
    /*速度制限*/
        for(int i = 0;i < 4;i++) {
            if(acc[i] >= 0.5){
                acc[i] = 0.5;
            }
            if(acc[i] <= -0.5) {
                acc[i] = -0.5;
            }
        }
   /*タイムアウト制御 & 非常停止*/
        if((ps3.status == false) || (b[10] == 1 && b[11] == 1)) {
            stop = 0;
        }

        ikarashi[0].setSpeed(acc[0]);
        ikarashi[1].setSpeed(acc[1]);
        ikarashi[2].setSpeed(acc[2]);
        ikarashi[3].setSpeed(acc[3]);
        for(int i = 0;i < 5;i++) {
            pc.printf(" %f",acc[i]);
        }
        pc.printf("\r\n");
    }
}