主導機 mbed用のプログラムです 改良しました

Dependencies:   mbed

Fork of F3RC_syudou_master_3 by 日記

User.cpp

Committer:
yuto17320508
Date:
2017-09-14
Revision:
26:91dd637de4d4
Parent:
25:d5588a50f069

File content as of revision 26:91dd637de4d4:

#include "Utils.h"
#include "USBHost.h"
#include "hci.h"
#include "ps3.h"
#include "User.h"
#include "mbed.h"
#define _USE_MATH_DEFINES

#include "math.h"

#define Pi 3.14159
int RSX,RSY,LSX,LSY,BSU,BSL;
//これより下に関数外に書く要素を記入する
//BUS通信用
BusOut out(p5,p6,p7,p8);
int num;

//オムニホイール

/*   正転の向き
    l↙   ↖f    
              
       →
      r       */
PwmOut motor_f_1(p21);
PwmOut motor_f_2(p22);
PwmOut motor_l_1(p23);
PwmOut motor_l_2(p24);
PwmOut motor_r_1(p25);
PwmOut motor_r_2(p26);

double fai=60;//φ
//個体差で出力調整
double power_f=0.32;
double power_l=0.32;
double power_r=0.32;

double M1;
double M2;
double M3;

double accel=1.3;
//ジョイスティックの中心座標
double center=127;

//ジョイスティック閾値
double delta=90;
double bound_p=center+delta;
double bound_m=center-delta;

//回転の比
 //移動中の回転
double roll_spd=0.4;
 //横移動中の回転
double roll_spd2=0.1;
 //横移動のスピード
double yoko_spd=0.9;

//モーターの動作
void motor_act()
{
    //絶対値をつける関数
    if(M1 >=0) {
        motor_f_1=M1;
        motor_f_2=0;
    } else {
        motor_f_1=0;
        motor_f_2=-M1;
    }
    if(M2 >=0) {
        motor_l_1=M2;
        motor_l_2=0;
    } else {
        motor_l_1=0;
        motor_l_2=-M2;
    }
    if(M3 >=0) {
        motor_r_1=M3;
        motor_r_2=0;
    } else {
        motor_r_1=0;
        motor_r_2=-M3;
    }
}
//ジョイスティック入力値の偏角
double sita;
//関数代入用の角度調整
double sita_2;

void UserLoopSetting()
{
    motor_f_1.period_us(100);
    motor_f_2.period_us(100);
    motor_l_1.period_us(100);
    motor_l_2.period_us(100);
    motor_r_1.period_us(100);
    motor_r_2.period_us(100);
}

