目次 #contents *課題の説明 [#j102d4a4] #ref(2014a/Member/an/Mission1/2012b-mission1.png,100%) 図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 コースの詳細については授業中説明する(下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。 1.スタート地点から出発し、黒い線にそって動く。 2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。 3.さらに黒線に沿って動いてゴール地点を目指す。 4.ゴールに向けてピンポン玉をシュートする。 ただしT字路では、直進、右折、左折を正しく判断させること。また二人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。 さらに以下のような動作に挑戦することが望ましい。 •ゴールエリア外からピンポン玉をシュートする。 •曲線部中央の障害物に接触しないようにすること。 *ロボット [#s7ed91bc] **本体 [#y6b5a3c3] #ref(2014a/Member/an/Mission1/IMG_20140704_153730.jpg,30%,本体) #ref(2014a/Member/an/Mission1/IMG_20140704_153751.jpg,30%,本体) 大きなタイヤを前輪として速度を調節しました。 光センサーを前に、地面から比較的に上に設置し影の影響を受けないように付けました。 無駄な部品は使わずに頑丈なタイプに作りました。 アームは作れなかったので装着してない状態です。 *プログラム [#n713ccca] **定義 [#cad8221d] #define THRESHOLD 40 // しきい値 #define HIPOWER 7 // 速いスピードの値に使う #define LOWPOWER 2 // 遅いスピードの値に使う #define set_power_H SetPower(OUT_AC,HIPOWER); // 速いスピード #define set_power_L SetPower(OUT_AC,LOWPOWER); // 遅いスピード #define go_forward set_power_H; OnFwd(OUT_AC); // 前進する #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左回転 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右回転 #define STEP 1 // 動作する #define Max 50 // 同じ動作を50回まで続ける #define short_break Off(OUT_AC); Wait(500) // 少し止まる #define cross_time 200 // 交差点と判断して前進する時間 #define cross_line set_power_L; Wait(cross_time) // 交差点で直進 **基本プログラム [#id3d30c0] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); // 光センサーを使う int n; // 交差点の判断に使う n=0; // 最初の値を0から始める while(true) { while(true) { while( n < Max ) // 50回まで同じ動作を繰り返す。 { if (SENSOR_2 < THRESHOLD-15) {turn_left1; n++;} // センサーの値がしきい値-15より小さければ左旋回すると同時に判別 else { if(SENSOR_2 < THRESHOLD-8) { turn_left1;} // センサーの値がしきい値-8より小さければ左旋回 else if (SENSOR_2 < THRESHOLD-3){turn_left0; } // センサーの値がしきい値-3より小さければ左回転 else if (SENSOR_2 < THRESHOLD+3) go_forward;} // センサーの値がしきい値+3より小さければ直進 else if (SENSOR_2 < THRESHOLD+8) {turn_right0;} // センサーの値がしきい値の値+8より小さければ右回転 else {turn_right1;} n=0; } // センサーの値が上のどちらにも該当しない場合右旋回 Wait(STEP); } // 1回動作を行う short_break; // 判別 turn_right1; // 右旋回する Wait(Max*STEP); // 50回動作を行う cross_line; // 交差点と判断し、直進する n=0; } // 判別のやり直し } 交差点を判断させるためにint nを利用する。nは0から始め、左に回転すると1が加わり、右回転すると0に戻る。 また、直角カーブと交差点を判断するときは、交差点に入った時右回転してまた光センサーの視界に黒が入るのでnはMAXになり直進することになる。 この作業で交差点また2種類のカーブの区分をつけることができる。そして動作をSTEPに指定した時間程動かせる。 *反省 [#oaf45ccf] ばらす前に写真を沢山とっておかなかったため2枚しかありません。また、アームをちゃんと作れませんでした。 アームを作れなかったのでアームプログラムもつくれませんでした。 基本プログラム的にもたまたまトレースから外れる場合がありまして改善すべきです。