Communicate with PS3 controller
Dependencies: omni_wheel PID jy901 solenoid Master kohiMD lpf SerialArduino RCJESC
main.cpp@7:9b4acb93f94d, 2022-06-23 (annotated)
- Committer:
- piroro4560
- Date:
- Thu Jun 23 15:20:28 2022 +0000
- Revision:
- 7:9b4acb93f94d
- Parent:
- 6:cb4a0fc3f90c
Edit doxygen
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
piroro4560 | 5:232c0cfdec93 | 1 | /// |
piroro4560 | 4:3471cb3eaea4 | 2 | /// @file main.cpp |
piroro4560 | 4:3471cb3eaea4 | 3 | /// @brief ロボカップラジコンのプログラム |
piroro4560 | 4:3471cb3eaea4 | 4 | /// |
piroro4560 | 5:232c0cfdec93 | 5 | /// @note トグルは上が1で下が0 |
piroro4560 | 5:232c0cfdec93 | 6 | /// |
piroro4560 | 5:232c0cfdec93 | 7 | /// @details 右端トグルで速度切り替え |
piroro4560 | 5:232c0cfdec93 | 8 | /// @note 1:速め 0:遅め |
piroro4560 | 5:232c0cfdec93 | 9 | /// |
piroro4560 | 5:232c0cfdec93 | 10 | /// @details 中央トグル2つでモード切替 |
piroro4560 | 7:9b4acb93f94d | 11 | /// @note Refer |
piroro4560 | 7:9b4acb93f94d | 12 | /// - 中央トグルでのモード切替; |
piroro4560 | 7:9b4acb93f94d | 13 | /// - 左0右0:スタート |
piroro4560 | 7:9b4acb93f94d | 14 | /// - 左1右0:キッカーテスト |
piroro4560 | 7:9b4acb93f94d | 15 | /// - 左0右1:ドリブラーテスト |
piroro4560 | 7:9b4acb93f94d | 16 | /// - 左1右1:オムニテスト |
piroro4560 | 7:9b4acb93f94d | 17 | /// - ボタンを押すかトグルスイッチを変えるとワイヤレスモード中止 |
piroro4560 | 4:3471cb3eaea4 | 18 | /// |
piroro4560 | 5:232c0cfdec93 | 19 | /// @details スタート後にPSボタンを押してペアリング 以下操作方法 |
piroro4560 | 7:9b4acb93f94d | 20 | /// @note Refer |
piroro4560 | 7:9b4acb93f94d | 21 | /// - 左スティックで移動(絶対角) |
piroro4560 | 7:9b4acb93f94d | 22 | /// - 右スティックX軸で回転 |
piroro4560 | 7:9b4acb93f94d | 23 | /// - 〇でドリブル、△でシュート |
piroro4560 | 5:232c0cfdec93 | 24 | /// |
piroro4560 | 5:232c0cfdec93 | 25 | /// @attention 1番機は起動後にArduinoのリセットボタンを押す必要あり |
piroro4560 | 5:232c0cfdec93 | 26 | /// |
piroro4560 | 0:00ce070b2f06 | 27 | #include "Master.h" |
piroro4560 | 3:bff63180d3e6 | 28 | #include "jy901.h" |
piroro4560 | 3:bff63180d3e6 | 29 | #include "PID.h" |
piroro4560 | 5:232c0cfdec93 | 30 | #include "omni_wheel.h" |
piroro4560 | 0:00ce070b2f06 | 31 | #include "SerialArduino.h" |
piroro4560 | 0:00ce070b2f06 | 32 | |
piroro4560 | 0:00ce070b2f06 | 33 | DigitalOut led(LED1); |
piroro4560 | 5:232c0cfdec93 | 34 | DigitalIn toggle[3] = { |
piroro4560 | 5:232c0cfdec93 | 35 | DigitalIn(Pin_toggle_0), |
piroro4560 | 5:232c0cfdec93 | 36 | DigitalIn(Pin_toggle_1), |
piroro4560 | 5:232c0cfdec93 | 37 | DigitalIn(Pin_toggle_2) |
piroro4560 | 5:232c0cfdec93 | 38 | }; |
piroro4560 | 5:232c0cfdec93 | 39 | |
piroro4560 | 5:232c0cfdec93 | 40 | SerialArduino mini(Pin_Arduino_TX, Pin_Arduino_RX, 115200); |
piroro4560 | 5:232c0cfdec93 | 41 | Master Master; |
piroro4560 | 5:232c0cfdec93 | 42 | JY901 jy(Pin_JY901_sda, Pin_JY901_scl); |
piroro4560 | 5:232c0cfdec93 | 43 | DigitalIn rawButton(Pin_button); |
piroro4560 | 2:7da4a8e74955 | 44 | OmniWheel omni(4); |
piroro4560 | 2:7da4a8e74955 | 45 | Timer Time_Shot; |
piroro4560 | 5:232c0cfdec93 | 46 | Timer Time_MotorTest; |
piroro4560 | 0:00ce070b2f06 | 47 | |
piroro4560 | 5:232c0cfdec93 | 48 | #ifdef RobotNumberIsOne |
piroro4560 | 5:232c0cfdec93 | 49 | PID Rotate(25.0, 100.0, 0.0001, 0.01); |
piroro4560 | 5:232c0cfdec93 | 50 | #else |
piroro4560 | 5:232c0cfdec93 | 51 | PID Rotate(15.0, 100.0, 0.0001, 0.01); |
piroro4560 | 5:232c0cfdec93 | 52 | #endif |
piroro4560 | 5:232c0cfdec93 | 53 | |
piroro4560 | 5:232c0cfdec93 | 54 | |
piroro4560 | 5:232c0cfdec93 | 55 | /// |
piroro4560 | 5:232c0cfdec93 | 56 | /// @fn PS3get(bool flag_PS3print) |
piroro4560 | 5:232c0cfdec93 | 57 | /// @brief ループ毎に実行。SerialArduinoライブラリを用いてPS3コントローラの値を取得。 |
piroro4560 | 5:232c0cfdec93 | 58 | /// @param flag_PS3print 受け取った値を表示したい時にtrue |
piroro4560 | 5:232c0cfdec93 | 59 | /// |
piroro4560 | 2:7da4a8e74955 | 60 | void PS3get(bool flag_PS3print); |
piroro4560 | 0:00ce070b2f06 | 61 | |
piroro4560 | 5:232c0cfdec93 | 62 | /// |
piroro4560 | 5:232c0cfdec93 | 63 | /// @fn StartDemo(); |
piroro4560 | 5:232c0cfdec93 | 64 | /// DualShock3を用いたラジコン操作 |
piroro4560 | 5:232c0cfdec93 | 65 | /// @brief modeが0の時にボタンを押すとスタート |
piroro4560 | 5:232c0cfdec93 | 66 | /// @attention ロボットの機体番号に応じて出力とピンを変える必要アリ |
piroro4560 | 5:232c0cfdec93 | 67 | /// |
piroro4560 | 5:232c0cfdec93 | 68 | void StartDemo(); |
piroro4560 | 5:232c0cfdec93 | 69 | |
piroro4560 | 5:232c0cfdec93 | 70 | /// |
piroro4560 | 5:232c0cfdec93 | 71 | /// @fn MotorTest() |
piroro4560 | 5:232c0cfdec93 | 72 | /// @brief モーターを4つ連続で回す。1秒で正転反転が切り替わる |
piroro4560 | 5:232c0cfdec93 | 73 | /// @brief modeが2の時にボタンを押すとスタート |
piroro4560 | 5:232c0cfdec93 | 74 | /// |
piroro4560 | 5:232c0cfdec93 | 75 | void MotorTest(); |
piroro4560 | 5:232c0cfdec93 | 76 | |
piroro4560 | 5:232c0cfdec93 | 77 | bool flag_Passfunc; |
piroro4560 | 5:232c0cfdec93 | 78 | uint8_t preButton; |
piroro4560 | 5:232c0cfdec93 | 79 | uint8_t Button; |
piroro4560 | 5:232c0cfdec93 | 80 | uint8_t Toggle_mode=0, Toggle_speed=0; |
piroro4560 | 1:692623e55ff7 | 81 | uint8_t h1,h2; |
piroro4560 | 5:232c0cfdec93 | 82 | bool b[12]= {}; |
piroro4560 | 1:692623e55ff7 | 83 | uint8_t st[4]= {}; |
piroro4560 | 1:692623e55ff7 | 84 | uint8_t tr[2]= {}; |
piroro4560 | 1:692623e55ff7 | 85 | |
piroro4560 | 0:00ce070b2f06 | 86 | int main() |
piroro4560 | 3:bff63180d3e6 | 87 | { |
piroro4560 | 5:232c0cfdec93 | 88 | while(1) { |
piroro4560 | 5:232c0cfdec93 | 89 | Button = (int)rawButton; |
piroro4560 | 5:232c0cfdec93 | 90 | Toggle_mode = (int)(!toggle[0])*2 + (int)(!toggle[1]); |
piroro4560 | 5:232c0cfdec93 | 91 | Toggle_speed = (int)(!toggle[2]); |
piroro4560 | 5:232c0cfdec93 | 92 | |
piroro4560 | 5:232c0cfdec93 | 93 | PS3get(false); |
piroro4560 | 5:232c0cfdec93 | 94 | |
piroro4560 | 5:232c0cfdec93 | 95 | printf("mode:%d|speed:%d | button:(%d,%d) ", Toggle_mode, Toggle_speed, Button, preButton); |
piroro4560 | 5:232c0cfdec93 | 96 | |
piroro4560 | 5:232c0cfdec93 | 97 | if (Button) { |
piroro4560 | 5:232c0cfdec93 | 98 | switch (Toggle_mode) { |
piroro4560 | 5:232c0cfdec93 | 99 | case 0 : |
piroro4560 | 5:232c0cfdec93 | 100 | StartDemo(); |
piroro4560 | 5:232c0cfdec93 | 101 | break; |
piroro4560 | 5:232c0cfdec93 | 102 | case 1 : |
piroro4560 | 5:232c0cfdec93 | 103 | printf("Kicker Test \r\n"); |
piroro4560 | 5:232c0cfdec93 | 104 | Master.Shot(); |
piroro4560 | 5:232c0cfdec93 | 105 | break; |
piroro4560 | 5:232c0cfdec93 | 106 | case 2 : |
piroro4560 | 5:232c0cfdec93 | 107 | printf("Dribbler Test \r\n"); |
piroro4560 | 5:232c0cfdec93 | 108 | Master.Dribble(0.7); |
piroro4560 | 5:232c0cfdec93 | 109 | break; |
piroro4560 | 5:232c0cfdec93 | 110 | case 3 : |
piroro4560 | 5:232c0cfdec93 | 111 | MotorTest(); |
piroro4560 | 5:232c0cfdec93 | 112 | break; |
piroro4560 | 3:bff63180d3e6 | 113 | } |
piroro4560 | 5:232c0cfdec93 | 114 | } else { |
piroro4560 | 5:232c0cfdec93 | 115 | printf("\r\n"); |
piroro4560 | 5:232c0cfdec93 | 116 | Master.Dribble(0.0); |
piroro4560 | 5:232c0cfdec93 | 117 | for (int i=0; i<4; i++) Master.SetValueMotor(i, 0.0); |
piroro4560 | 0:00ce070b2f06 | 118 | } |
piroro4560 | 5:232c0cfdec93 | 119 | preButton = Button; |
piroro4560 | 0:00ce070b2f06 | 120 | } |
piroro4560 | 1:692623e55ff7 | 121 | } |
piroro4560 | 1:692623e55ff7 | 122 | |
piroro4560 | 2:7da4a8e74955 | 123 | void PS3get(bool flag_PS3print) |
piroro4560 | 1:692623e55ff7 | 124 | { |
piroro4560 | 1:692623e55ff7 | 125 | h1 = mini.getHedder1(); |
piroro4560 | 1:692623e55ff7 | 126 | h2 = mini.getHedder2(); |
piroro4560 | 1:692623e55ff7 | 127 | for(int i=0; i<12; i++) { |
piroro4560 | 1:692623e55ff7 | 128 | b[i] = mini.getButton(i); |
piroro4560 | 1:692623e55ff7 | 129 | } |
piroro4560 | 1:692623e55ff7 | 130 | for(int i=0; i<2; i++) { |
piroro4560 | 1:692623e55ff7 | 131 | tr[i] = mini.getTrigger(i); |
piroro4560 | 1:692623e55ff7 | 132 | } |
piroro4560 | 1:692623e55ff7 | 133 | for(int i=0; i<4; i++) { |
piroro4560 | 1:692623e55ff7 | 134 | st[i] = mini.getStick(i); |
piroro4560 | 1:692623e55ff7 | 135 | } |
piroro4560 | 3:bff63180d3e6 | 136 | if (flag_PS3print) { |
piroro4560 | 3:bff63180d3e6 | 137 | for(int i=0; i<12; i++) printf("%d ",b[i]); |
piroro4560 | 3:bff63180d3e6 | 138 | printf("|"); |
piroro4560 | 3:bff63180d3e6 | 139 | for(int i=0; i<2; i++) printf("%3d ",tr[i]); |
piroro4560 | 3:bff63180d3e6 | 140 | printf("|"); |
piroro4560 | 3:bff63180d3e6 | 141 | for(int i=0; i<4; i++) printf("%3d ",st[i]); |
piroro4560 | 3:bff63180d3e6 | 142 | if(mini.getState()) printf("ok"); |
piroro4560 | 3:bff63180d3e6 | 143 | else printf("bad"); |
piroro4560 | 3:bff63180d3e6 | 144 | printf("\r\n"); |
piroro4560 | 3:bff63180d3e6 | 145 | } else { |
piroro4560 | 3:bff63180d3e6 | 146 | mini.getState(); |
piroro4560 | 2:7da4a8e74955 | 147 | } |
piroro4560 | 5:232c0cfdec93 | 148 | } |
piroro4560 | 5:232c0cfdec93 | 149 | |
piroro4560 | 5:232c0cfdec93 | 150 | void StartDemo() |
piroro4560 | 5:232c0cfdec93 | 151 | { |
piroro4560 | 5:232c0cfdec93 | 152 | bool flag_Dribble=false; |
piroro4560 | 5:232c0cfdec93 | 153 | bool flag_Shot=false; |
piroro4560 | 5:232c0cfdec93 | 154 | bool flag_Rotate=false; |
piroro4560 | 5:232c0cfdec93 | 155 | bool b_[12]; |
piroro4560 | 5:232c0cfdec93 | 156 | |
piroro4560 | 5:232c0cfdec93 | 157 | double pwm[4]={}; |
piroro4560 | 5:232c0cfdec93 | 158 | double DribblePower = 0.5; |
piroro4560 | 5:232c0cfdec93 | 159 | double Vx=0; |
piroro4560 | 5:232c0cfdec93 | 160 | double Vy=0; |
piroro4560 | 5:232c0cfdec93 | 161 | double Vr=0; |
piroro4560 | 5:232c0cfdec93 | 162 | double RotatePower=0; |
piroro4560 | 5:232c0cfdec93 | 163 | double V=0; |
piroro4560 | 5:232c0cfdec93 | 164 | double theta=0; |
piroro4560 | 5:232c0cfdec93 | 165 | double rawAngle=0; /// jy901の生データ |
piroro4560 | 5:232c0cfdec93 | 166 | double targetAngle=0; /// PIDの目標角(-180 ~ 180) |
piroro4560 | 5:232c0cfdec93 | 167 | double limitedAngle=0; /// rawAngleを(-180~180)の範囲で表す |
piroro4560 | 5:232c0cfdec93 | 168 | double processAngle=0; /// PIDで補正される値 |
piroro4560 | 5:232c0cfdec93 | 169 | |
piroro4560 | 5:232c0cfdec93 | 170 | Time_Shot.start(); |
piroro4560 | 5:232c0cfdec93 | 171 | jy.calibrateAll(50); |
piroro4560 | 5:232c0cfdec93 | 172 | |
piroro4560 | 5:232c0cfdec93 | 173 | #ifdef RobotNumberIsOne |
piroro4560 | 5:232c0cfdec93 | 174 | // 機体ナンバーが 1 |
piroro4560 | 5:232c0cfdec93 | 175 | double VxLimit=0.75; // X軸方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 176 | double VyLimit=0.75; // Y軸方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 177 | double VrLimit=0.25; // 回転方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 178 | double Bias_Motor=0.75; // モーター出力値のバイアス |
piroro4560 | 5:232c0cfdec93 | 179 | omni.wheel[0].setRadian(PI * 1.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 180 | omni.wheel[1].setRadian(PI * 7.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 181 | omni.wheel[2].setRadian(PI * 5.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 182 | omni.wheel[3].setRadian(PI * 3.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 183 | #else |
piroro4560 | 5:232c0cfdec93 | 184 | // 機体ナンバーが 2 |
piroro4560 | 5:232c0cfdec93 | 185 | double VxLimit=0.8; // X軸方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 186 | double VyLimit=0.8; // Y軸方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 187 | double VrLimit=0.3; // 回転方向ベクトルの最大値 |
piroro4560 | 5:232c0cfdec93 | 188 | double Bias_Motor=0.8; // モーター出力値のバイアス |
piroro4560 | 5:232c0cfdec93 | 189 | double Bias_DefectiveMD = 0.6; // ダメダメMD補正用バイアス |
piroro4560 | 5:232c0cfdec93 | 190 | omni.wheel[0].setRadian(PI * 5.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 191 | omni.wheel[1].setRadian(PI * 7.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 192 | omni.wheel[2].setRadian(PI * 1.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 193 | omni.wheel[3].setRadian(PI * 3.0 / 4.0); |
piroro4560 | 5:232c0cfdec93 | 194 | #endif |
piroro4560 | 5:232c0cfdec93 | 195 | |
piroro4560 | 5:232c0cfdec93 | 196 | Rotate.setInputLimits(-360, 360); |
piroro4560 | 5:232c0cfdec93 | 197 | Rotate.setOutputLimits(-1*VrLimit,VrLimit); |
piroro4560 | 5:232c0cfdec93 | 198 | Rotate.setBias(0); |
piroro4560 | 5:232c0cfdec93 | 199 | Rotate.setMode(1); |
piroro4560 | 5:232c0cfdec93 | 200 | Rotate.setSetPoint(targetAngle); |
piroro4560 | 5:232c0cfdec93 | 201 | |
piroro4560 | 5:232c0cfdec93 | 202 | // 以下ループ |
piroro4560 | 5:232c0cfdec93 | 203 | while (true) { |
piroro4560 | 5:232c0cfdec93 | 204 | PS3get(true); |
piroro4560 | 5:232c0cfdec93 | 205 | Button = rawButton; |
piroro4560 | 5:232c0cfdec93 | 206 | |
piroro4560 | 5:232c0cfdec93 | 207 | // UIボードの処理 |
piroro4560 | 5:232c0cfdec93 | 208 | Toggle_mode = (int)(!toggle[0])*2 + (int)(!toggle[1]); |
piroro4560 | 5:232c0cfdec93 | 209 | Toggle_speed = (int)(!toggle[2]); |
piroro4560 | 5:232c0cfdec93 | 210 | if (!Button && preButton) { |
piroro4560 | 5:232c0cfdec93 | 211 | if (!flag_Passfunc) { |
piroro4560 | 5:232c0cfdec93 | 212 | flag_Passfunc = true; |
piroro4560 | 5:232c0cfdec93 | 213 | } else { |
piroro4560 | 5:232c0cfdec93 | 214 | Toggle_mode = 4; |
piroro4560 | 5:232c0cfdec93 | 215 | } |
piroro4560 | 5:232c0cfdec93 | 216 | } |
piroro4560 | 5:232c0cfdec93 | 217 | if (Toggle_mode!=0) { |
piroro4560 | 5:232c0cfdec93 | 218 | for (int i=0; i<4; i++) Master.SetValueMotor(i, 0.0); |
piroro4560 | 5:232c0cfdec93 | 219 | Master.Dribble(0.0); |
piroro4560 | 5:232c0cfdec93 | 220 | Time_MotorTest.reset(); |
piroro4560 | 5:232c0cfdec93 | 221 | Time_MotorTest.stop(); |
piroro4560 | 5:232c0cfdec93 | 222 | flag_Passfunc = false; |
piroro4560 | 5:232c0cfdec93 | 223 | return; |
piroro4560 | 5:232c0cfdec93 | 224 | } |
piroro4560 | 5:232c0cfdec93 | 225 | |
piroro4560 | 5:232c0cfdec93 | 226 | // 以下ペアリング中のループ |
piroro4560 | 5:232c0cfdec93 | 227 | if (mini.getState()) { |
piroro4560 | 5:232c0cfdec93 | 228 | |
piroro4560 | 5:232c0cfdec93 | 229 | // ジャイロ |
piroro4560 | 5:232c0cfdec93 | 230 | rawAngle = jy.getZaxisAngle(); |
piroro4560 | 5:232c0cfdec93 | 231 | if (rawAngle > 180.0) rawAngle -= 360; |
piroro4560 | 5:232c0cfdec93 | 232 | if (rawAngle < -180.0) rawAngle += 360; |
piroro4560 | 5:232c0cfdec93 | 233 | limitedAngle = rawAngle; |
piroro4560 | 5:232c0cfdec93 | 234 | |
piroro4560 | 5:232c0cfdec93 | 235 | // 右スティックで回転 |
piroro4560 | 5:232c0cfdec93 | 236 | if (fabs(st[2]-128.0) > 30) { |
piroro4560 | 5:232c0cfdec93 | 237 | targetAngle = limitedAngle; |
piroro4560 | 5:232c0cfdec93 | 238 | flag_Rotate = true; |
piroro4560 | 5:232c0cfdec93 | 239 | } else { |
piroro4560 | 5:232c0cfdec93 | 240 | flag_Rotate = false; |
piroro4560 | 5:232c0cfdec93 | 241 | } |
piroro4560 | 5:232c0cfdec93 | 242 | |
piroro4560 | 5:232c0cfdec93 | 243 | if ((st[3] > 220) && b[10] && !b_[10]) { |
piroro4560 | 5:232c0cfdec93 | 244 | targetAngle = fmod((targetAngle + 180), 360); |
piroro4560 | 5:232c0cfdec93 | 245 | } |
piroro4560 | 5:232c0cfdec93 | 246 | |
piroro4560 | 5:232c0cfdec93 | 247 | // 零点出し |
piroro4560 | 5:232c0cfdec93 | 248 | if (b[1]) { |
piroro4560 | 5:232c0cfdec93 | 249 | jy.yawcalibrate(); |
piroro4560 | 5:232c0cfdec93 | 250 | Rotate.setSetPoint(0); |
piroro4560 | 5:232c0cfdec93 | 251 | targetAngle = 0; |
piroro4560 | 5:232c0cfdec93 | 252 | } |
piroro4560 | 5:232c0cfdec93 | 253 | |
piroro4560 | 5:232c0cfdec93 | 254 | // PIDの調整 |
piroro4560 | 5:232c0cfdec93 | 255 | processAngle = limitedAngle - targetAngle; |
piroro4560 | 5:232c0cfdec93 | 256 | if (processAngle > 180.0) processAngle = processAngle - 360.0; |
piroro4560 | 5:232c0cfdec93 | 257 | if (processAngle < -180.0) processAngle = processAngle + 360.0; |
piroro4560 | 5:232c0cfdec93 | 258 | Rotate.setProcessValue(processAngle); |
piroro4560 | 5:232c0cfdec93 | 259 | RotatePower = Rotate.compute(); |
piroro4560 | 5:232c0cfdec93 | 260 | |
piroro4560 | 5:232c0cfdec93 | 261 | // モーター出力値の計算 |
piroro4560 | 5:232c0cfdec93 | 262 | #ifdef RobotNumberIsOne |
piroro4560 | 5:232c0cfdec93 | 263 | // 機体ナンバーが 1 |
piroro4560 | 5:232c0cfdec93 | 264 | Vx = ((st[0]-128.0)/128.0) * VxLimit; |
piroro4560 | 5:232c0cfdec93 | 265 | Vy = (128.0-st[1])/128.0 * VyLimit; |
piroro4560 | 5:232c0cfdec93 | 266 | Vr = -(st[2]-128.0)/128.0 * VrLimit; |
piroro4560 | 5:232c0cfdec93 | 267 | #else |
piroro4560 | 5:232c0cfdec93 | 268 | // 機体ナンバーが 2 |
piroro4560 | 5:232c0cfdec93 | 269 | Vx = ((st[0]-128.0)/128.0) * VxLimit; |
piroro4560 | 5:232c0cfdec93 | 270 | Vy = (128.0-st[1])/128.0 * VyLimit; |
piroro4560 | 5:232c0cfdec93 | 271 | Vr = -(st[2]-128.0)/128.0 * VrLimit; |
piroro4560 | 5:232c0cfdec93 | 272 | #endif |
piroro4560 | 5:232c0cfdec93 | 273 | |
piroro4560 | 5:232c0cfdec93 | 274 | if (!flag_Rotate) { |
piroro4560 | 5:232c0cfdec93 | 275 | Vr = RotatePower; |
piroro4560 | 5:232c0cfdec93 | 276 | } |
piroro4560 | 5:232c0cfdec93 | 277 | |
piroro4560 | 5:232c0cfdec93 | 278 | V = hypot(Vx, Vy); |
piroro4560 | 5:232c0cfdec93 | 279 | if (!Toggle_speed) V *= 0.5; |
piroro4560 | 5:232c0cfdec93 | 280 | theta = atan2(Vy, Vx); |
piroro4560 | 5:232c0cfdec93 | 281 | #ifdef RobotNumberIsOne |
piroro4560 | 5:232c0cfdec93 | 282 | omni.computeCircular(V, theta - limitedAngle/180.0*PI, Vr); |
piroro4560 | 5:232c0cfdec93 | 283 | #else |
piroro4560 | 5:232c0cfdec93 | 284 | omni.computeCircular(V, theta - limitedAngle/180.0*PI, -Vr); |
piroro4560 | 5:232c0cfdec93 | 285 | #endif |
piroro4560 | 5:232c0cfdec93 | 286 | for(int i=0; i < 4; i++) { |
piroro4560 | 5:232c0cfdec93 | 287 | pwm[i] = ((double)omni.wheel[i] * Bias_Motor); |
piroro4560 | 5:232c0cfdec93 | 288 | } |
piroro4560 | 5:232c0cfdec93 | 289 | |
piroro4560 | 5:232c0cfdec93 | 290 | // フラグ処理 |
piroro4560 | 5:232c0cfdec93 | 291 | if (b[9]) flag_Dribble = true; |
piroro4560 | 5:232c0cfdec93 | 292 | else flag_Dribble = false; |
piroro4560 | 5:232c0cfdec93 | 293 | |
piroro4560 | 5:232c0cfdec93 | 294 | if (b[8] && (Time_Shot.read_ms() > 1000)) { |
piroro4560 | 5:232c0cfdec93 | 295 | flag_Shot = true; |
piroro4560 | 5:232c0cfdec93 | 296 | Time_Shot.reset(); |
piroro4560 | 5:232c0cfdec93 | 297 | } else { |
piroro4560 | 5:232c0cfdec93 | 298 | flag_Shot = false; |
piroro4560 | 5:232c0cfdec93 | 299 | } |
piroro4560 | 5:232c0cfdec93 | 300 | |
piroro4560 | 5:232c0cfdec93 | 301 | // ドリブラー・キッカー |
piroro4560 | 5:232c0cfdec93 | 302 | if (flag_Dribble) Master.Dribble(0.7); |
piroro4560 | 5:232c0cfdec93 | 303 | else Master.Dribble(0.0); |
piroro4560 | 5:232c0cfdec93 | 304 | if (flag_Shot) Master.Shot(); |
piroro4560 | 5:232c0cfdec93 | 305 | |
piroro4560 | 5:232c0cfdec93 | 306 | // ニュートラル処理 |
piroro4560 | 5:232c0cfdec93 | 307 | for (int i=0; i<4; i++) { |
piroro4560 | 5:232c0cfdec93 | 308 | if (fabs(pwm[i]) < 0.05) pwm[i] = 0.0; |
piroro4560 | 5:232c0cfdec93 | 309 | } |
piroro4560 | 5:232c0cfdec93 | 310 | |
piroro4560 | 5:232c0cfdec93 | 311 | #ifdef RobotNumberIsOne |
piroro4560 | 5:232c0cfdec93 | 312 | Master.SetValueMotor(0, pwm[0]); |
piroro4560 | 5:232c0cfdec93 | 313 | Master.SetValueMotor(1, pwm[1]); |
piroro4560 | 5:232c0cfdec93 | 314 | Master.SetValueMotor(2, -pwm[2]); |
piroro4560 | 5:232c0cfdec93 | 315 | Master.SetValueMotor(3, -pwm[3]); |
piroro4560 | 5:232c0cfdec93 | 316 | #else |
piroro4560 | 5:232c0cfdec93 | 317 | Master.SetValueMotor(0, pwm[0] * Bias_DefectiveMD); |
piroro4560 | 5:232c0cfdec93 | 318 | Master.SetValueMotor(1, pwm[1]); |
piroro4560 | 5:232c0cfdec93 | 319 | Master.SetValueMotor(2, pwm[2]); |
piroro4560 | 5:232c0cfdec93 | 320 | Master.SetValueMotor(3, pwm[3] * Bias_DefectiveMD); |
piroro4560 | 5:232c0cfdec93 | 321 | #endif |
piroro4560 | 5:232c0cfdec93 | 322 | |
piroro4560 | 5:232c0cfdec93 | 323 | printf("(Vx,Vy, Vr):(%3d,%3d,%3d)|theta:%d | angle:%d | speed:%d | " |
piroro4560 | 5:232c0cfdec93 | 324 | , (int)(Vx*100), (int)(Vy*100), (int)(Vr*100), (int)(theta), (int)limitedAngle, Toggle_speed); |
piroro4560 | 5:232c0cfdec93 | 325 | } |
piroro4560 | 5:232c0cfdec93 | 326 | |
piroro4560 | 5:232c0cfdec93 | 327 | // 1ループ前のボタンの値 |
piroro4560 | 5:232c0cfdec93 | 328 | preButton = Button; |
piroro4560 | 5:232c0cfdec93 | 329 | for (int i=0; i<12; i++) b_[i] = b[i]; |
piroro4560 | 5:232c0cfdec93 | 330 | } |
piroro4560 | 5:232c0cfdec93 | 331 | } |
piroro4560 | 5:232c0cfdec93 | 332 | |
piroro4560 | 5:232c0cfdec93 | 333 | void MotorTest() |
piroro4560 | 5:232c0cfdec93 | 334 | { |
piroro4560 | 5:232c0cfdec93 | 335 | Time_MotorTest.start(); |
piroro4560 | 5:232c0cfdec93 | 336 | uint8_t Num_MotorTest = 0; |
piroro4560 | 5:232c0cfdec93 | 337 | double pwm=0.0; |
piroro4560 | 5:232c0cfdec93 | 338 | |
piroro4560 | 5:232c0cfdec93 | 339 | while(1) { |
piroro4560 | 5:232c0cfdec93 | 340 | Button = rawButton; |
piroro4560 | 5:232c0cfdec93 | 341 | pwm = sin(Time_MotorTest.read() * PI); |
piroro4560 | 5:232c0cfdec93 | 342 | Master.SetValueMotor(Num_MotorTest, pwm); |
piroro4560 | 5:232c0cfdec93 | 343 | if (Time_MotorTest.read() > 2.0) { |
piroro4560 | 5:232c0cfdec93 | 344 | Master.SetValueMotor(Num_MotorTest, 0.0); |
piroro4560 | 5:232c0cfdec93 | 345 | Num_MotorTest = (Num_MotorTest+1) % 4; |
piroro4560 | 5:232c0cfdec93 | 346 | Time_MotorTest.reset(); |
piroro4560 | 5:232c0cfdec93 | 347 | } |
piroro4560 | 5:232c0cfdec93 | 348 | if (!Button && preButton) { |
piroro4560 | 5:232c0cfdec93 | 349 | if (!flag_Passfunc) { |
piroro4560 | 5:232c0cfdec93 | 350 | flag_Passfunc = true; |
piroro4560 | 5:232c0cfdec93 | 351 | } else { |
piroro4560 | 5:232c0cfdec93 | 352 | for (int i=0; i<4; i++) Master.SetValueMotor(i, 0.0); |
piroro4560 | 5:232c0cfdec93 | 353 | Time_MotorTest.reset(); |
piroro4560 | 5:232c0cfdec93 | 354 | Time_MotorTest.stop(); |
piroro4560 | 5:232c0cfdec93 | 355 | flag_Passfunc = false; |
piroro4560 | 5:232c0cfdec93 | 356 | return; |
piroro4560 | 5:232c0cfdec93 | 357 | } |
piroro4560 | 5:232c0cfdec93 | 358 | } |
piroro4560 | 5:232c0cfdec93 | 359 | printf("Motor Test | motor%d:%3d | button:(%d,%d) | \r\n" |
piroro4560 | 5:232c0cfdec93 | 360 | , Num_MotorTest, (int)((pwm)*100), (int)Button, preButton); |
piroro4560 | 5:232c0cfdec93 | 361 | preButton = Button; |
piroro4560 | 5:232c0cfdec93 | 362 | } |
piroro4560 | 3:bff63180d3e6 | 363 | } |