doxygen test

Committer:
piroro4560
Date:
Sun Jun 19 07:25:28 2022 +0000
Revision:
1:e6a7e0b92032
Parent:
0:6a6e78ee4e08
Child:
2:98b9c6e44ae4
test2;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piroro4560 0:6a6e78ee4e08 1 /// @file main.cpp
piroro4560 0:6a6e78ee4e08 2 /// @brief ロボカップラジコンのプログラム
piroro4560 0:6a6e78ee4e08 3 ///
piroro4560 1:e6a7e0b92032 4 /// @note トグルは上が1で下が0
piroro4560 1:e6a7e0b92032 5 ///
piroro4560 1:e6a7e0b92032 6 /// @details 右端トグルで速度切り替え
piroro4560 1:e6a7e0b92032 7 /// @note 1:速め 0:遅め
piroro4560 1:e6a7e0b92032 8 ///
piroro4560 1:e6a7e0b92032 9 /// @details 中央トグル2つでモード切替
piroro4560 1:e6a7e0b92032 10 /// @note 中央トグルでのモード切替;
piroro4560 1:e6a7e0b92032 11 /// 左0右0:スタート
piroro4560 1:e6a7e0b92032 12 /// 左1右0:キッカーテスト
piroro4560 1:e6a7e0b92032 13 /// 左0右1:ドリブラーテスト
piroro4560 1:e6a7e0b92032 14 /// 左1右1:オムニテスト
piroro4560 0:6a6e78ee4e08 15 ///
piroro4560 0:6a6e78ee4e08 16 ///
piroro4560 0:6a6e78ee4e08 17 ///
piroro4560 1:e6a7e0b92032 18 /// @attention 1番機は起動後にArduinoのリセットボタンを押す必要あり
piroro4560 1:e6a7e0b92032 19 ///
piroro4560 0:6a6e78ee4e08 20
piroro4560 0:6a6e78ee4e08 21 //--------操作方法--------
piroro4560 0:6a6e78ee4e08 22
piroro4560 0:6a6e78ee4e08 23
piroro4560 0:6a6e78ee4e08 24 #include "Master.h"
piroro4560 0:6a6e78ee4e08 25 #include "jy901.h"
piroro4560 0:6a6e78ee4e08 26 #include "PID.h"
piroro4560 0:6a6e78ee4e08 27 #include "SerialArduino.h"
piroro4560 0:6a6e78ee4e08 28
piroro4560 0:6a6e78ee4e08 29 DigitalOut led(LED1);
piroro4560 0:6a6e78ee4e08 30 Master Master;// 出力等の基本クラス
piroro4560 0:6a6e78ee4e08 31 OmniWheel omni(4);
piroro4560 0:6a6e78ee4e08 32 SerialArduino mini(A0, A1, 115200);// Arduinoを用いてPS3コントローラと通信するクラス
piroro4560 0:6a6e78ee4e08 33 JY901 jy(jysda, jyscl);
piroro4560 1:e6a7e0b92032 34 #ifdef RobotNumberIsOne
piroro4560 0:6a6e78ee4e08 35 PID Rotate(6.0, 50.0, 0.0005, 0.01);
piroro4560 1:e6a7e0b92032 36 #else
piroro4560 1:e6a7e0b92032 37 PID Rotate(5.0, 50.0, 0.0005, 0.01);
piroro4560 1:e6a7e0b92032 38 #endif
piroro4560 0:6a6e78ee4e08 39 Timer Time_Shot;
piroro4560 0:6a6e78ee4e08 40
piroro4560 0:6a6e78ee4e08 41 void PS3get(bool flag_PS3print);
piroro4560 0:6a6e78ee4e08 42
piroro4560 0:6a6e78ee4e08 43 uint8_t h1,h2;
piroro4560 0:6a6e78ee4e08 44 bool b[12]= {};
piroro4560 0:6a6e78ee4e08 45 uint8_t st[4]= {};
piroro4560 0:6a6e78ee4e08 46 uint8_t tr[2]= {};
piroro4560 0:6a6e78ee4e08 47
piroro4560 0:6a6e78ee4e08 48 int main()
piroro4560 0:6a6e78ee4e08 49 {
piroro4560 0:6a6e78ee4e08 50 uint8_t mode=0;
piroro4560 0:6a6e78ee4e08 51 bool EdgeToggle[3]={}, pretoggle[3]={};
piroro4560 0:6a6e78ee4e08 52 bool flag_Dribble=false, flag_Shot=false, flag_Rotate;
piroro4560 0:6a6e78ee4e08 53 Time_Shot.start();
piroro4560 0:6a6e78ee4e08 54
piroro4560 0:6a6e78ee4e08 55 double pwm[4]={}, DribblePower = 0.5;
piroro4560 0:6a6e78ee4e08 56 double Vx=0, Vy=0, Vr=0, Rotate_Power=0, V=0, theta=0;
piroro4560 0:6a6e78ee4e08 57 double rawAngle, angleLimit;
piroro4560 0:6a6e78ee4e08 58
piroro4560 0:6a6e78ee4e08 59 Master.SetPS3Address(b, tr, st);
piroro4560 0:6a6e78ee4e08 60 jy.calibrateAll(50);
piroro4560 0:6a6e78ee4e08 61
piroro4560 0:6a6e78ee4e08 62 // DisplayThread.start(Display);
piroro4560 0:6a6e78ee4e08 63 #ifdef RobotNumberIsOne
piroro4560 0:6a6e78ee4e08 64 // 機体ナンバーが 1
piroro4560 0:6a6e78ee4e08 65 double VxLimit=0.75; // X軸方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 66 double VyLimit=0.75; // Y軸方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 67 double VrLimit=0.4; // 回転方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 68 double Bias_Motor=0.75; // モーター出力値のバイアス
piroro4560 0:6a6e78ee4e08 69 omni.wheel[0].setRadian(PI * 1.0 / 4.0);
piroro4560 0:6a6e78ee4e08 70 omni.wheel[1].setRadian(PI * 7.0 / 4.0);
piroro4560 0:6a6e78ee4e08 71 omni.wheel[2].setRadian(PI * 5.0 / 4.0);
piroro4560 0:6a6e78ee4e08 72 omni.wheel[3].setRadian(PI * 3.0 / 4.0);
piroro4560 0:6a6e78ee4e08 73 #else
piroro4560 0:6a6e78ee4e08 74 // 機体ナンバーが 2
piroro4560 0:6a6e78ee4e08 75 double VxLimit=0.8; // X軸方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 76 double VyLimit=0.8; // Y軸方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 77 double VrLimit=0.6; // 回転方向ベクトルの最大値
piroro4560 0:6a6e78ee4e08 78 double Bias_Motor=0.8; // モーター出力値のバイアス
piroro4560 0:6a6e78ee4e08 79 double Bias_DefectiveMD = 0.6; // ダメダメMD補正用バイアス
piroro4560 0:6a6e78ee4e08 80 omni.wheel[0].setRadian(PI * 5.0 / 4.0);
piroro4560 0:6a6e78ee4e08 81 omni.wheel[1].setRadian(PI * 7.0 / 4.0);
piroro4560 0:6a6e78ee4e08 82 omni.wheel[2].setRadian(PI * 1.0 / 4.0);
piroro4560 0:6a6e78ee4e08 83 omni.wheel[3].setRadian(PI * 3.0 / 4.0);
piroro4560 0:6a6e78ee4e08 84 #endif
piroro4560 0:6a6e78ee4e08 85
piroro4560 0:6a6e78ee4e08 86 Rotate.setInputLimits(-180, 180);
piroro4560 0:6a6e78ee4e08 87 Rotate.setOutputLimits(-1*VrLimit,VrLimit);
piroro4560 0:6a6e78ee4e08 88 Rotate.setBias(0);
piroro4560 0:6a6e78ee4e08 89 Rotate.setMode(1);
piroro4560 0:6a6e78ee4e08 90 Rotate.setSetPoint(0);
piroro4560 0:6a6e78ee4e08 91
piroro4560 0:6a6e78ee4e08 92 // 以下ループ
piroro4560 0:6a6e78ee4e08 93 while (true) {
piroro4560 0:6a6e78ee4e08 94 if (mini.getState()) {
piroro4560 0:6a6e78ee4e08 95 rawAngle = jy.getZaxisAngle();
piroro4560 0:6a6e78ee4e08 96 if(rawAngle > 180.0) rawAngle -= 360;
piroro4560 0:6a6e78ee4e08 97
piroro4560 0:6a6e78ee4e08 98 angleLimit = rawAngle;
piroro4560 0:6a6e78ee4e08 99 Rotate.setProcessValue(angleLimit/*-sensor_.ballAngle*/);
piroro4560 0:6a6e78ee4e08 100 Rotate_Power = Rotate.compute();
piroro4560 0:6a6e78ee4e08 101
piroro4560 0:6a6e78ee4e08 102 PS3get(true);
piroro4560 0:6a6e78ee4e08 103
piroro4560 0:6a6e78ee4e08 104 // printf("angle : %d|power : %d | ", (int)rawAngle, (int)(Rotate_Power*100));
piroro4560 0:6a6e78ee4e08 105 printf("(Vx,Vy):(%3d,%3d)|theta:%d|angle:%d | ", (int)(Vx*100), (int)(Vy*100), (int)(theta), (int)angleLimit);
piroro4560 0:6a6e78ee4e08 106
piroro4560 0:6a6e78ee4e08 107 if (fabs(st[2]-128.0) > 50) {
piroro4560 0:6a6e78ee4e08 108 Rotate.setSetPoint(angleLimit);
piroro4560 0:6a6e78ee4e08 109 flag_Rotate = true;
piroro4560 0:6a6e78ee4e08 110 } else {
piroro4560 0:6a6e78ee4e08 111 flag_Rotate = false;
piroro4560 0:6a6e78ee4e08 112 }
piroro4560 0:6a6e78ee4e08 113
piroro4560 0:6a6e78ee4e08 114 if (b[1]) {
piroro4560 0:6a6e78ee4e08 115 jy.yawcalibrate();
piroro4560 0:6a6e78ee4e08 116 Rotate.setSetPoint(0);
piroro4560 0:6a6e78ee4e08 117 }
piroro4560 0:6a6e78ee4e08 118
piroro4560 0:6a6e78ee4e08 119 // モーター出力値の計算
piroro4560 0:6a6e78ee4e08 120 #ifdef RobotNumberIsOne
piroro4560 0:6a6e78ee4e08 121 // 機体ナンバーが 1
piroro4560 0:6a6e78ee4e08 122 Vx = ((st[0]-128.0)/128.0) * VxLimit;
piroro4560 0:6a6e78ee4e08 123 Vy = (128.0-st[1])/128.0 * VyLimit;
piroro4560 0:6a6e78ee4e08 124 Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5;
piroro4560 0:6a6e78ee4e08 125 #else
piroro4560 0:6a6e78ee4e08 126 // 機体ナンバーが 2
piroro4560 0:6a6e78ee4e08 127 Vx = ((st[0]-128.0)/128.0) * VxLimit;
piroro4560 0:6a6e78ee4e08 128 Vy = (128.0-st[1])/128.0 * VyLimit;
piroro4560 0:6a6e78ee4e08 129 Vr = -(st[2]-128.0)/128.0 * VrLimit * 0.5;
piroro4560 0:6a6e78ee4e08 130 #endif
piroro4560 0:6a6e78ee4e08 131 if (!flag_Rotate) {
piroro4560 0:6a6e78ee4e08 132 Vr = Rotate_Power;
piroro4560 0:6a6e78ee4e08 133 }
piroro4560 0:6a6e78ee4e08 134
piroro4560 0:6a6e78ee4e08 135 V = hypot(Vx, Vy);
piroro4560 0:6a6e78ee4e08 136 theta = atan2(Vy, Vx);
piroro4560 0:6a6e78ee4e08 137 #ifdef RobotNumberIsOne
piroro4560 0:6a6e78ee4e08 138 omni.computeCircular(V, theta - angleLimit/180.0*PI, Vr);
piroro4560 0:6a6e78ee4e08 139 #else
piroro4560 0:6a6e78ee4e08 140 omni.computeCircular(V, theta - angleLimit/180.0*PI, -Vr);
piroro4560 0:6a6e78ee4e08 141 #endif
piroro4560 0:6a6e78ee4e08 142
piroro4560 0:6a6e78ee4e08 143 for(int i=0; i < 4; i++) {
piroro4560 0:6a6e78ee4e08 144 if (0) {
piroro4560 0:6a6e78ee4e08 145 if (b[i+4]) {
piroro4560 0:6a6e78ee4e08 146 pwm[i] = 0.5;
piroro4560 0:6a6e78ee4e08 147 // printf("%d ", i);
piroro4560 0:6a6e78ee4e08 148 } else if (b[i+4+4]) {
piroro4560 0:6a6e78ee4e08 149 pwm[i] = -0.5;
piroro4560 0:6a6e78ee4e08 150 } else {
piroro4560 0:6a6e78ee4e08 151 pwm[i] = 0;
piroro4560 0:6a6e78ee4e08 152 }
piroro4560 0:6a6e78ee4e08 153 } else {
piroro4560 0:6a6e78ee4e08 154 pwm[i] = ((double)omni.wheel[i] * Bias_Motor);
piroro4560 0:6a6e78ee4e08 155 }
piroro4560 0:6a6e78ee4e08 156 }
piroro4560 0:6a6e78ee4e08 157 // printf("\r\n");
piroro4560 0:6a6e78ee4e08 158
piroro4560 0:6a6e78ee4e08 159 // フラグ処理
piroro4560 0:6a6e78ee4e08 160 if (b[9]) flag_Dribble = true;
piroro4560 0:6a6e78ee4e08 161 else flag_Dribble = false;
piroro4560 0:6a6e78ee4e08 162
piroro4560 0:6a6e78ee4e08 163 if (b[8] && (Time_Shot.read_ms() > 1000)) {
piroro4560 0:6a6e78ee4e08 164 flag_Shot = true;
piroro4560 0:6a6e78ee4e08 165 Time_Shot.reset();
piroro4560 0:6a6e78ee4e08 166 } else {
piroro4560 0:6a6e78ee4e08 167 flag_Shot = false;
piroro4560 0:6a6e78ee4e08 168 }
piroro4560 0:6a6e78ee4e08 169
piroro4560 0:6a6e78ee4e08 170 // ドリブラー・キッカー
piroro4560 0:6a6e78ee4e08 171 // if (flag_Dribble) esc.setspeed(0.7);
piroro4560 0:6a6e78ee4e08 172 // else esc.setspeed(0.0);
piroro4560 0:6a6e78ee4e08 173 if (flag_Dribble) Master.Dribble(0.7);
piroro4560 0:6a6e78ee4e08 174 else Master.Dribble(0.0);
piroro4560 0:6a6e78ee4e08 175 if (flag_Shot) Master.Shot();
piroro4560 0:6a6e78ee4e08 176
piroro4560 0:6a6e78ee4e08 177 // ニュートラル処理
piroro4560 0:6a6e78ee4e08 178 for (int i=0; i<4; i++) {
piroro4560 0:6a6e78ee4e08 179 if (fabs(pwm[i]) < 0.1) pwm[i] = 0.0;
piroro4560 0:6a6e78ee4e08 180 }
piroro4560 0:6a6e78ee4e08 181
piroro4560 0:6a6e78ee4e08 182 #ifdef RobotNumberIsOne
piroro4560 0:6a6e78ee4e08 183 Master.SetValueMotor(0, pwm[0]);
piroro4560 0:6a6e78ee4e08 184 Master.SetValueMotor(1, pwm[1]);
piroro4560 0:6a6e78ee4e08 185 Master.SetValueMotor(2, -pwm[2]);
piroro4560 0:6a6e78ee4e08 186 Master.SetValueMotor(3, -pwm[3]);
piroro4560 0:6a6e78ee4e08 187 #else
piroro4560 0:6a6e78ee4e08 188 Master.SetValueMotor(0, pwm[0] * Bias_DefectiveMD);
piroro4560 0:6a6e78ee4e08 189 Master.SetValueMotor(1, pwm[1]);
piroro4560 0:6a6e78ee4e08 190 Master.SetValueMotor(2, pwm[2]);
piroro4560 0:6a6e78ee4e08 191 Master.SetValueMotor(3, pwm[3] * Bias_DefectiveMD);
piroro4560 0:6a6e78ee4e08 192 #endif
piroro4560 0:6a6e78ee4e08 193 }
piroro4560 0:6a6e78ee4e08 194 }
piroro4560 0:6a6e78ee4e08 195 }
piroro4560 0:6a6e78ee4e08 196
piroro4560 0:6a6e78ee4e08 197 void PS3get(bool flag_PS3print)
piroro4560 0:6a6e78ee4e08 198 {
piroro4560 0:6a6e78ee4e08 199 h1 = mini.getHedder1();
piroro4560 0:6a6e78ee4e08 200 h2 = mini.getHedder2();
piroro4560 0:6a6e78ee4e08 201 for(int i=0; i<12; i++) {
piroro4560 0:6a6e78ee4e08 202 b[i] = mini.getButton(i);
piroro4560 0:6a6e78ee4e08 203 }
piroro4560 0:6a6e78ee4e08 204 for(int i=0; i<2; i++) {
piroro4560 0:6a6e78ee4e08 205 tr[i] = mini.getTrigger(i);
piroro4560 0:6a6e78ee4e08 206 }
piroro4560 0:6a6e78ee4e08 207 for(int i=0; i<4; i++) {
piroro4560 0:6a6e78ee4e08 208 st[i] = mini.getStick(i);
piroro4560 0:6a6e78ee4e08 209 }
piroro4560 0:6a6e78ee4e08 210 if (flag_PS3print) {
piroro4560 0:6a6e78ee4e08 211 for(int i=0; i<12; i++) printf("%d ",b[i]);
piroro4560 0:6a6e78ee4e08 212 printf("|");
piroro4560 0:6a6e78ee4e08 213 for(int i=0; i<2; i++) printf("%3d ",tr[i]);
piroro4560 0:6a6e78ee4e08 214 printf("|");
piroro4560 0:6a6e78ee4e08 215 for(int i=0; i<4; i++) printf("%3d ",st[i]);
piroro4560 0:6a6e78ee4e08 216 if(mini.getState()) printf("ok");
piroro4560 0:6a6e78ee4e08 217 else printf("bad");
piroro4560 0:6a6e78ee4e08 218 printf("\r\n");
piroro4560 0:6a6e78ee4e08 219 } else {
piroro4560 0:6a6e78ee4e08 220 mini.getState();
piroro4560 0:6a6e78ee4e08 221 }
piroro4560 0:6a6e78ee4e08 222 }