Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed YKNCT_Movement SBDBT BNO055 YKNCT_MD YKNCT_I2C
main.cpp@22:9d77148a3f09, 2020-03-23 (annotated)
- Committer:
- yoshidayuito
- Date:
- Mon Mar 23 05:34:40 2020 +0000
- Revision:
- 22:9d77148a3f09
- Parent:
- 21:22b863d32705
- Child:
- 23:98b634305bab
add KyoRobo Move;Ver.yoshida
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| TakushimaYukimasa | 0:9e851dc42cde | 1 | /** |
| TakushimaYukimasa | 0:9e851dc42cde | 2 | ******************************************************************************** |
| TakushimaYukimasa | 0:9e851dc42cde | 3 | * @file main.c |
| TakushimaYukimasa | 0:9e851dc42cde | 4 | * @author You |
| TakushimaYukimasa | 0:9e851dc42cde | 5 | * @version V?.?.? |
| TakushimaYukimasa | 0:9e851dc42cde | 6 | * @date Today |
| TakushimaYukimasa | 0:9e851dc42cde | 7 | * @brief メインファイル |
| TakushimaYukimasa | 0:9e851dc42cde | 8 | ****************************************************************************** |
| TakushimaYukimasa | 0:9e851dc42cde | 9 | */ |
| TakushimaYukimasa | 0:9e851dc42cde | 10 | |
| TakushimaYukimasa | 0:9e851dc42cde | 11 | /* Includes ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 12 | #include <main.h> |
| TakushimaYukimasa | 0:9e851dc42cde | 13 | |
| TakushimaYukimasa | 0:9e851dc42cde | 14 | /* 型定義 --------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 15 | |
| TakushimaYukimasa | 0:9e851dc42cde | 16 | /* ロボットの加速度 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 17 | ROCATION NowAcc; |
| TakushimaYukimasa | 0:9e851dc42cde | 18 | /* ロボットの座標 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 19 | ROCATION NowLoc; |
| TakushimaYukimasa | 0:9e851dc42cde | 20 | |
| TakushimaYukimasa | 0:9e851dc42cde | 21 | /* 定数定義 ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 22 | /* マクロ定義 ----------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 23 | /* 関数プロトタイプ宣言 -------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 24 | |
| TakushimaYukimasa | 0:9e851dc42cde | 25 | /* タイマ呼び出し用 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 26 | void IT_CallBack(void); |
| TakushimaYukimasa | 0:9e851dc42cde | 27 | |
| TakushimaYukimasa | 0:9e851dc42cde | 28 | /* 自己位置推定処理 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 29 | void LocEstimate(void); |
| TakushimaYukimasa | 0:9e851dc42cde | 30 | |
| yoshidayuito | 7:8bea84f72e64 | 31 | /* 壁あて */ |
| yoshidayuito | 7:8bea84f72e64 | 32 | void ToWall(void); |
| TakushimaYukimasa | 0:9e851dc42cde | 33 | |
| yoshidayuito | 13:c8af1467ba8b | 34 | /* x座標移動 */ |
| yoshidayuito | 13:c8af1467ba8b | 35 | int XCooMove(int Tar,int Err); |
| yoshidayuito | 13:c8af1467ba8b | 36 | |
| yoshidayuito | 16:ea3008995c41 | 37 | /* ライン補正 */ |
| yoshidayuito | 17:5b4080915375 | 38 | int LineCor(int Line_Dire); |
| yoshidayuito | 16:ea3008995c41 | 39 | |
| yoshidayuito | 22:9d77148a3f09 | 40 | /* オムニ加算式 */ |
| yoshidayuito | 16:ea3008995c41 | 41 | void SubOmuni(int X,int Y,int R); |
| yoshidayuito | 16:ea3008995c41 | 42 | |
| TakushimaYukimasa | 0:9e851dc42cde | 43 | /* 変数定義 ------------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 44 | |
| TakushimaYukimasa | 0:9e851dc42cde | 45 | /* 操作権 0…なし 1…手動 2…自動 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 46 | int operate=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 47 | |
| TakushimaYukimasa | 0:9e851dc42cde | 48 | /* 自動シーケンス */ |
| TakushimaYukimasa | 0:9e851dc42cde | 49 | int auto_mode=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 50 | |
| TakushimaYukimasa | 0:9e851dc42cde | 51 | /* 直読みエンコーダ角度保存(degree) */ |
| TakushimaYukimasa | 0:9e851dc42cde | 52 | double EncoderDeg[EncoderMAX] = {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 53 | |
| TakushimaYukimasa | 0:9e851dc42cde | 54 | /* 足回り値保存変数 */ |
| yoshidayuito | 7:8bea84f72e64 | 55 | int MovMotor[4]= {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 56 | |
| TakushimaYukimasa | 0:9e851dc42cde | 57 | /* 自動yaw補整目標角度 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 58 | double TarTheta=0; |
| TakushimaYukimasa | 0:9e851dc42cde | 59 | |
| yoshidayuito | 22:9d77148a3f09 | 60 | /* ライン補正移動方向 0…左 1…右 2…直進*/ |
| yoshidayuito | 17:5b4080915375 | 61 | int Line_Dire=0; |
| yoshidayuito | 13:c8af1467ba8b | 62 | |
| yoshidayuito | 22:9d77148a3f09 | 63 | /* ライン番号 */ |
| yoshidayuito | 22:9d77148a3f09 | 64 | int Line_Num=0; |
| yoshidayuito | 22:9d77148a3f09 | 65 | |
| TakushimaYukimasa | 0:9e851dc42cde | 66 | /* クラス定義 ----------------------------------------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 67 | |
| TakushimaYukimasa | 0:9e851dc42cde | 68 | /* 割り込み用クラス */ |
| TakushimaYukimasa | 0:9e851dc42cde | 69 | Ticker flipper; |
| TakushimaYukimasa | 0:9e851dc42cde | 70 | |
| TakushimaYukimasa | 0:9e851dc42cde | 71 | /* UART (Tx,Rx) */ |
| TakushimaYukimasa | 0:9e851dc42cde | 72 | Serial telemetry(USBTX, USBRX, 115200); |
| TakushimaYukimasa | 0:9e851dc42cde | 73 | |
| TakushimaYukimasa | 0:9e851dc42cde | 74 | /* コントローラー */ |
| TakushimaYukimasa | 0:9e851dc42cde | 75 | SBDBT DS3(PA_0, PA_1, 9600); |
| TakushimaYukimasa | 0:9e851dc42cde | 76 | |
| TakushimaYukimasa | 0:9e851dc42cde | 77 | /* オンボードLED */ |
| TakushimaYukimasa | 0:9e851dc42cde | 78 | DigitalOut led(LED2); |
| TakushimaYukimasa | 0:9e851dc42cde | 79 | |
| TakushimaYukimasa | 0:9e851dc42cde | 80 | /* USERボタン */ |
| TakushimaYukimasa | 0:9e851dc42cde | 81 | DigitalIn UB(PC_13,PullDown); |
| TakushimaYukimasa | 0:9e851dc42cde | 82 | |
| TakushimaYukimasa | 0:9e851dc42cde | 83 | /* エンコーダーピン CS */ |
| TakushimaYukimasa | 0:9e851dc42cde | 84 | DigitalOut CS[] = {PA_2,PA_3}; |
| TakushimaYukimasa | 0:9e851dc42cde | 85 | DigitalOut CL[] = {PA_4,PA_5}; |
| TakushimaYukimasa | 0:9e851dc42cde | 86 | DigitalIn DO[] = {PA_6,PA_7}; |
| TakushimaYukimasa | 0:9e851dc42cde | 87 | |
| yoshidayuito | 1:520233a969e2 | 88 | /* ジャイロ用タイマー */ |
| yoshidayuito | 1:520233a969e2 | 89 | Timer yawCnt; |
| yoshidayuito | 1:520233a969e2 | 90 | |
| yoshidayuito | 22:9d77148a3f09 | 91 | /* 前進用タイマー */ |
| yoshidayuito | 22:9d77148a3f09 | 92 | Timer Forward; |
| yoshidayuito | 22:9d77148a3f09 | 93 | |
| TakushimaYukimasa | 0:9e851dc42cde | 94 | /* 足回り動作クラス定義 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 95 | Move omuni(MovMotor,NowLoc.theta); |
| TakushimaYukimasa | 0:9e851dc42cde | 96 | |
| TakushimaYukimasa | 0:9e851dc42cde | 97 | /* I2C MDのクラス定義 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 98 | YKNCT_MD_I2C MD(PB_9,PB_8); |
| TakushimaYukimasa | 0:9e851dc42cde | 99 | |
| yoshidayuito | 8:367c7d6ef5a3 | 100 | /* I2C Inputのクラス定義 */ |
| yoshidayuito | 8:367c7d6ef5a3 | 101 | YKNCT_I2C_IN In(PB_9,PB_8); |
| yoshidayuito | 8:367c7d6ef5a3 | 102 | |
| TakushimaYukimasa | 0:9e851dc42cde | 103 | /* ジャイロのピン設定 */ |
| TakushimaYukimasa | 0:9e851dc42cde | 104 | BNO055 bno(PB_9, PB_8); |
| TakushimaYukimasa | 0:9e851dc42cde | 105 | |
| TakushimaYukimasa | 0:9e851dc42cde | 106 | |
| TakushimaYukimasa | 0:9e851dc42cde | 107 | /*----------------------------------- main ----------------------------------*/ |
| TakushimaYukimasa | 0:9e851dc42cde | 108 | int main() |
| TakushimaYukimasa | 0:9e851dc42cde | 109 | { |
| yoshidayuito | 7:8bea84f72e64 | 110 | telemetry.printf("\n\rMainStart"); |
| TakushimaYukimasa | 0:9e851dc42cde | 111 | |
| yoshidayuito | 7:8bea84f72e64 | 112 | /* 割り込みの設定 |
| yoshidayuito | 7:8bea84f72e64 | 113 | * IT_CallBack関数を0.1msで割り込み */ |
| yoshidayuito | 7:8bea84f72e64 | 114 | flipper.attach_us(&IT_CallBack, 100); |
| TakushimaYukimasa | 0:9e851dc42cde | 115 | |
| yoshidayuito | 7:8bea84f72e64 | 116 | /* ジャイロの設定 */ |
| yoshidayuito | 7:8bea84f72e64 | 117 | bno.setmode(OPERATION_MODE_IMUPLUS); |
| TakushimaYukimasa | 0:9e851dc42cde | 118 | |
| yoshidayuito | 7:8bea84f72e64 | 119 | /* I2CMDの設定 */ |
| yoshidayuito | 7:8bea84f72e64 | 120 | MD.Init(0,MD_SMB); |
| yoshidayuito | 7:8bea84f72e64 | 121 | MD.Init(1,MD_SMB); |
| yoshidayuito | 7:8bea84f72e64 | 122 | MD.Init(2,MD_SMB); |
| yoshidayuito | 7:8bea84f72e64 | 123 | MD.Init(3,MD_SMB); |
| yoshidayuito | 10:9ee22b22e583 | 124 | |
| yoshidayuito | 15:909c23ab7f0c | 125 | /* 足リミット */ |
| yoshidayuito | 8:367c7d6ef5a3 | 126 | In.Init(0,0); |
| yoshidayuito | 8:367c7d6ef5a3 | 127 | In.Init(0,1); |
| TakushimaYukimasa | 0:9e851dc42cde | 128 | |
| yoshidayuito | 15:909c23ab7f0c | 129 | /* ラインセンサ */ |
| yoshidayuito | 15:909c23ab7f0c | 130 | In.Init(0,2); |
| yoshidayuito | 15:909c23ab7f0c | 131 | In.Init(0,3); |
| yoshidayuito | 15:909c23ab7f0c | 132 | |
| yoshidayuito | 22:9d77148a3f09 | 133 | /* タイマーリセット */ |
| yoshidayuito | 22:9d77148a3f09 | 134 | Forward.reset(); |
| yoshidayuito | 22:9d77148a3f09 | 135 | |
| yoshidayuito | 7:8bea84f72e64 | 136 | telemetry.printf("\n\rMainLoopStart"); |
| yoshidayuito | 7:8bea84f72e64 | 137 | /* メインループ --------------------------------------------------------------*/ |
| yoshidayuito | 11:42310638e241 | 138 | while(1) { |
| yoshidayuito | 7:8bea84f72e64 | 139 | /* オンボードLED点滅 */ |
| yoshidayuito | 7:8bea84f72e64 | 140 | led=!led; |
| yoshidayuito | 7:8bea84f72e64 | 141 | |
| yoshidayuito | 7:8bea84f72e64 | 142 | /* 表示改行 */ |
| yoshidayuito | 7:8bea84f72e64 | 143 | telemetry.printf("\n\r"); |
| TakushimaYukimasa | 0:9e851dc42cde | 144 | |
| yoshidayuito | 7:8bea84f72e64 | 145 | /* 自動処理関連テレメトリ */ |
| yoshidayuito | 7:8bea84f72e64 | 146 | telemetry.printf("ope:%d ",operate); |
| yoshidayuito | 7:8bea84f72e64 | 147 | /* 座標テレメトリ */ |
| yoshidayuito | 7:8bea84f72e64 | 148 | telemetry.printf("X:%4.0f Y:%4.0f T:%4.0f ",NowLoc.X,NowLoc.Y,NowLoc.theta); |
| TakushimaYukimasa | 0:9e851dc42cde | 149 | |
| yoshidayuito | 7:8bea84f72e64 | 150 | /* 自己位置推定更新 */ |
| yoshidayuito | 7:8bea84f72e64 | 151 | LocEstimate(); |
| TakushimaYukimasa | 0:9e851dc42cde | 152 | |
| TakushimaYukimasa | 14:18ec50f38993 | 153 | |
| TakushimaYukimasa | 14:18ec50f38993 | 154 | /* オムニ分のMD代入 */ |
| TakushimaYukimasa | 14:18ec50f38993 | 155 | OmuniExe; |
| TakushimaYukimasa | 14:18ec50f38993 | 156 | |
| yoshidayuito | 16:ea3008995c41 | 157 | for(int i=0; i<4; i++) { |
| yoshidayuito | 16:ea3008995c41 | 158 | MD.Set(i,MovMotor[i]); |
| yoshidayuito | 16:ea3008995c41 | 159 | MovMotor[i]=0; |
| yoshidayuito | 16:ea3008995c41 | 160 | } |
| yoshidayuito | 16:ea3008995c41 | 161 | |
| yoshidayuito | 7:8bea84f72e64 | 162 | /* I2CMD実行 */ |
| yoshidayuito | 7:8bea84f72e64 | 163 | MD.Exe(); |
| TakushimaYukimasa | 0:9e851dc42cde | 164 | |
| yoshidayuito | 11:42310638e241 | 165 | /* ジャイロ用タイマースタート */ |
| yoshidayuito | 7:8bea84f72e64 | 166 | yawCnt.start(); |
| yoshidayuito | 11:42310638e241 | 167 | /* ジャイロ用タイマーリセット */ |
| yoshidayuito | 7:8bea84f72e64 | 168 | yawCnt.reset(); |
| yoshidayuito | 7:8bea84f72e64 | 169 | |
| yoshidayuito | 7:8bea84f72e64 | 170 | /* 操縦権変更 ×停止 △手動 〇自動 */ |
| yoshidayuito | 7:8bea84f72e64 | 171 | if(DS3.CROSS) operate=0; |
| yoshidayuito | 7:8bea84f72e64 | 172 | if(DS3.TRIANGLE) operate=1; |
| yoshidayuito | 7:8bea84f72e64 | 173 | if(DS3.CIRCLE) operate=2; |
| TakushimaYukimasa | 0:9e851dc42cde | 174 | |
| yoshidayuito | 7:8bea84f72e64 | 175 | /* 操縦権:なし 停止動作 */ |
| yoshidayuito | 7:8bea84f72e64 | 176 | if(operate==0) { |
| yoshidayuito | 7:8bea84f72e64 | 177 | /* 足回り停止 */ |
| yoshidayuito | 16:ea3008995c41 | 178 | SubOmuni(0,0,0); |
| yoshidayuito | 10:9ee22b22e583 | 179 | |
| yoshidayuito | 7:8bea84f72e64 | 180 | } |
| yoshidayuito | 7:8bea84f72e64 | 181 | /* 操縦権:手動 */ |
| yoshidayuito | 7:8bea84f72e64 | 182 | else if(operate==1) { |
| yoshidayuito | 7:8bea84f72e64 | 183 | /* 足回り手動動作 */ |
| yoshidayuito | 7:8bea84f72e64 | 184 | int x_val = (double)(DS3.LX-64)*100/64; |
| yoshidayuito | 7:8bea84f72e64 | 185 | int y_val = (double)(64-DS3.LY)*100/64; |
| yoshidayuito | 7:8bea84f72e64 | 186 | int r_val = (double)(DS3.RX-64)*100/64; |
| yoshidayuito | 7:8bea84f72e64 | 187 | |
| yoshidayuito | 7:8bea84f72e64 | 188 | /* タイマーをリセット */ |
| yoshidayuito | 7:8bea84f72e64 | 189 | if(DS3.RX!=64) yawCnt.reset(); |
| yoshidayuito | 7:8bea84f72e64 | 190 | /* 目標角度再設定 */ |
| yoshidayuito | 7:8bea84f72e64 | 191 | if(yawCnt.read_ms()<1000) TarTheta=NowLoc.theta; |
| yoshidayuito | 7:8bea84f72e64 | 192 | /* r_val補正 */ |
| yoshidayuito | 7:8bea84f72e64 | 193 | r_val+=(TarTheta-NowLoc.theta)*CONST_CORRECTION_YAW; |
| yoshidayuito | 7:8bea84f72e64 | 194 | |
| yoshidayuito | 16:ea3008995c41 | 195 | SubOmuni(x_val,y_val,r_val); |
| yoshidayuito | 10:9ee22b22e583 | 196 | |
| yoshidayuito | 9:94112b5df540 | 197 | /* 壁あて実行 */ |
| yoshidayuito | 9:94112b5df540 | 198 | if(DS3.R1) ToWall(); |
| yoshidayuito | 7:8bea84f72e64 | 199 | } |
| yoshidayuito | 7:8bea84f72e64 | 200 | /* 操縦権:自動 */ |
| yoshidayuito | 7:8bea84f72e64 | 201 | else if(operate==2) { |
| yoshidayuito | 7:8bea84f72e64 | 202 | switch(auto_mode) { |
| yoshidayuito | 7:8bea84f72e64 | 203 | /* スタート待機処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 204 | case 0: |
| yoshidayuito | 20:79f96d223e5d | 205 | /* STARTで次のステップに */ |
| yoshidayuito | 20:79f96d223e5d | 206 | if(DS3.START) auto_mode++; |
| yoshidayuito | 7:8bea84f72e64 | 207 | break; |
| yoshidayuito | 7:8bea84f72e64 | 208 | |
| yoshidayuito | 22:9d77148a3f09 | 209 | /* X座標移動 */ |
| yoshidayuito | 7:8bea84f72e64 | 210 | case 1: |
| yoshidayuito | 22:9d77148a3f09 | 211 | /* 壁あて実行 */ |
| yoshidayuito | 22:9d77148a3f09 | 212 | ToWall(); |
| yoshidayuito | 13:c8af1467ba8b | 213 | /* 動作終了時次のステップに */ |
| yoshidayuito | 22:9d77148a3f09 | 214 | if(Line_Num==0&&XCooMove(-1000,30)==0) { |
| yoshidayuito | 22:9d77148a3f09 | 215 | Line_Num++; |
| yoshidayuito | 22:9d77148a3f09 | 216 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 217 | } |
| yoshidayuito | 22:9d77148a3f09 | 218 | if(Line_Num==1&&XCooMove(-1500,30)==0) { |
| yoshidayuito | 22:9d77148a3f09 | 219 | Line_Num++; |
| yoshidayuito | 22:9d77148a3f09 | 220 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 221 | } |
| yoshidayuito | 22:9d77148a3f09 | 222 | if(Line_Num==2&&XCooMove(-2200,30)==0) { |
| yoshidayuito | 22:9d77148a3f09 | 223 | Line_Num=0; |
| yoshidayuito | 22:9d77148a3f09 | 224 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 225 | } |
| yoshidayuito | 22:9d77148a3f09 | 226 | |
| yoshidayuito | 22:9d77148a3f09 | 227 | break; |
| yoshidayuito | 22:9d77148a3f09 | 228 | |
| yoshidayuito | 22:9d77148a3f09 | 229 | /* ラインまで移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 230 | case 2: |
| yoshidayuito | 22:9d77148a3f09 | 231 | /* ライン到達後次のステップに */ |
| yoshidayuito | 22:9d77148a3f09 | 232 | Line_Dire=0; |
| yoshidayuito | 22:9d77148a3f09 | 233 | if(LineCor(Line_Dire)==1) |
| yoshidayuito | 22:9d77148a3f09 | 234 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 235 | |
| yoshidayuito | 22:9d77148a3f09 | 236 | break; |
| yoshidayuito | 22:9d77148a3f09 | 237 | /* */ |
| yoshidayuito | 22:9d77148a3f09 | 238 | case 3: |
| yoshidayuito | 22:9d77148a3f09 | 239 | /* ライン補正しながら直進 */ |
| yoshidayuito | 22:9d77148a3f09 | 240 | Line_Dire=2; |
| yoshidayuito | 22:9d77148a3f09 | 241 | LineCor(Line_Dire); |
| yoshidayuito | 22:9d77148a3f09 | 242 | Forward.start(); |
| yoshidayuito | 22:9d77148a3f09 | 243 | SubOmuni(0,20,0); |
| yoshidayuito | 22:9d77148a3f09 | 244 | /* 動作終了時次のステップに */ |
| yoshidayuito | 22:9d77148a3f09 | 245 | if(Forward.read_ms()==2500) { |
| yoshidayuito | 22:9d77148a3f09 | 246 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 247 | Forward.reset(); |
| yoshidayuito | 22:9d77148a3f09 | 248 | } |
| yoshidayuito | 22:9d77148a3f09 | 249 | |
| yoshidayuito | 22:9d77148a3f09 | 250 | break; |
| yoshidayuito | 22:9d77148a3f09 | 251 | |
| yoshidayuito | 22:9d77148a3f09 | 252 | case 4: |
| yoshidayuito | 22:9d77148a3f09 | 253 | /* ライン補正しながら後ろへ移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 254 | LineCor(Line_Dire); |
| yoshidayuito | 22:9d77148a3f09 | 255 | ToWall(); |
| yoshidayuito | 22:9d77148a3f09 | 256 | if(In.Get(0)==1&&In.Get(1)==1) |
| yoshidayuito | 13:c8af1467ba8b | 257 | auto_mode++; |
| TakushimaYukimasa | 14:18ec50f38993 | 258 | |
| yoshidayuito | 7:8bea84f72e64 | 259 | break; |
| yoshidayuito | 7:8bea84f72e64 | 260 | |
| yoshidayuito | 22:9d77148a3f09 | 261 | case 5: |
| yoshidayuito | 22:9d77148a3f09 | 262 | /* 壁あて実行 */ |
| yoshidayuito | 22:9d77148a3f09 | 263 | ToWall(); |
| yoshidayuito | 22:9d77148a3f09 | 264 | /* 右へ移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 265 | if(Line_Num==1&&XCooMove(1200,10)==0) |
| yoshidayuito | 22:9d77148a3f09 | 266 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 267 | if(Line_Num==2&&XCooMove(1700,10)==0) |
| yoshidayuito | 22:9d77148a3f09 | 268 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 269 | if(Line_Num==3&&XCooMove(2400,10)==0) |
| yoshidayuito | 17:5b4080915375 | 270 | auto_mode++; |
| yoshidayuito | 17:5b4080915375 | 271 | |
| yoshidayuito | 17:5b4080915375 | 272 | break; |
| yoshidayuito | 17:5b4080915375 | 273 | |
| yoshidayuito | 22:9d77148a3f09 | 274 | case 6: |
| yoshidayuito | 22:9d77148a3f09 | 275 | /* 宝物置き場付近まで直進 */ |
| yoshidayuito | 22:9d77148a3f09 | 276 | Forward.start(); |
| yoshidayuito | 22:9d77148a3f09 | 277 | SubOmuni(0,20,0); |
| yoshidayuito | 22:9d77148a3f09 | 278 | /* 動作終了時次のステップに */ |
| yoshidayuito | 22:9d77148a3f09 | 279 | if(Forward.read_ms()==4000) { |
| yoshidayuito | 22:9d77148a3f09 | 280 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 281 | Forward.reset(); |
| yoshidayuito | 22:9d77148a3f09 | 282 | } |
| yoshidayuito | 22:9d77148a3f09 | 283 | |
| yoshidayuito | 22:9d77148a3f09 | 284 | break; |
| yoshidayuito | 22:9d77148a3f09 | 285 | |
| yoshidayuito | 22:9d77148a3f09 | 286 | case 7: |
| yoshidayuito | 22:9d77148a3f09 | 287 | /* 宝物置き場のラインまで移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 288 | Line_Dire=1; |
| yoshidayuito | 22:9d77148a3f09 | 289 | if(LineCor(Line_Dire)==1) |
| yoshidayuito | 22:9d77148a3f09 | 290 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 291 | |
| yoshidayuito | 22:9d77148a3f09 | 292 | break; |
| yoshidayuito | 22:9d77148a3f09 | 293 | |
| yoshidayuito | 22:9d77148a3f09 | 294 | case 8: |
| yoshidayuito | 22:9d77148a3f09 | 295 | /* 宝物置き場前まで移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 296 | Forward.start(); |
| yoshidayuito | 22:9d77148a3f09 | 297 | SubOmuni(0,20,0); |
| yoshidayuito | 22:9d77148a3f09 | 298 | /* 動作終了時次のステップに */ |
| yoshidayuito | 22:9d77148a3f09 | 299 | if(Forward.read_ms()==2000) { |
| yoshidayuito | 22:9d77148a3f09 | 300 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 301 | Forward.reset(); |
| yoshidayuito | 22:9d77148a3f09 | 302 | } |
| yoshidayuito | 22:9d77148a3f09 | 303 | |
| yoshidayuito | 22:9d77148a3f09 | 304 | break; |
| yoshidayuito | 22:9d77148a3f09 | 305 | |
| yoshidayuito | 22:9d77148a3f09 | 306 | case 9: |
| yoshidayuito | 22:9d77148a3f09 | 307 | /* スタートゾーンに移動 */ |
| yoshidayuito | 22:9d77148a3f09 | 308 | ToWall(); |
| yoshidayuito | 22:9d77148a3f09 | 309 | if(In.Get(0)==1&&In.Get(1)==1) |
| yoshidayuito | 22:9d77148a3f09 | 310 | auto_mode++; |
| yoshidayuito | 22:9d77148a3f09 | 311 | |
| yoshidayuito | 22:9d77148a3f09 | 312 | break; |
| yoshidayuito | 22:9d77148a3f09 | 313 | |
| yoshidayuito | 22:9d77148a3f09 | 314 | |
| yoshidayuito | 7:8bea84f72e64 | 315 | /* 終了処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 316 | default: |
| yoshidayuito | 7:8bea84f72e64 | 317 | auto_mode=0; |
| yoshidayuito | 7:8bea84f72e64 | 318 | operate=0; |
| yoshidayuito | 7:8bea84f72e64 | 319 | break; |
| yoshidayuito | 7:8bea84f72e64 | 320 | } |
| yoshidayuito | 7:8bea84f72e64 | 321 | } |
| yoshidayuito | 7:8bea84f72e64 | 322 | |
| TakushimaYukimasa | 0:9e851dc42cde | 323 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 324 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 325 | |
| TakushimaYukimasa | 0:9e851dc42cde | 326 | |
| TakushimaYukimasa | 0:9e851dc42cde | 327 | /******************************************************************************* |
| TakushimaYukimasa | 0:9e851dc42cde | 328 | * @概要 自己位置推定関数 |
| TakushimaYukimasa | 0:9e851dc42cde | 329 | * @引数 なし |
| TakushimaYukimasa | 0:9e851dc42cde | 330 | * @返り値 なし |
| TakushimaYukimasa | 0:9e851dc42cde | 331 | *******************************************************************************/ |
| yoshidayuito | 7:8bea84f72e64 | 332 | void LocEstimate(void) |
| yoshidayuito | 7:8bea84f72e64 | 333 | { |
| yoshidayuito | 22:9d77148a3f09 | 334 | static double GyroDeg[2]= {0}; |
| yoshidayuito | 7:8bea84f72e64 | 335 | static double EncDeg[2][2]= {0}; |
| yoshidayuito | 7:8bea84f72e64 | 336 | static double disp[3]= {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 337 | |
| yoshidayuito | 22:9d77148a3f09 | 338 | |
| yoshidayuito | 21:22b863d32705 | 339 | |
| yoshidayuito | 7:8bea84f72e64 | 340 | /* ジャイロの値取得 */ |
| yoshidayuito | 7:8bea84f72e64 | 341 | bno.get_angles(); |
| yoshidayuito | 7:8bea84f72e64 | 342 | GyroDeg[1]=GyroDeg[0]; |
| yoshidayuito | 7:8bea84f72e64 | 343 | GyroDeg[0]=bno.euler.yaw; |
| yoshidayuito | 7:8bea84f72e64 | 344 | if(GyroDeg[0]!=0) { |
| yoshidayuito | 7:8bea84f72e64 | 345 | /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */ |
| yoshidayuito | 7:8bea84f72e64 | 346 | if(GyroDeg[1]<90 && GyroDeg[0]>270) GyroDeg[1]+=360; |
| yoshidayuito | 7:8bea84f72e64 | 347 | /* 0→359を跨いだ時,前回の値を360以上の値で表記 */ |
| yoshidayuito | 7:8bea84f72e64 | 348 | else if(GyroDeg[1]>270 && GyroDeg[0]<90) GyroDeg[1]-=360; |
| yoshidayuito | 7:8bea84f72e64 | 349 | /* 差を求める*/ |
| yoshidayuito | 7:8bea84f72e64 | 350 | disp[2]=GyroDeg[1]-GyroDeg[0]; |
| yoshidayuito | 7:8bea84f72e64 | 351 | } |
| yoshidayuito | 21:22b863d32705 | 352 | /* Enc2つの差分求める */ |
| yoshidayuito | 21:22b863d32705 | 353 | for(int i=0; i<2; i++) { |
| yoshidayuito | 7:8bea84f72e64 | 354 | EncDeg[i][1]=EncDeg[i][0]; |
| yoshidayuito | 7:8bea84f72e64 | 355 | EncDeg[i][0]=EncoderDeg[i]; |
| yoshidayuito | 21:22b863d32705 | 356 | disp[i]=DEG_TO_DIS(EncDeg[i][1]-EncDeg[i][0]); |
| yoshidayuito | 7:8bea84f72e64 | 357 | } |
| yoshidayuito | 7:8bea84f72e64 | 358 | /* 差分を加速度として保存 */ |
| yoshidayuito | 7:8bea84f72e64 | 359 | NowAcc.theta = disp[2]; |
| yoshidayuito | 21:22b863d32705 | 360 | NowAcc.X = -disp[0] * cos(DEG_TO_RAD(NowLoc.theta)) - disp[1] * sin(DEG_TO_RAD(NowLoc.theta)); |
| yoshidayuito | 21:22b863d32705 | 361 | NowAcc.Y = -disp[0] * sin(DEG_TO_RAD(NowLoc.theta)) + disp[1] * cos(DEG_TO_RAD(NowLoc.theta)); |
| yoshidayuito | 7:8bea84f72e64 | 362 | /* 差分を累積して現在位置を保存 */ |
| yoshidayuito | 7:8bea84f72e64 | 363 | NowLoc.X += NowAcc.X; |
| yoshidayuito | 21:22b863d32705 | 364 | NowLoc.Y += NowAcc.Y; |
| yoshidayuito | 7:8bea84f72e64 | 365 | NowLoc.theta += NowAcc.theta; |
| TakushimaYukimasa | 0:9e851dc42cde | 366 | } |
| TakushimaYukimasa | 0:9e851dc42cde | 367 | |
| TakushimaYukimasa | 0:9e851dc42cde | 368 | |
| TakushimaYukimasa | 0:9e851dc42cde | 369 | |
| TakushimaYukimasa | 0:9e851dc42cde | 370 | |
| TakushimaYukimasa | 0:9e851dc42cde | 371 | /* 割り込み(100us) *************************************************************/ |
| TakushimaYukimasa | 0:9e851dc42cde | 372 | void IT_CallBack(void) |
| TakushimaYukimasa | 0:9e851dc42cde | 373 | { |
| yoshidayuito | 7:8bea84f72e64 | 374 | static int cnt = 0; |
| yoshidayuito | 7:8bea84f72e64 | 375 | static int data[EncoderMAX] = {0}; |
| yoshidayuito | 7:8bea84f72e64 | 376 | static double EncDeg[EncoderMAX][2] = {0}; |
| TakushimaYukimasa | 0:9e851dc42cde | 377 | |
| yoshidayuito | 7:8bea84f72e64 | 378 | for(int i=0; i<EncoderMAX; i++) |
| yoshidayuito | 7:8bea84f72e64 | 379 | switch(cnt) { |
| yoshidayuito | 7:8bea84f72e64 | 380 | /* 最初の処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 381 | case 0: |
| yoshidayuito | 7:8bea84f72e64 | 382 | data[i] = 0; |
| yoshidayuito | 7:8bea84f72e64 | 383 | CS[i] = 0; |
| yoshidayuito | 7:8bea84f72e64 | 384 | CL[i] = 1; |
| yoshidayuito | 7:8bea84f72e64 | 385 | break; |
| yoshidayuito | 7:8bea84f72e64 | 386 | /* 最後の処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 387 | case 25: |
| yoshidayuito | 7:8bea84f72e64 | 388 | CS[i]=1; |
| yoshidayuito | 7:8bea84f72e64 | 389 | /* 前回の値更新 今回の値更新(エンコーダの値(0~4096)を角度(0~360)に) */ |
| yoshidayuito | 7:8bea84f72e64 | 390 | EncDeg[i][1] = EncDeg[i][0]; |
| yoshidayuito | 7:8bea84f72e64 | 391 | EncDeg[i][0] = (double)data[i] * 360.0 / 4096; |
| yoshidayuito | 7:8bea84f72e64 | 392 | /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */ |
| yoshidayuito | 7:8bea84f72e64 | 393 | if ((270 <= EncDeg[i][1]) && (EncDeg[i][0] < 90)) |
| yoshidayuito | 7:8bea84f72e64 | 394 | EncDeg[i][1] -= 360; |
| yoshidayuito | 7:8bea84f72e64 | 395 | /* 0→359を跨いだ時,前回の値を360以上の値で表記 */ |
| yoshidayuito | 7:8bea84f72e64 | 396 | else if ((EncDeg[i][1] < 90) && (270 <= EncDeg[i][0])) |
| yoshidayuito | 7:8bea84f72e64 | 397 | EncDeg[i][1] += 360; |
| yoshidayuito | 7:8bea84f72e64 | 398 | /* 差を求める*/ |
| yoshidayuito | 7:8bea84f72e64 | 399 | EncoderDeg[i] += EncDeg[i][0] - EncDeg[i][1]; |
| yoshidayuito | 7:8bea84f72e64 | 400 | break; |
| yoshidayuito | 7:8bea84f72e64 | 401 | /* 通常の処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 402 | default: |
| yoshidayuito | 7:8bea84f72e64 | 403 | CL[i]=!CL[i]; |
| yoshidayuito | 7:8bea84f72e64 | 404 | /* 最初でも最後でもなく奇数回で最初以外の時読み取り処理 */ |
| yoshidayuito | 7:8bea84f72e64 | 405 | if(cnt != 1 && cnt % 2) { |
| yoshidayuito | 7:8bea84f72e64 | 406 | data[i] |= (DO[i]==1); |
| yoshidayuito | 7:8bea84f72e64 | 407 | data[i] = data[i] << 1; |
| yoshidayuito | 7:8bea84f72e64 | 408 | } |
| yoshidayuito | 7:8bea84f72e64 | 409 | break; |
| yoshidayuito | 7:8bea84f72e64 | 410 | } |
| yoshidayuito | 7:8bea84f72e64 | 411 | cnt++; |
| yoshidayuito | 7:8bea84f72e64 | 412 | cnt%=26; |
| yoshidayuito | 7:8bea84f72e64 | 413 | } |
| yoshidayuito | 7:8bea84f72e64 | 414 | |
| yoshidayuito | 7:8bea84f72e64 | 415 | |
| yoshidayuito | 7:8bea84f72e64 | 416 | |
| yoshidayuito | 7:8bea84f72e64 | 417 | |
| yoshidayuito | 7:8bea84f72e64 | 418 | /******************************************************************************* |
| yoshidayuito | 7:8bea84f72e64 | 419 | * @概要 壁あて関数 |
| yoshidayuito | 7:8bea84f72e64 | 420 | * @引数 なし |
| yoshidayuito | 7:8bea84f72e64 | 421 | * @返り値 なし |
| yoshidayuito | 7:8bea84f72e64 | 422 | *******************************************************************************/ |
| yoshidayuito | 7:8bea84f72e64 | 423 | void ToWall(void) |
| yoshidayuito | 7:8bea84f72e64 | 424 | { |
| TakushimaYukimasa | 14:18ec50f38993 | 425 | /* 左側リミットに応じて左2輪の操作量を決める */ |
| yoshidayuito | 9:94112b5df540 | 426 | if(In.Get(0)==0) |
| yoshidayuito | 7:8bea84f72e64 | 427 | for(int i=0; i<2; i++) MovMotor[i]-=10; |
| TakushimaYukimasa | 14:18ec50f38993 | 428 | |
| TakushimaYukimasa | 14:18ec50f38993 | 429 | /* 右側リミットに応じて左2輪の操作量を決める */ |
| yoshidayuito | 9:94112b5df540 | 430 | if(In.Get(1)==0) |
| yoshidayuito | 7:8bea84f72e64 | 431 | for(int i=2; i<4; i++) MovMotor[i]+=10; |
| yoshidayuito | 22:9d77148a3f09 | 432 | |
| yoshidayuito | 10:9ee22b22e583 | 433 | } |
| yoshidayuito | 10:9ee22b22e583 | 434 | |
| yoshidayuito | 10:9ee22b22e583 | 435 | |
| yoshidayuito | 10:9ee22b22e583 | 436 | |
| yoshidayuito | 10:9ee22b22e583 | 437 | /******************************************************************************* |
| yoshidayuito | 10:9ee22b22e583 | 438 | * @概要 x座標移動関数 |
| yoshidayuito | 11:42310638e241 | 439 | * @引数 Tar:目標値 |
| yoshidayuito | 10:9ee22b22e583 | 440 | * @引数 Err :許容誤差 |
| yoshidayuito | 10:9ee22b22e583 | 441 | * @返り値 val_p:残り距離 |
| yoshidayuito | 10:9ee22b22e583 | 442 | *******************************************************************************/ |
| yoshidayuito | 11:42310638e241 | 443 | int XCooMove(int Tar,int Err) |
| yoshidayuito | 10:9ee22b22e583 | 444 | { |
| TakushimaYukimasa | 14:18ec50f38993 | 445 | /* x座標移動初期化フラグ */ |
| TakushimaYukimasa | 14:18ec50f38993 | 446 | static bool XCooMoveFlag=0; |
| TakushimaYukimasa | 14:18ec50f38993 | 447 | |
| TakushimaYukimasa | 14:18ec50f38993 | 448 | /* x座標移動タイマー */ |
| TakushimaYukimasa | 14:18ec50f38993 | 449 | static Timer CooCnt; |
| TakushimaYukimasa | 14:18ec50f38993 | 450 | |
| TakushimaYukimasa | 14:18ec50f38993 | 451 | /* 速度 加速・減速・最終操作量 */ |
| yoshidayuito | 11:42310638e241 | 452 | int val_p=0,val_t=0,val=0; |
| yoshidayuito | 10:9ee22b22e583 | 453 | |
| TakushimaYukimasa | 14:18ec50f38993 | 454 | /* X座標移動最初だけ初期化 */ |
| TakushimaYukimasa | 14:18ec50f38993 | 455 | if(XCooMoveFlag==0) { |
| yoshidayuito | 13:c8af1467ba8b | 456 | /* タイマースタート */ |
| yoshidayuito | 13:c8af1467ba8b | 457 | CooCnt.start(); |
| yoshidayuito | 13:c8af1467ba8b | 458 | /* X座標移動用タイマーリセット */ |
| yoshidayuito | 13:c8af1467ba8b | 459 | CooCnt.reset(); |
| TakushimaYukimasa | 14:18ec50f38993 | 460 | /* 初期化フラグ立てる */ |
| TakushimaYukimasa | 14:18ec50f38993 | 461 | XCooMoveFlag=1; |
| yoshidayuito | 13:c8af1467ba8b | 462 | } |
| yoshidayuito | 10:9ee22b22e583 | 463 | |
| TakushimaYukimasa | 14:18ec50f38993 | 464 | /* 加速・減速それぞれ求める */ |
| TakushimaYukimasa | 14:18ec50f38993 | 465 | val_p=(Tar-NowLoc.X)*CONST_ACC_X; |
| TakushimaYukimasa | 14:18ec50f38993 | 466 | val_t=CooCnt.read_ms()*CONST_DEC_X; |
| yoshidayuito | 11:42310638e241 | 467 | |
| TakushimaYukimasa | 14:18ec50f38993 | 468 | /* 小さい方を操作量として採択 */ |
| yoshidayuito | 11:42310638e241 | 469 | val=MIN(val_p,val_t); |
| yoshidayuito | 10:9ee22b22e583 | 470 | |
| yoshidayuito | 11:42310638e241 | 471 | /* -100~100に調整 */ |
| yoshidayuito | 10:9ee22b22e583 | 472 | if(val>100) val=100; |
| yoshidayuito | 11:42310638e241 | 473 | else if(val<-100) val=-100; |
| yoshidayuito | 11:42310638e241 | 474 | |
| TakushimaYukimasa | 14:18ec50f38993 | 475 | /* X方向のみ操作量を与えてオムニ代入 */ |
| yoshidayuito | 16:ea3008995c41 | 476 | SubOmuni(val,0,0); |
| yoshidayuito | 11:42310638e241 | 477 | |
| TakushimaYukimasa | 14:18ec50f38993 | 478 | /* 残り距離求める */ |
| yoshidayuito | 13:c8af1467ba8b | 479 | int RemDis=Tar-NowLoc.X; |
| yoshidayuito | 11:42310638e241 | 480 | |
| TakushimaYukimasa | 14:18ec50f38993 | 481 | /* 終了条件満たしているなら終了処理 */ |
| TakushimaYukimasa | 14:18ec50f38993 | 482 | if(RemDis<=Err) { |
| TakushimaYukimasa | 14:18ec50f38993 | 483 | /* フラグ回収 */ |
| TakushimaYukimasa | 14:18ec50f38993 | 484 | XCooMoveFlag=0; |
| TakushimaYukimasa | 14:18ec50f38993 | 485 | return 0; |
| TakushimaYukimasa | 14:18ec50f38993 | 486 | } |
| TakushimaYukimasa | 14:18ec50f38993 | 487 | /* 満たしてないなら残り距離返す */ |
| TakushimaYukimasa | 14:18ec50f38993 | 488 | else |
| TakushimaYukimasa | 14:18ec50f38993 | 489 | return RemDis; |
| yoshidayuito | 15:909c23ab7f0c | 490 | } |
| yoshidayuito | 15:909c23ab7f0c | 491 | |
| yoshidayuito | 15:909c23ab7f0c | 492 | |
| yoshidayuito | 15:909c23ab7f0c | 493 | |
| yoshidayuito | 16:ea3008995c41 | 494 | |
| yoshidayuito | 16:ea3008995c41 | 495 | /******************************************************************************* |
| yoshidayuito | 16:ea3008995c41 | 496 | * @概要 オムニの値計算する(加算式) |
| yoshidayuito | 16:ea3008995c41 | 497 | * @引数 X,Y,Rotationそれぞれの操作量 |
| yoshidayuito | 16:ea3008995c41 | 498 | * @返り値 なし |
| yoshidayuito | 16:ea3008995c41 | 499 | *******************************************************************************/ |
| yoshidayuito | 16:ea3008995c41 | 500 | void SubOmuni(int X,int Y,int R) |
| yoshidayuito | 16:ea3008995c41 | 501 | { |
| yoshidayuito | 16:ea3008995c41 | 502 | /* 入力を100%に制限 */ |
| yoshidayuito | 16:ea3008995c41 | 503 | X=Rest(X,100); |
| yoshidayuito | 16:ea3008995c41 | 504 | Y=Rest(Y,100); |
| yoshidayuito | 16:ea3008995c41 | 505 | R=Rest(R,100); |
| yoshidayuito | 16:ea3008995c41 | 506 | |
| yoshidayuito | 19:0840e182f96d | 507 | |
| yoshidayuito | 22:9d77148a3f09 | 508 | |
| yoshidayuito | 19:0840e182f96d | 509 | |
| yoshidayuito | 16:ea3008995c41 | 510 | /* オムニ計算結果をtmpに */ |
| yoshidayuito | 16:ea3008995c41 | 511 | int tmp[4]= {0}; |
| yoshidayuito | 22:9d77148a3f09 | 512 | |
| yoshidayuito | 19:0840e182f96d | 513 | /* 一度データをtmpに保存 */ |
| yoshidayuito | 22:9d77148a3f09 | 514 | for(int i=0; i<4; i++) |
| yoshidayuito | 19:0840e182f96d | 515 | tmp[i]=MovMotor[i]; |
| yoshidayuito | 22:9d77148a3f09 | 516 | |
| yoshidayuito | 19:0840e182f96d | 517 | /* オムニ計算 */ |
| yoshidayuito | 16:ea3008995c41 | 518 | omuni.XmarkOmni_Move(X,Y,R); |
| yoshidayuito | 22:9d77148a3f09 | 519 | |
| yoshidayuito | 16:ea3008995c41 | 520 | /* 計算結果を加算する */ |
| yoshidayuito | 19:0840e182f96d | 521 | for(int i=0; i<4; i++) |
| yoshidayuito | 19:0840e182f96d | 522 | MovMotor[i]+=tmp[i]; |
| yoshidayuito | 16:ea3008995c41 | 523 | } |
| yoshidayuito | 16:ea3008995c41 | 524 | |
| yoshidayuito | 16:ea3008995c41 | 525 | |
| yoshidayuito | 16:ea3008995c41 | 526 | |
| yoshidayuito | 16:ea3008995c41 | 527 | |
| yoshidayuito | 15:909c23ab7f0c | 528 | /******************************************************************************* |
| yoshidayuito | 15:909c23ab7f0c | 529 | * @概要 ライン補正関数 |
| yoshidayuito | 22:9d77148a3f09 | 530 | * @引数 Line_Dire:初期移動方向 |
| yoshidayuito | 15:909c23ab7f0c | 531 | * @返り値 なし |
| yoshidayuito | 15:909c23ab7f0c | 532 | *******************************************************************************/ |
| yoshidayuito | 17:5b4080915375 | 533 | int LineCor(int Line_Dire) |
| yoshidayuito | 15:909c23ab7f0c | 534 | { |
| yoshidayuito | 15:909c23ab7f0c | 535 | /* xの操作量 */ |
| yoshidayuito | 16:ea3008995c41 | 536 | int val_x=0; |
| yoshidayuito | 15:909c23ab7f0c | 537 | /* 左側,右側の前回の値 */ |
| yoshidayuito | 17:5b4080915375 | 538 | static int Last_val; |
| yoshidayuito | 15:909c23ab7f0c | 539 | /* ライン補正初期化フラグ */ |
| yoshidayuito | 15:909c23ab7f0c | 540 | static bool LineFlag=0; |
| yoshidayuito | 15:909c23ab7f0c | 541 | |
| yoshidayuito | 15:909c23ab7f0c | 542 | if(LineFlag==0) { |
| yoshidayuito | 22:9d77148a3f09 | 543 | /* 初期値設定 0…左 1…右 2…直進*/ |
| yoshidayuito | 17:5b4080915375 | 544 | Last_val=Line_Dire; |
| yoshidayuito | 15:909c23ab7f0c | 545 | /* 初期化フラグ立てる */ |
| yoshidayuito | 15:909c23ab7f0c | 546 | LineFlag=1; |
| yoshidayuito | 15:909c23ab7f0c | 547 | } |
| yoshidayuito | 15:909c23ab7f0c | 548 | |
| yoshidayuito | 15:909c23ab7f0c | 549 | /* どちらもラインに乗っていない状態 */ |
| yoshidayuito | 15:909c23ab7f0c | 550 | if(In.Get(2)==0&&In.Get(3)==0) { |
| yoshidayuito | 17:5b4080915375 | 551 | if(Last_val==0) val_x-=10; |
| yoshidayuito | 17:5b4080915375 | 552 | if(Last_val==1) val_x+=10; |
| yoshidayuito | 22:9d77148a3f09 | 553 | else val_x+=0; |
| yoshidayuito | 15:909c23ab7f0c | 554 | } |
| yoshidayuito | 16:ea3008995c41 | 555 | |
| yoshidayuito | 18:61d3a2b78aee | 556 | /* 左側のみ */ |
| yoshidayuito | 18:61d3a2b78aee | 557 | if(In.Get(2)==1&&In.Get(3)==0) { |
| yoshidayuito | 18:61d3a2b78aee | 558 | val_x-=10; |
| yoshidayuito | 18:61d3a2b78aee | 559 | Last_val=0; |
| yoshidayuito | 18:61d3a2b78aee | 560 | } |
| yoshidayuito | 18:61d3a2b78aee | 561 | /* 右側のみ */ |
| yoshidayuito | 18:61d3a2b78aee | 562 | else if(In.Get(2)==0&&In.Get(3)==1) { |
| yoshidayuito | 18:61d3a2b78aee | 563 | val_x+=10; |
| yoshidayuito | 18:61d3a2b78aee | 564 | Last_val=1; |
| yoshidayuito | 18:61d3a2b78aee | 565 | } |
| yoshidayuito | 18:61d3a2b78aee | 566 | /* どちらも乗っている */ |
| yoshidayuito | 18:61d3a2b78aee | 567 | else |
| yoshidayuito | 18:61d3a2b78aee | 568 | /* フラグ回収 */ |
| yoshidayuito | 18:61d3a2b78aee | 569 | LineFlag=0; |
| yoshidayuito | 15:909c23ab7f0c | 570 | |
| yoshidayuito | 15:909c23ab7f0c | 571 | |
| yoshidayuito | 16:ea3008995c41 | 572 | SubOmuni(val_x,0,0); |
| yoshidayuito | 17:5b4080915375 | 573 | |
| yoshidayuito | 17:5b4080915375 | 574 | /* 到達 */ |
| yoshidayuito | 17:5b4080915375 | 575 | if(LineFlag==0) return 1; |
| yoshidayuito | 17:5b4080915375 | 576 | /* 未到達 */ |
| yoshidayuito | 17:5b4080915375 | 577 | else return 0; |
| TakushimaYukimasa | 0:9e851dc42cde | 578 | } |