2020_TeamA / Mbed 2 deprecated Yoshida_MiniRobo

Dependencies:   mbed YKNCT_Movement SBDBT BNO055 YKNCT_MD YKNCT_I2C

Committer:
yoshidayuito
Date:
Wed Mar 18 05:21:48 2020 +0000
Revision:
15:909c23ab7f0c
Parent:
14:18ec50f38993
Child:
16:ea3008995c41
add Line;Ver.yoshida

Who changed what in which revision?

UserRevisionLine numberNew 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
TakushimaYukimasa 0:9e851dc42cde 37 /* 変数定義 ------------------------------------------------------------------*/
TakushimaYukimasa 0:9e851dc42cde 38
TakushimaYukimasa 0:9e851dc42cde 39 /* 操作権 0…なし 1…手動 2…自動 */
TakushimaYukimasa 0:9e851dc42cde 40 int operate=0;
TakushimaYukimasa 0:9e851dc42cde 41
TakushimaYukimasa 0:9e851dc42cde 42 /* 自動シーケンス */
TakushimaYukimasa 0:9e851dc42cde 43 int auto_mode=0;
TakushimaYukimasa 0:9e851dc42cde 44
TakushimaYukimasa 0:9e851dc42cde 45 /* 直読みエンコーダ角度保存(degree) */
TakushimaYukimasa 0:9e851dc42cde 46 double EncoderDeg[EncoderMAX] = {0};
TakushimaYukimasa 0:9e851dc42cde 47
TakushimaYukimasa 0:9e851dc42cde 48 /* 足回り値保存変数 */
yoshidayuito 7:8bea84f72e64 49 int MovMotor[4]= {0};
TakushimaYukimasa 0:9e851dc42cde 50
TakushimaYukimasa 0:9e851dc42cde 51 /* 自動yaw補整目標角度 */
TakushimaYukimasa 0:9e851dc42cde 52 double TarTheta=0;
TakushimaYukimasa 0:9e851dc42cde 53
yoshidayuito 13:c8af1467ba8b 54
TakushimaYukimasa 0:9e851dc42cde 55 /* クラス定義 ----------------------------------------------------------------*/
TakushimaYukimasa 0:9e851dc42cde 56
TakushimaYukimasa 0:9e851dc42cde 57 /* 割り込み用クラス */
TakushimaYukimasa 0:9e851dc42cde 58 Ticker flipper;
TakushimaYukimasa 0:9e851dc42cde 59
TakushimaYukimasa 0:9e851dc42cde 60 /* UART (Tx,Rx) */
TakushimaYukimasa 0:9e851dc42cde 61 Serial telemetry(USBTX, USBRX, 115200);
TakushimaYukimasa 0:9e851dc42cde 62
TakushimaYukimasa 0:9e851dc42cde 63 /* コントローラー */
TakushimaYukimasa 0:9e851dc42cde 64 SBDBT DS3(PA_0, PA_1, 9600);
TakushimaYukimasa 0:9e851dc42cde 65
TakushimaYukimasa 0:9e851dc42cde 66 /* オンボードLED */
TakushimaYukimasa 0:9e851dc42cde 67 DigitalOut led(LED2);
TakushimaYukimasa 0:9e851dc42cde 68
TakushimaYukimasa 0:9e851dc42cde 69 /* USERボタン */
TakushimaYukimasa 0:9e851dc42cde 70 DigitalIn UB(PC_13,PullDown);
TakushimaYukimasa 0:9e851dc42cde 71
TakushimaYukimasa 0:9e851dc42cde 72 /* エンコーダーピン CS */
TakushimaYukimasa 0:9e851dc42cde 73 DigitalOut CS[] = {PA_2,PA_3};
TakushimaYukimasa 0:9e851dc42cde 74 DigitalOut CL[] = {PA_4,PA_5};
TakushimaYukimasa 0:9e851dc42cde 75 DigitalIn DO[] = {PA_6,PA_7};
TakushimaYukimasa 0:9e851dc42cde 76
yoshidayuito 1:520233a969e2 77 /* ジャイロ用タイマー */
yoshidayuito 1:520233a969e2 78 Timer yawCnt;
yoshidayuito 1:520233a969e2 79
TakushimaYukimasa 0:9e851dc42cde 80 /* 足回り動作クラス定義 */
TakushimaYukimasa 0:9e851dc42cde 81 Move omuni(MovMotor,NowLoc.theta);
TakushimaYukimasa 0:9e851dc42cde 82
TakushimaYukimasa 0:9e851dc42cde 83 /* I2C MDのクラス定義 */
TakushimaYukimasa 0:9e851dc42cde 84 YKNCT_MD_I2C MD(PB_9,PB_8);
TakushimaYukimasa 0:9e851dc42cde 85
yoshidayuito 8:367c7d6ef5a3 86 /* I2C Inputのクラス定義 */
yoshidayuito 8:367c7d6ef5a3 87 YKNCT_I2C_IN In(PB_9,PB_8);
yoshidayuito 8:367c7d6ef5a3 88
TakushimaYukimasa 0:9e851dc42cde 89 /* ジャイロのピン設定 */
TakushimaYukimasa 0:9e851dc42cde 90 BNO055 bno(PB_9, PB_8);
TakushimaYukimasa 0:9e851dc42cde 91
TakushimaYukimasa 0:9e851dc42cde 92
TakushimaYukimasa 0:9e851dc42cde 93 /*----------------------------------- main ----------------------------------*/
TakushimaYukimasa 0:9e851dc42cde 94 int main()
TakushimaYukimasa 0:9e851dc42cde 95 {
yoshidayuito 7:8bea84f72e64 96 telemetry.printf("\n\rMainStart");
TakushimaYukimasa 0:9e851dc42cde 97
yoshidayuito 7:8bea84f72e64 98 /* 割り込みの設定
yoshidayuito 7:8bea84f72e64 99 * IT_CallBack関数を0.1msで割り込み */
yoshidayuito 7:8bea84f72e64 100 flipper.attach_us(&IT_CallBack, 100);
TakushimaYukimasa 0:9e851dc42cde 101
yoshidayuito 7:8bea84f72e64 102 /* ジャイロの設定 */
yoshidayuito 7:8bea84f72e64 103 bno.setmode(OPERATION_MODE_IMUPLUS);
TakushimaYukimasa 0:9e851dc42cde 104
yoshidayuito 7:8bea84f72e64 105 /* I2CMDの設定 */
yoshidayuito 7:8bea84f72e64 106 MD.Init(0,MD_SMB);
yoshidayuito 7:8bea84f72e64 107 MD.Init(1,MD_SMB);
yoshidayuito 7:8bea84f72e64 108 MD.Init(2,MD_SMB);
yoshidayuito 7:8bea84f72e64 109 MD.Init(3,MD_SMB);
yoshidayuito 10:9ee22b22e583 110
yoshidayuito 15:909c23ab7f0c 111 /* 足リミット */
yoshidayuito 8:367c7d6ef5a3 112 In.Init(0,0);
yoshidayuito 8:367c7d6ef5a3 113 In.Init(0,1);
TakushimaYukimasa 0:9e851dc42cde 114
yoshidayuito 15:909c23ab7f0c 115 /* ラインセンサ */
yoshidayuito 15:909c23ab7f0c 116 In.Init(0,2);
yoshidayuito 15:909c23ab7f0c 117 In.Init(0,3);
yoshidayuito 15:909c23ab7f0c 118
yoshidayuito 7:8bea84f72e64 119 telemetry.printf("\n\rMainLoopStart");
yoshidayuito 7:8bea84f72e64 120 /* メインループ --------------------------------------------------------------*/
yoshidayuito 11:42310638e241 121 while(1) {
yoshidayuito 7:8bea84f72e64 122 /* オンボードLED点滅 */
yoshidayuito 7:8bea84f72e64 123 led=!led;
yoshidayuito 7:8bea84f72e64 124
yoshidayuito 7:8bea84f72e64 125 /* 表示改行 */
yoshidayuito 7:8bea84f72e64 126 telemetry.printf("\n\r");
TakushimaYukimasa 0:9e851dc42cde 127
yoshidayuito 7:8bea84f72e64 128 /* 自動処理関連テレメトリ */
yoshidayuito 7:8bea84f72e64 129 telemetry.printf("ope:%d ",operate);
yoshidayuito 7:8bea84f72e64 130 /* 座標テレメトリ */
yoshidayuito 7:8bea84f72e64 131 telemetry.printf("X:%4.0f Y:%4.0f T:%4.0f ",NowLoc.X,NowLoc.Y,NowLoc.theta);
TakushimaYukimasa 0:9e851dc42cde 132
yoshidayuito 7:8bea84f72e64 133 /* 自己位置推定更新 */
yoshidayuito 7:8bea84f72e64 134 LocEstimate();
TakushimaYukimasa 0:9e851dc42cde 135
TakushimaYukimasa 14:18ec50f38993 136
TakushimaYukimasa 14:18ec50f38993 137 /* オムニ分のMD代入 */
TakushimaYukimasa 14:18ec50f38993 138 OmuniExe;
TakushimaYukimasa 14:18ec50f38993 139
yoshidayuito 7:8bea84f72e64 140 /* I2CMD実行 */
yoshidayuito 7:8bea84f72e64 141 MD.Exe();
TakushimaYukimasa 0:9e851dc42cde 142
yoshidayuito 11:42310638e241 143 /* ジャイロ用タイマースタート */
yoshidayuito 7:8bea84f72e64 144 yawCnt.start();
yoshidayuito 11:42310638e241 145 /* ジャイロ用タイマーリセット */
yoshidayuito 7:8bea84f72e64 146 yawCnt.reset();
yoshidayuito 7:8bea84f72e64 147
yoshidayuito 7:8bea84f72e64 148 /* 操縦権変更 ×停止 △手動 〇自動 */
yoshidayuito 7:8bea84f72e64 149 if(DS3.CROSS) operate=0;
yoshidayuito 7:8bea84f72e64 150 if(DS3.TRIANGLE) operate=1;
yoshidayuito 7:8bea84f72e64 151 if(DS3.CIRCLE) operate=2;
TakushimaYukimasa 0:9e851dc42cde 152
yoshidayuito 7:8bea84f72e64 153 /* 操縦権:なし 停止動作 */
yoshidayuito 7:8bea84f72e64 154 if(operate==0) {
yoshidayuito 7:8bea84f72e64 155 /* 足回り停止 */
yoshidayuito 7:8bea84f72e64 156 omuni.XmarkOmni_Move(0,0,0);
yoshidayuito 10:9ee22b22e583 157
yoshidayuito 7:8bea84f72e64 158 }
yoshidayuito 7:8bea84f72e64 159 /* 操縦権:手動 */
yoshidayuito 7:8bea84f72e64 160 else if(operate==1) {
yoshidayuito 7:8bea84f72e64 161 /* 足回り手動動作 */
yoshidayuito 7:8bea84f72e64 162 int x_val = (double)(DS3.LX-64)*100/64;
yoshidayuito 7:8bea84f72e64 163 int y_val = (double)(64-DS3.LY)*100/64;
yoshidayuito 7:8bea84f72e64 164 int r_val = (double)(DS3.RX-64)*100/64;
yoshidayuito 7:8bea84f72e64 165
yoshidayuito 7:8bea84f72e64 166 /* タイマーをリセット */
yoshidayuito 7:8bea84f72e64 167 if(DS3.RX!=64) yawCnt.reset();
yoshidayuito 7:8bea84f72e64 168 /* 目標角度再設定 */
yoshidayuito 7:8bea84f72e64 169 if(yawCnt.read_ms()<1000) TarTheta=NowLoc.theta;
yoshidayuito 7:8bea84f72e64 170 /* r_val補正 */
yoshidayuito 7:8bea84f72e64 171 r_val+=(TarTheta-NowLoc.theta)*CONST_CORRECTION_YAW;
yoshidayuito 7:8bea84f72e64 172
yoshidayuito 7:8bea84f72e64 173 omuni.XmarkOmni_Move(x_val,y_val,r_val);
yoshidayuito 10:9ee22b22e583 174
yoshidayuito 9:94112b5df540 175 /* 壁あて実行 */
yoshidayuito 9:94112b5df540 176 if(DS3.R1) ToWall();
yoshidayuito 7:8bea84f72e64 177 }
yoshidayuito 7:8bea84f72e64 178 /* 操縦権:自動 */
yoshidayuito 7:8bea84f72e64 179 else if(operate==2) {
yoshidayuito 7:8bea84f72e64 180 switch(auto_mode) {
yoshidayuito 7:8bea84f72e64 181 /* スタート待機処理 */
yoshidayuito 7:8bea84f72e64 182 case 0:
yoshidayuito 7:8bea84f72e64 183 /* オンボードSWで次のステップに */
yoshidayuito 7:8bea84f72e64 184 if(UB) auto_mode++;
yoshidayuito 7:8bea84f72e64 185 break;
yoshidayuito 7:8bea84f72e64 186
yoshidayuito 7:8bea84f72e64 187 /* 〇〇の処理 */
yoshidayuito 7:8bea84f72e64 188 case 1:
yoshidayuito 13:c8af1467ba8b 189 /* 動作終了時次のステップに */
yoshidayuito 13:c8af1467ba8b 190 if(XCooMove(1000,50)==0)
yoshidayuito 13:c8af1467ba8b 191 auto_mode++;
TakushimaYukimasa 14:18ec50f38993 192
yoshidayuito 7:8bea84f72e64 193 break;
yoshidayuito 7:8bea84f72e64 194
yoshidayuito 7:8bea84f72e64 195 /* 終了処理 */
yoshidayuito 7:8bea84f72e64 196 default:
yoshidayuito 7:8bea84f72e64 197 auto_mode=0;
yoshidayuito 7:8bea84f72e64 198 operate=0;
yoshidayuito 7:8bea84f72e64 199 break;
yoshidayuito 7:8bea84f72e64 200 }
yoshidayuito 7:8bea84f72e64 201 }
yoshidayuito 7:8bea84f72e64 202
TakushimaYukimasa 0:9e851dc42cde 203 }
TakushimaYukimasa 0:9e851dc42cde 204 }
TakushimaYukimasa 0:9e851dc42cde 205
TakushimaYukimasa 0:9e851dc42cde 206
TakushimaYukimasa 0:9e851dc42cde 207 /*******************************************************************************
TakushimaYukimasa 0:9e851dc42cde 208 * @概要 自己位置推定関数
TakushimaYukimasa 0:9e851dc42cde 209 * @引数 なし
TakushimaYukimasa 0:9e851dc42cde 210 * @返り値 なし
TakushimaYukimasa 0:9e851dc42cde 211 *******************************************************************************/
yoshidayuito 7:8bea84f72e64 212 void LocEstimate(void)
yoshidayuito 7:8bea84f72e64 213 {
yoshidayuito 7:8bea84f72e64 214 static double GyroDeg[2]= {0};
yoshidayuito 7:8bea84f72e64 215 static double EncDeg[2][2]= {0};
yoshidayuito 7:8bea84f72e64 216 static double disp[3]= {0};
TakushimaYukimasa 0:9e851dc42cde 217
yoshidayuito 7:8bea84f72e64 218 /* ジャイロの値取得 */
yoshidayuito 7:8bea84f72e64 219 bno.get_angles();
yoshidayuito 7:8bea84f72e64 220 GyroDeg[1]=GyroDeg[0];
yoshidayuito 7:8bea84f72e64 221 GyroDeg[0]=bno.euler.yaw;
yoshidayuito 7:8bea84f72e64 222 if(GyroDeg[0]!=0) {
yoshidayuito 7:8bea84f72e64 223 /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */
yoshidayuito 7:8bea84f72e64 224 if(GyroDeg[1]<90 && GyroDeg[0]>270) GyroDeg[1]+=360;
yoshidayuito 7:8bea84f72e64 225 /* 0→359を跨いだ時,前回の値を360以上の値で表記 */
yoshidayuito 7:8bea84f72e64 226 else if(GyroDeg[1]>270 && GyroDeg[0]<90) GyroDeg[1]-=360;
yoshidayuito 7:8bea84f72e64 227 /* 差を求める*/
yoshidayuito 7:8bea84f72e64 228 disp[2]=GyroDeg[1]-GyroDeg[0];
yoshidayuito 7:8bea84f72e64 229 }
TakushimaYukimasa 14:18ec50f38993 230 /* Enc1つの差分求める */
TakushimaYukimasa 14:18ec50f38993 231 for(int i=0; i<1; i++) {
yoshidayuito 7:8bea84f72e64 232 EncDeg[i][1]=EncDeg[i][0];
yoshidayuito 7:8bea84f72e64 233 EncDeg[i][0]=EncoderDeg[i];
yoshidayuito 7:8bea84f72e64 234 disp[i]=EncDeg[i][1]-EncDeg[i][0];
yoshidayuito 7:8bea84f72e64 235 }
yoshidayuito 7:8bea84f72e64 236 /* 差分を加速度として保存 */
yoshidayuito 7:8bea84f72e64 237 NowAcc.theta = disp[2];
TakushimaYukimasa 14:18ec50f38993 238 NowAcc.X = -disp[0] * cos(NowLoc.theta);
yoshidayuito 15:909c23ab7f0c 239
yoshidayuito 7:8bea84f72e64 240 /* 差分を累積して現在位置を保存 */
yoshidayuito 7:8bea84f72e64 241 NowLoc.X += NowAcc.X;
yoshidayuito 7:8bea84f72e64 242 NowLoc.theta += NowAcc.theta;
TakushimaYukimasa 0:9e851dc42cde 243 }
TakushimaYukimasa 0:9e851dc42cde 244
TakushimaYukimasa 0:9e851dc42cde 245
TakushimaYukimasa 0:9e851dc42cde 246
TakushimaYukimasa 0:9e851dc42cde 247
TakushimaYukimasa 0:9e851dc42cde 248 /* 割り込み(100us) *************************************************************/
TakushimaYukimasa 0:9e851dc42cde 249 void IT_CallBack(void)
TakushimaYukimasa 0:9e851dc42cde 250 {
yoshidayuito 7:8bea84f72e64 251 static int cnt = 0;
yoshidayuito 7:8bea84f72e64 252 static int data[EncoderMAX] = {0};
yoshidayuito 7:8bea84f72e64 253 static double EncDeg[EncoderMAX][2] = {0};
TakushimaYukimasa 0:9e851dc42cde 254
yoshidayuito 7:8bea84f72e64 255 for(int i=0; i<EncoderMAX; i++)
yoshidayuito 7:8bea84f72e64 256 switch(cnt) {
yoshidayuito 7:8bea84f72e64 257 /* 最初の処理 */
yoshidayuito 7:8bea84f72e64 258 case 0:
yoshidayuito 7:8bea84f72e64 259 data[i] = 0;
yoshidayuito 7:8bea84f72e64 260 CS[i] = 0;
yoshidayuito 7:8bea84f72e64 261 CL[i] = 1;
yoshidayuito 7:8bea84f72e64 262 break;
yoshidayuito 7:8bea84f72e64 263 /* 最後の処理 */
yoshidayuito 7:8bea84f72e64 264 case 25:
yoshidayuito 7:8bea84f72e64 265 CS[i]=1;
yoshidayuito 7:8bea84f72e64 266 /* 前回の値更新 今回の値更新(エンコーダの値(0~4096)を角度(0~360)に) */
yoshidayuito 7:8bea84f72e64 267 EncDeg[i][1] = EncDeg[i][0];
yoshidayuito 7:8bea84f72e64 268 EncDeg[i][0] = (double)data[i] * 360.0 / 4096;
yoshidayuito 7:8bea84f72e64 269 /* 359→0を跨いだ時,前回の値を0から逆回転で負の値で表記 */
yoshidayuito 7:8bea84f72e64 270 if ((270 <= EncDeg[i][1]) && (EncDeg[i][0] < 90))
yoshidayuito 7:8bea84f72e64 271 EncDeg[i][1] -= 360;
yoshidayuito 7:8bea84f72e64 272 /* 0→359を跨いだ時,前回の値を360以上の値で表記 */
yoshidayuito 7:8bea84f72e64 273 else if ((EncDeg[i][1] < 90) && (270 <= EncDeg[i][0]))
yoshidayuito 7:8bea84f72e64 274 EncDeg[i][1] += 360;
yoshidayuito 7:8bea84f72e64 275 /* 差を求める*/
yoshidayuito 7:8bea84f72e64 276 EncoderDeg[i] += EncDeg[i][0] - EncDeg[i][1];
yoshidayuito 7:8bea84f72e64 277 break;
yoshidayuito 7:8bea84f72e64 278 /* 通常の処理 */
yoshidayuito 7:8bea84f72e64 279 default:
yoshidayuito 7:8bea84f72e64 280 CL[i]=!CL[i];
yoshidayuito 7:8bea84f72e64 281 /* 最初でも最後でもなく奇数回で最初以外の時読み取り処理 */
yoshidayuito 7:8bea84f72e64 282 if(cnt != 1 && cnt % 2) {
yoshidayuito 7:8bea84f72e64 283 data[i] |= (DO[i]==1);
yoshidayuito 7:8bea84f72e64 284 data[i] = data[i] << 1;
yoshidayuito 7:8bea84f72e64 285 }
yoshidayuito 7:8bea84f72e64 286 break;
yoshidayuito 7:8bea84f72e64 287 }
yoshidayuito 7:8bea84f72e64 288 cnt++;
yoshidayuito 7:8bea84f72e64 289 cnt%=26;
yoshidayuito 7:8bea84f72e64 290 }
yoshidayuito 7:8bea84f72e64 291
yoshidayuito 7:8bea84f72e64 292
yoshidayuito 7:8bea84f72e64 293
yoshidayuito 7:8bea84f72e64 294
yoshidayuito 7:8bea84f72e64 295 /*******************************************************************************
yoshidayuito 7:8bea84f72e64 296 * @概要 壁あて関数
yoshidayuito 7:8bea84f72e64 297 * @引数 なし
yoshidayuito 7:8bea84f72e64 298 * @返り値 なし
yoshidayuito 7:8bea84f72e64 299 *******************************************************************************/
yoshidayuito 7:8bea84f72e64 300 void ToWall(void)
yoshidayuito 7:8bea84f72e64 301 {
TakushimaYukimasa 14:18ec50f38993 302 /* 左側リミットに応じて左2輪の操作量を決める */
yoshidayuito 9:94112b5df540 303 if(In.Get(0)==0)
yoshidayuito 7:8bea84f72e64 304 for(int i=0; i<2; i++) MovMotor[i]-=10;
TakushimaYukimasa 14:18ec50f38993 305
TakushimaYukimasa 14:18ec50f38993 306 /* 右側リミットに応じて左2輪の操作量を決める */
yoshidayuito 9:94112b5df540 307 if(In.Get(1)==0)
yoshidayuito 7:8bea84f72e64 308 for(int i=2; i<4; i++) MovMotor[i]+=10;
yoshidayuito 10:9ee22b22e583 309 }
yoshidayuito 10:9ee22b22e583 310
yoshidayuito 10:9ee22b22e583 311
yoshidayuito 10:9ee22b22e583 312
yoshidayuito 10:9ee22b22e583 313 /*******************************************************************************
yoshidayuito 10:9ee22b22e583 314 * @概要 x座標移動関数
yoshidayuito 11:42310638e241 315 * @引数 Tar:目標値
yoshidayuito 10:9ee22b22e583 316 * @引数 Err :許容誤差
yoshidayuito 10:9ee22b22e583 317 * @返り値 val_p:残り距離
yoshidayuito 10:9ee22b22e583 318 *******************************************************************************/
yoshidayuito 11:42310638e241 319 int XCooMove(int Tar,int Err)
yoshidayuito 10:9ee22b22e583 320 {
TakushimaYukimasa 14:18ec50f38993 321 /* x座標移動初期化フラグ */
TakushimaYukimasa 14:18ec50f38993 322 static bool XCooMoveFlag=0;
TakushimaYukimasa 14:18ec50f38993 323
TakushimaYukimasa 14:18ec50f38993 324 /* x座標移動タイマー */
TakushimaYukimasa 14:18ec50f38993 325 static Timer CooCnt;
TakushimaYukimasa 14:18ec50f38993 326
TakushimaYukimasa 14:18ec50f38993 327 /* 速度 加速・減速・最終操作量 */
yoshidayuito 11:42310638e241 328 int val_p=0,val_t=0,val=0;
yoshidayuito 10:9ee22b22e583 329
TakushimaYukimasa 14:18ec50f38993 330 /* X座標移動最初だけ初期化 */
TakushimaYukimasa 14:18ec50f38993 331 if(XCooMoveFlag==0) {
yoshidayuito 13:c8af1467ba8b 332 /* タイマースタート */
yoshidayuito 13:c8af1467ba8b 333 CooCnt.start();
yoshidayuito 13:c8af1467ba8b 334 /* X座標移動用タイマーリセット */
yoshidayuito 13:c8af1467ba8b 335 CooCnt.reset();
TakushimaYukimasa 14:18ec50f38993 336 /* 初期化フラグ立てる */
TakushimaYukimasa 14:18ec50f38993 337 XCooMoveFlag=1;
yoshidayuito 13:c8af1467ba8b 338 }
yoshidayuito 10:9ee22b22e583 339
TakushimaYukimasa 14:18ec50f38993 340 /* 加速・減速それぞれ求める */
TakushimaYukimasa 14:18ec50f38993 341 val_p=(Tar-NowLoc.X)*CONST_ACC_X;
TakushimaYukimasa 14:18ec50f38993 342 val_t=CooCnt.read_ms()*CONST_DEC_X;
yoshidayuito 11:42310638e241 343
TakushimaYukimasa 14:18ec50f38993 344 /* 小さい方を操作量として採択 */
yoshidayuito 11:42310638e241 345 val=MIN(val_p,val_t);
yoshidayuito 10:9ee22b22e583 346
yoshidayuito 11:42310638e241 347 /* -100~100に調整 */
yoshidayuito 10:9ee22b22e583 348 if(val>100) val=100;
yoshidayuito 11:42310638e241 349 else if(val<-100) val=-100;
yoshidayuito 11:42310638e241 350
TakushimaYukimasa 14:18ec50f38993 351 /* X方向のみ操作量を与えてオムニ代入 */
yoshidayuito 10:9ee22b22e583 352 omuni.XmarkOmni_Move(val,0,0);
yoshidayuito 11:42310638e241 353
TakushimaYukimasa 14:18ec50f38993 354 /* 残り距離求める */
yoshidayuito 13:c8af1467ba8b 355 int RemDis=Tar-NowLoc.X;
yoshidayuito 11:42310638e241 356
TakushimaYukimasa 14:18ec50f38993 357 /* 終了条件満たしているなら終了処理 */
TakushimaYukimasa 14:18ec50f38993 358 if(RemDis<=Err) {
TakushimaYukimasa 14:18ec50f38993 359 /* フラグ回収 */
TakushimaYukimasa 14:18ec50f38993 360 XCooMoveFlag=0;
TakushimaYukimasa 14:18ec50f38993 361 return 0;
TakushimaYukimasa 14:18ec50f38993 362 }
TakushimaYukimasa 14:18ec50f38993 363 /* 満たしてないなら残り距離返す */
TakushimaYukimasa 14:18ec50f38993 364 else
TakushimaYukimasa 14:18ec50f38993 365 return RemDis;
yoshidayuito 15:909c23ab7f0c 366 }
yoshidayuito 15:909c23ab7f0c 367
yoshidayuito 15:909c23ab7f0c 368
yoshidayuito 15:909c23ab7f0c 369
yoshidayuito 15:909c23ab7f0c 370 /*******************************************************************************
yoshidayuito 15:909c23ab7f0c 371 * @概要 ライン補正関数
yoshidayuito 15:909c23ab7f0c 372 * @引数 なし
yoshidayuito 15:909c23ab7f0c 373 * @返り値 なし
yoshidayuito 15:909c23ab7f0c 374 *******************************************************************************/
yoshidayuito 15:909c23ab7f0c 375 void LineCor(void)
yoshidayuito 15:909c23ab7f0c 376 {
yoshidayuito 15:909c23ab7f0c 377 /* xの操作量 */
yoshidayuito 15:909c23ab7f0c 378 int x_val=0;
yoshidayuito 15:909c23ab7f0c 379 /* 左側,右側の前回の値 */
yoshidayuito 15:909c23ab7f0c 380 int LastLf,LastRi;
yoshidayuito 15:909c23ab7f0c 381 /* ライン補正初期化フラグ */
yoshidayuito 15:909c23ab7f0c 382 static bool LineFlag=0;
yoshidayuito 15:909c23ab7f0c 383
yoshidayuito 15:909c23ab7f0c 384 if(LineFlag==0) {
yoshidayuito 15:909c23ab7f0c 385 LastLf=1;
yoshidayuito 15:909c23ab7f0c 386 LastRi=0;
yoshidayuito 15:909c23ab7f0c 387 /* 初期化フラグ立てる */
yoshidayuito 15:909c23ab7f0c 388 LineFlag=1;
yoshidayuito 15:909c23ab7f0c 389 }
yoshidayuito 15:909c23ab7f0c 390
yoshidayuito 15:909c23ab7f0c 391 /* どちらもラインに乗っていない状態 */
yoshidayuito 15:909c23ab7f0c 392 if(In.Get(2)==0&&In.Get(3)==0) {
yoshidayuito 15:909c23ab7f0c 393 if(LastLf==1) x_val-=10;
yoshidayuito 15:909c23ab7f0c 394 if(LastRi==1) x_val+=10;
yoshidayuito 15:909c23ab7f0c 395 }
yoshidayuito 15:909c23ab7f0c 396
yoshidayuito 15:909c23ab7f0c 397 /* どちらかがラインに乗っている状態 */
yoshidayuito 15:909c23ab7f0c 398 if(In.Get(2)==0&&In.Get(3)==1) {
yoshidayuito 15:909c23ab7f0c 399 /* 左側のみ */
yoshidayuito 15:909c23ab7f0c 400 if(In.Get(2)==1&&In.Get(3)==0)
yoshidayuito 15:909c23ab7f0c 401 x_val-=10;
yoshidayuito 15:909c23ab7f0c 402 /* 右側のみ */
yoshidayuito 15:909c23ab7f0c 403 else if(In.Get(2)==0&&In.Get(3)==1)
yoshidayuito 15:909c23ab7f0c 404 x_val+=10;
yoshidayuito 15:909c23ab7f0c 405 /* どちらも乗っている */
yoshidayuito 15:909c23ab7f0c 406 else
yoshidayuito 15:909c23ab7f0c 407 /* フラグ回収 */
yoshidayuito 15:909c23ab7f0c 408 LineFlag=0;
yoshidayuito 15:909c23ab7f0c 409
yoshidayuito 15:909c23ab7f0c 410
yoshidayuito 15:909c23ab7f0c 411 /* 今回の値を代入 */
yoshidayuito 15:909c23ab7f0c 412 LastLf=In.Get(2);
yoshidayuito 15:909c23ab7f0c 413 LastRi=In.Get(3);
yoshidayuito 15:909c23ab7f0c 414 }
yoshidayuito 15:909c23ab7f0c 415
yoshidayuito 15:909c23ab7f0c 416 omuni.XmarkOmni_Move(x_val,0,0);
TakushimaYukimasa 0:9e851dc42cde 417 }