#contents *課題 [#g2ac3d5d] #ref(./2015a-mission21.png,70%) 次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 •A地点からB地点へ (P三叉路およびQ交差点はともに直進) •B地点からA地点へ (Q交差点では直進、P三叉路では直進) •C地点からA地点へ (Q交差点では直進、P三叉路では右折) そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。 可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。 自分はC地点からA地点へ行く経路を選んだ。 *ロボットの説明 [#sb5ebfdd] #ref(./DSC_00071.jpg,70%) #ref(./DSC_00051.jpg,90%) このようにアームを上下に動かし、光センサと横につけたブロックの間にボールを入れ上からアームをかぶせるようにしてボールをキャッチする。 *プログラムの説明 [#if20647d] **内容 [#p0d010d7] #define BLACK 40 // これ以下は黒 #define WHITE 50 // これ以上は白 #define SPEED 35 #define speed 25 #define go_forward OnFwd(OUT_BC,SPEED); // 直進 #define turn_left OnFwd(OUT_B,speed);Off(OUT_C); // 左折 #define turn_right Off(OUT_B);OnFwd(OUT_C,speed); // 右折 #define STEP 1 // 一回の判断で動作させる時間 #define nMAX 200 #define short_break Off(OUT_BC);Wait(2000); // 小休止 #define arm_down OnFwd(OUT_A,SPEED);Wait(500);Off(OUT_A); // アームを下げる #define CROSS_TIME 500 // 交差点を通過する時間 #define cross_line OnFwd(OUT_BC,SPEED);Wait(CROSS_TIME);short_break; // 交差点の通過 #define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A); // アームを上げる task main() { SetSensorLight(S3); int nOnline=0; // 続けて黒になった回数(カウンタ) if (true) { while (nOnline < nMAX) { if (SENSOR_3 < BLACK) { turn_left; // 黒の時は左に曲がる nOnline++; // カウンタを増やす } else if (SENSOR_3 < WHITE) { go_forward; // 黒と白の間の時は直進する } else { turn_right; // 白の時は右に曲がる nOnline=0; // カウンタリセット } Wait(STEP); } short_break; // 小休止 turn_right; Wait(nMAX*STEP); cross_line; // 交差点を渡る arm_down; // アームを下す nOnline=0; // カウンタをリセットする } ///////////////////////////////////////////〜 一つ目の交差点、ボールのキャッチ if (true) { // 再びライントレースに戻る while (nOnline < nMAX) { if (SENSOR_3 < BLACK) { turn_left; // 黒の時は左に曲がる nOnline++; // カウンタを増やす } else if (SENSOR_3 < WHITE) { go_forward; // 黒と白の間の時は直進する } else { turn_right; // 白の時は右に曲がる nOnline=0; // カウンタをリセットする } Wait(STEP); } short_break; // 小休止 turn_right; Wait(nMAX*STEP); cross_line; // 交差点を渡る nOnline=0; // カウンタをリセットする } /////////////////////////////////////////一つ目の交差点、ボールのキャッチ〜二つ目の交差点 if (true) { // 再びライントレースに戻る while (nOnline < nMAX) { if (SENSOR_3 < BLACK) { turn_left; // 黒の時は左に曲がる nOnline++; // カウンタを増やす } else if (SENSOR_3 < WHITE) { go_forward; // 黒と白の間の時は直進する } else { turn_right; // 白の時は右に曲がる nOnline=0; // カウンタをリセットする } Wait(STEP); } short_break; // 小休止 /////////////////////////// turn_left; Wait(nMAX*STEP); arm_up; // アームを上げる OnRev(OUT_BC,SPEED);Wait(600); // 後退する シュートを Off(OUT_BC); arm_down; // アームを下げる する OnFwd(OUT_BC,SPEED);Wait(600); // 前進する Off(OUT_BC); nOnline=0; // カウンタをリセットする //////////////////////////// } }