*今回の課題 [#nf9c1ce8] #ref(2015a-mission2.png,,70%) 上図のようなコースを作り、制作したロボットをA地点からB地点までコースに沿って動かす。その際、ロボットにP,Q地点ともに直進させる。また、P,Q地点の間のどこかにピンポン玉を置いてロボットの移動中に回収させ、B地点に設置したゴールにシュートさせる。 *ロボットの説明 [#ga88d64c] &ref(./1436582731685.jpg,,30%); &ref(./1436582754035.jpg,,30%); (ロボット全体の写真) 今回制作したロボットは三つの車輪を使い、そのうち二つがモーターを使って動き、残りの一つがキャスターという形で動かすことにした。最初は冊子に載っている基本形のロボットを使おうとしていたが、後述のようにいくつか不都合があったためにこのような構造になった。このロボットは大きく分けて車体本体部分とアーム部分に分かれるので、その二つの部分の構造について説明していく。 **本体部分 [#zd728b9e] **アーム部分 [#l84212bc] *プログラムの説明 [#z5869422] #define BLACK 42 //以下は黒 #define WHITE 50 //以上は白 #define go_forward OnFwd(OUT_AC); //真っ直ぐ #define go_back OnRev(OUT_AC); //後ろへ #define turn_right OnRev(OUT_C); OnFwd(OUT_A); //右旋回 #define turn_left OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define STEP 1 // 一回の判定で進む時間 #define short_break Off(OUT_AC); Wait(200); // 小休止 #define CROSS_TIME 30 // 交差点通過にかかる時間 #define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る #define FIX_TIME 25 #define nMAX 8 #define clip_on OnFwd(OUT_B);Wait(10);Off(OUT_B); #define clip_off OnRev(OUT_B);Wait(10);Off(OUT_B); #define shoot go_back;Wait(50);go_forward;Wait(30);clip_off; //シュート task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; // 続けて黒になった回数 (カウンタ) if (true) { //黒を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < BLACK){ // 線上なら turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタをリセット } Wait(STEP); } short_break; //小休憩 turn_left;Wait(FIX_TIME); //方向左修正 short_break; //小休憩 clip_on; //捕球 turn_right;Wait(45); //方向右修正 go_forward;Wait(CROSS_TIME); //前進 nOnline=0; //カウンタをリセット } if (true) { //黒を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < BLACK){ // 線上なら turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタをリセット } Wait(STEP); } short_break; //小休憩 turn_right;Wait(FIX_TIME); //方向修正 cross_line; //交差点を渡る nOnline=0; //カウンタをリセット } if (true) { //黒を続けてnMAX回繰り返さない間、通常のライントレースをする while (nOnline <nMAX) { if (SENSOR_2 < BLACK){ // 線上なら turn_left; // 左へ nOnline++; //カウンタ増やす } else { if (SENSOR_2 < WHITE){ // 境界付近なら go_forward; // 直進 } else { //線から外れれば turn_right; //右へ } nOnline=0; //カウンタをリセット } Wait(STEP); } short_break; //小休憩 turn_right;Wait(FIX_TIME); //方向修正 shoot; //シュート Off(OUT_AC); //停止 nOnline=0; //カウンタをリセット } } *実際にロボットを動かしている動画 [#c432960a] https://www.youtube.com/watch?v=MteH8fCbr5g *反省,感想 [#i5496406]