[[2012b/Member]] *課題1レポート [#x1bc2c40] **ロボットの説明 [#ne3e01a2] #ref(2012b/Member/aspect/Mission1/2012-12-19_18-56-24_533.jpg,35%,製作したロボット) 最初はデフォルトの形から横で玉の回収をしようとしたがポールに当たってしまうため前での回収に変更した。 -玉を回収するかごの部分は回収だけでなく打ち出せるようになっている。しかし重心が前に傾いてしまったので玉を回収するかごに車輪をつけて車体のゆれを押さえている。 #ref(2012b/Member/aspect/Mission1/yureosae.jpg,20%,車体の揺れを抑えるパーツ) -前方から玉を回収する。玉が多少遠くても回収することができる。 #ref(2012b/Member/aspect/Mission1/2012-12-19_18-54-54_670.jpg,20%,ボールを回収する) -かごを回転させて玉を回収する #ref(2012b/Member/aspect/Mission1/2012-12-19_18-55-13_133.jpg,20%,ボールを回収後) -回収するときと反対の方向にかごを回すことでボールを打ち出すことができる。 #ref(2012b/Member/aspect/Mission1/2012-12-19_20-47-16_445.jpg,20%,シュートする) **プログラムの説明 [#yd6a67a1] -急カーブの後交差点を直進し、再び急カーブに差し掛かるためswitch-case文を使いプログラムを短縮した。また、配列を使い時間の設定をした。 #define THRESHOLD 51 #define SPEED_H 50 // 直線用のスピード #define SPEED_L 40 // カーブのスピード #define SPEED_S 25 // 25ー30 #define SPEED_S 25 // 回収用のスピード #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H,SPEED_H); // 直進 #define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回 #define turn_left0 OnRL(SPEED_L,0);// 左折 #define turn_right0 OnRL(0,SPEED_L);// 右折 #define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回 #define STEP 1 // 1回の判断で動く時間 #define nMAX1 140 // 通常のカーブとして許容できる繰り返しの最大値 #define nMAX2 150 // 交差点と判断するまでの繰り返しの最大値 #define xturn 170// 交差点突破の方向修正 #define yturn 200// シュートの方向修正 #define short_break Off(OUT_BC); Wait(1000); // 小休止 #define CROSS_TIME 200 // 交差点通過にかかる時間 /* 交差点を渡る */ #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; task main(){ SetSensorLight(S3); int nOnline = 0; // 続けて黒になった回数 (カウンタ) long t0 = CurrentTick(); // タイマ long st[2] = { 7000, 3000, 11500 }; // 交差点パターンの変更時間設定 int p = 0; // st[]の移行用変数 int pattern = 1; // whitch文の条件の変数 ////////////////////////////////////////// /* 球の回収 */ ////////////////////////////////////////// OnFwd(OUT_A,SPEED_S);Wait(430); // 玉の回収 Off(OUT_A);Wait(1000); OnFwd(OUT_BC,SPEED_S);Wait(750); // 線を通過する Off(OUT_BC);Wait(1000); t0 = CurrentTick(); // タイマのリセット while (true) { switch(pattern){ ////////////////////////////////////////////////////////////////// /* 1:直角・急カーブを曲がるトレースパターン */ /* 2:交差点を直進するトレースパターン */ /* 3:交差点を突破するパターン */ /* 4:ゴールのパターン */ /* 5:シュートするパターン */ ////////////////////////////////////////////////////////////////// case 1: ////////////////////////////////////////////////////////////////// /* 直角・急カーブを曲がるパターン */ ////////////////////////////////////////////////////////////////// if(CurrentTick() - t0 >= st[p]){ // パターン変更の判断 if(p == 0){ p++; t0 = CurrentTick(); // タイマのリセット nOnline=0; カウンタをリセット pattern = 2; // 交差点を直進するトレースパターンへ移行 break; }else{ pattern = 4; // ゴールのパターンへ移行 nOnline=0; カウンタをリセット break; } } if (SENSOR_3 < THRESHOLD-10) { turn_left1; } else if (SENSOR_3 < THRESHOLD-5) { turn_left0; } else if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+10) { turn_right0; } else { turn_right1; } Wait(STEP); break; case 2: ////////////////////////////////////////////////////////////////// /* 交差点を直進していいパターン */ ////////////////////////////////////////////////////////////////// if(CurrentTick() - t0 >= st[p]){ // パターン変更の判断 p++; t0 = CurrentTick(); // タイマのリセット pattern = 1; // 直角・急カーブを曲がるトレースパターンへ移行 break; } if(nOnline > nMAX1){ // 交差点判断 pattern = 3; // 交差点を突破するパターンへ移行 break; } if (SENSOR_3 < THRESHOLD-10) { turn_left1; nOnline++; // カウンタを増やす } else if (SENSOR_3 < THRESHOLD-5) { turn_left0; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+10) { turn_right0; } else { turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); break; case 3: ////////////////////////////////////////////////////////////////// /* 交差点を突破するパターン */ ////////////////////////////////////////////////////////////////// short_break; // 小休憩 turn_right1; Wait(xturn); // 進行方向修正 cross_line; // 交差点を渡る nOnline=0; //カウンタをリセット pattern = 2; // 交差点を直進するトレースパターンへ移行 break; case 4: ////////////////////////////////////////////////////////////////// /* ゴールするパターン */ ////////////////////////////////////////////////////////////////// if(nOnline > nMAX2){ // ゴール判断 pattern = 5; // シュートするパターンへ移行 break; } if (SENSOR_3 < THRESHOLD-10) { turn_left1; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-5) { turn_left0; } else if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+10) { turn_right0; } else { turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); break; case 5: ////////////////////////////////////////////////////////////////// /* シュートするパターン */ ////////////////////////////////////////////////////////////////// short_break; // 小休憩 turn_right1; Wait(yturn); // 進行方向修正 Off(OUT_BC);Wait(1000); OnRev(OUT_A,SPEED_H);Wait(360); Off(OUT_A);Wait(1000); // シュート pattern = 6; // 終了へ移行 break; default: Off(OUT_ABC); break; } } }