void UserLoop(char n,const u8* data)
{
    u16 ButtonState;
    if(n==0) { //有線Ps3USB.cpp
        RSX = ((ps3report*)data)->RightStickX;
        RSY = ((ps3report*)data)->RightStickY;
        LSX = ((ps3report*)data)->LeftStickX;
        LSY = ((ps3report*)data)->LeftStickY;
        BSU = (u8)(((ps3report*)data)->ButtonState & 0x00ff);
        BSL = (u8)(((ps3report*)data)->ButtonState >> 8);
        //ボタンの処理
        ButtonState =  ((ps3report*)data)->ButtonState;
    } else {//無線TestShell.cpp
        RSX = ((ps3report*)(data + 1))->RightStickX;
        RSY = ((ps3report*)(data + 1))->RightStickY;
        LSX = ((ps3report*)(data + 1))->LeftStickX;
        LSY = ((ps3report*)(data + 1))->LeftStickY;
        BSU = (u8)(((ps3report*)(data + 1))->ButtonState & 0x00ff);
        BSL = (u8)(((ps3report*)(data + 1))->ButtonState >> 8);
        //ボタンの処理
        ButtonState =  ((ps3report*)(data + 1))->ButtonState;
    }
    //ここより下にプログラムを書く
    //BUS用プログラム
    int flag=0;
    num=0;
    if((ButtonState >> BUTTONTRIANGEL)&1 == 1) {//対応するボタンを書く
        num = 1;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONCROSS)&1 == 1) { //対応するボタンを書く
        num = 2;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONR1)&1 == 1) { //対応するボタンを書く
        num = 3;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONR2)&1 == 1) { //対応するボタンを書く
        num = 4;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONUP)&1 == 1) { //対応するボタンを書く
        num = 5;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONDOWN)&1 == 1) { //対応するボタンを書く
        num = 6;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONL1)&1 == 1) { //対応するボタンを書く
        num = 7;
        flag=flag+1;
    }
    if((ButtonState >> BUTTONL2)&1 == 1) { //対応するボタンを書く
        num = 8;
        flag=flag+1;
    }
    if(flag >=2) {
        num=0;
    }
    out=num;
    printf("%d\r\n",num);
    //オムニホイールのプログラム

    if((ButtonState >> BUTTONRANALOG)&1 == 1) {//押し込みで速度変化
        roll_spd=0.8;
    } else {
        roll_spd=0.4;
    }
    if(LSX>=bound_m && LSX<=bound_p && LSY>=bound_m && LSY<=bound_p) {
        M1=0;
        M2=0;
        M3=0;
        if(RSX>=bound_p && RSX<=255) {//右スティック右
            M1=power_f*roll_spd;
            M2=power_l*roll_spd;
            M3=power_r*roll_spd;
        } else if(RSX>=0 && RSX<=bound_m) {//右スティック左
            M1=-1.0*power_f*roll_spd;
            M2=-1.0*power_l*roll_spd;
            M3=-1.0*power_r*roll_spd;
        }
        sita=0;

    } else {//左スティック全方向
        sita = -1.0*(atan2((double)LSY-center,(double)LSX-center))*180/Pi;
        sita_2=90-sita;
        M1=sin((sita_2-(fai+0))*Pi/180)*power_f;
        M2=sin((sita_2-(fai+240))*Pi/180)*power_l;
        M3=sin((sita_2-(fai+120))*Pi/180)*power_r;
        if(RSX>=bound_p && RSX<=255) {//進行中の右スティック右
            M1=M1+power_f*roll_spd;
            M2=M2+power_l*roll_spd;
            M3=M3+power_r*roll_spd;
        } else if(RSX>=0 && RSX<=bound_m) {//進行中の右スティック左
            M1=M1+-1.0*power_f*roll_spd;
            M2=M2+-1.0*power_l*roll_spd;
            M3=M3+-1.0*power_r*roll_spd;
        }
    }
    //真横移動
    if((ButtonState >> BUTTONLEFT)&1 == 1) { //十字キー左
        sita = 180;
        sita_2=90-sita;
        M1=sin((sita_2-(fai+0))*Pi/180)*power_f*yoko_spd;
        M2=sin((sita_2-(fai+240))*Pi/180)*power_l*yoko_spd;
        M3=sin((sita_2-(fai+120))*Pi/180)*power_r*yoko_spd;
        if(RSX>=bound_p && RSX<=255) {//横移動中の右スティック右
            M1=M1+power_f*roll_spd2;
            M2=M2+power_l*roll_spd2;
            M3=M3+power_r*roll_spd2;
        } else if(RSX>=0 && RSX<=bound_m) {//横移動中の右スティック左
            M1=M1+-1.0*power_f*roll_spd2;
            M2=M2+-1.0*power_l*roll_spd2;
            M3=M3+-1.0*power_r*roll_spd2;
        }
    }
    if((ButtonState >> BUTTONRIGHT)&1 == 1) { //十字キー右
        sita = 0;
        sita_2=90-sita;
        M1=sin((sita_2-(fai+0))*Pi/180)*power_f*yoko_spd;
        M2=sin((sita_2-(fai+240))*Pi/180)*power_l*yoko_spd;
        M3=sin((sita_2-(fai+120))*Pi/180)*power_r*yoko_spd;
        if(RSX>=bound_p && RSX<=255) {//横移動中の右スティック右
            M1=M1+power_f*roll_spd2;
            M2=M2+power_l*roll_spd2;
            M3=M3+power_r*roll_spd2;
        } else if(RSX>=0 && RSX<=bound_m) {//横移動中の右スティック左
            M1=M1+-1.0*power_f*roll_spd2;
            M2=M2+-1.0*power_l*roll_spd2;
            M3=M3+-1.0*power_r*roll_spd2;
        }
    }
    motor_act();


    printf("motor_f:%.4f\t\motor_l:%.4f\t\motor_r:%.4f\t\sita:%f\r\n",M1,M2,M3,sita);

}