〜課題2(ライントレース)目次〜 #contents *課題 [#k9831262] 1.A地点からB地点へ (P三叉路およびQ交差点はともに直進) 2.B地点からA地点へ (Q交差点では直進、P三叉路では直進) 3.C地点からA地点へ (Q交差点では直進、P三叉路では右折) そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。 可能であれば、A,B,Cのそれぞれにエリアに入る三叉路付近からボールをシュートする。 自分は、1のA地点からB地点へのルートを選択した。 #ref(./ロボ課題2.1ライン.png,50%) *製作する上で工夫した点 [#ned7e2fc] **ロボット本体 [#zee4c438] ・ロボット本体にパーツを付けやすくするために、モーターを地面に水平にした。 ・本体前部にクワ型状のアーム1を取り付けた。 ・本体上部前方に、モーターを1つ取り付けてショベル型状のアーム2作った。 ・本体下部前方に光センサーを取り付けた。 #ref(./本体1.jpg,10%) #ref(./本体2.jpg,10%) **アーム1(クワ型) [#x371323d] ・本体前部に、タイヤも含めた横幅と同じ長さのアームを取り付けた。縦の長さはボール1個分の長さとほぼ同じにした。 ・水平に取り付けるとボールが下から通り抜けることがあるので、やや下に傾くようにした。 #ref(./アーム1.jpg,10%) #ref(./アーム2.jpg,10%) **アーム2(ショベル型) [#odd4f12c] ・本体上部前方に ・ #ref(./ショベル1.jpg,10%) *プログラム [#c9146c3d] **定義の説明 [#t841a54b] #define THRESHOLD 45・・・光センサーの閾値 #define SPEED_H 50・・・移動スピード(高速) #define SPEED_L 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 nMAX 300・・・ 通常のカーブとして許容できる繰り返しの最大値 #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;・・・交差点を渡る **実際のプログラム [#zbefae11] #define THRESHOLD 45 #define SPEED_H 50 #define SPEED_L 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 nMAX 300 // 通常のカーブとして許容できる繰り返しの最大値 (調整する) #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; // 続けて黒になった回数 (カウンタ) while (true) { /* 黒を続けてnMAX回繰り返さない間、通常のライントレースをする */ while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-10) { turn_left1; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-5) { turn_left0; } else if (SENSOR_3 < THRESHOLD+2) { go_forward; } else if (SENSOR_3 < THRESHOLD+5) { turn_right0; } else { turn_right1; } nOnline=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る nOnline=0; //カウンタをリセット } } *作成した上での残った課題 [#o3eb7df6] ・ *感想と反省 [#j97622f4] ・