[[2015a/MemberOnly]] *ライントレース [#g3231d40] **課題 [#k1a5b0b0] &ref(./2015a-mission2.png,75%); A地点からB地点へ (P三叉路およびQ交差点はともに直進)黒い線にそって動くロボットを作成する そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止する。 可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。 **ロボットの構成 [#eea9b114] &ref(./IMG_1372[1].jpg,15%); **プログラム [#d1b6340a] #define IN 40 //40以下は線上 #define OUT 45 //45以上は線外 #define go_forward OnFwd(OUT_AC); //直進 #define right OnRev(OUT_C); OnFwd(OUT_A); //右まわり #define left OnFwd(OUT_C); OnRev(OUT_A); //左まわり #define STEP 1 // 一回の判定で進む時間 #define short_break Off(OUT_AC); Wait(200); // 小休止 #define CROSS_TIME 20 // 交差点通過にかかる時間 #define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る #define nMAX 8 //通常のカーブとして許容できる繰り返しの最大値 #define DOWN OnFwd(OUT_B);Wait(40);Off(OUT_B); //籠を下ろす #define UP OnRev(OUT_B);Wait(40);Off(OUT_B); //籠を上げる #define shot go_forward;Wait(100); //シュート task main(){ SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // 続けて線上になった回数 if (true) { //線上を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < IN){ // 線上なら right; // 右へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < OUT){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば left; //左へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット } if (true) { //線上を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < IN){ // 線上なら right; // 右へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < OUT){ // 境界付近なら go_fo // 直進 } else { //線から外れれば left; //左へ } nOnline=0; //カウンタリセット } Wait(STEP); } short_break; //小休止 right;Wait(35); //方向修正 short_break; //小休止 DOWN; //籠を下げ捕球 left;Wait(30); //方向修正 short_break; //小休止 cross_line; //交差点を渡る nOnline=0; //カウンタリセット } if (true) { //黒を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < IN){ // 線上なら right; // 右へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < OUT){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば left; //左へ } nOnline=0; //カウンタリセット } Wait(STEP); } short_break; //小休止 right;Wait(35); //方向修正 short_break; //小休止 UP; //籠を上げる shot; //車体でボールを押し、シュート Off(OUT_AC); //停止 nOnline=0; //カウンタをリセット } }