[[2015a/MemberOnly]] *ライントレース [#g3231d40] **課題 [#k1a5b0b0] &ref(./2015a-mission2.png,75%); A地点からB地点へ (P三叉路およびQ交差点はともに直進)黒い線にそって動くロボットを作成する そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止する。 可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。 **ロボットの構成 [#eea9b114] ***ロボットの基本構造 [#z5f78646] ロボットの基本的な構造は、右回転、左回転がしやすいので説明書に乗っている前輪と後輪の隙間があまりないロボットを使った。 ***光センサーの位置 [#q8d1a5ec] 左右の中心、前後の中心より前の位置にセットした。中心より前に少し位置することによりその場で回転したときにセンサーの位置が変化するようにした。中心にセットしてしまうと回転したときにセンサーが動かないのでロボットが回転したことに気付くことができない。 ***籠 [#k859a293] ボールをキャッチする装置には籠を使った。一番の理由は作りやすかったからだ。 &ref(./IMG_1372[1].jpg,15%); **プログラム [#d1b6340a] ***定義 [#b98a1e93] #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); //シュート ***本体プログラム [#x65f5bf1] task main(){ SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // 続けて線上になった回数 while (nOnline <nMAX) { //線上を続けてnMAX回繰り返さない間、通常のライントレースをする if (SENSOR_2 < IN){ // 線上なら right; // 右へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < OUT){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば left; //左へ } nOnline=0; //カウンタリセット } Wait(STEP); } nOnline=0; //カウンタリセット } while (nOnline <nMAX) { //線上を続けて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; //小休止 DOWN; //籠を下げ捕球 left;Wait(30); //方向修正 short_break; //小休止 cross_line; //交差点を渡る nOnline=0; //カウンタリセット } while (nOnline <nMAX) { //黒を続けて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; //カウンタをリセット } }