#contents *目標 [#k4b1307d] -黒い線に沿って動くロボットを作る -A地点からB地点へ (P三叉路およびQ交差点はともに直進) -途中においたボールを目的地まで運んで、ゴールに入れる -その途中、三叉路および交差点では2秒間停止する -最後、B地点に入る三叉路付近からボールをシュートする &ref(無題.png); (画像はロボティクス入門ゼミ2015年課題2のページから頂き、書き加えた) *ロボット [#l5d3a1be] 全体像。オードソックスな4輪ロボットの前面にアームのはさみとライントレーサーを取り付けた。 &ref(new_IMG_0555.jpg); &ref(new_IMG_0556.jpg); ライントレーサーは、読み取りが正確になるように地面の近くに設置。 前輪の前に置く事により曲がるべき場所で行き過ぎる前に曲がる事ができた。 &ref(new_IMG_0557.jpg); 一番前のアームのはさみでボールをキャッチ&リリースできる。モーターで開閉する。 &ref(new_IMG_0558.jpg); &ref(new_IMG_0559.jpg); *プログラム [#y346b25b] **定義 [#q23b6a6e] 確実にライントレースできるように、右左折だけでなく旋回も書いた。 直進は直線での時間短縮のためである。 #define go_forward OnFwd(OUT_AC); // 直進 #define turn_left1 OnFwd(OUT_C);OnRev(OUT_A)// 左旋回 #define turn_left0 OnFwd(OUT_C); // 左折 #define turn_right0 OnFwd(OUT_A); // 右折 #define turn_right1 OnFwd(OUT_A);OnRev(OUT_C)// 右旋回 **プログラム [#cef7806d] ライントレースの値は、4段階に設定した。 交差点や三叉路までは時間を設定し、通常のライントレースを行い 交差点や三叉路では専用のライントレースを行う。 交差点で2秒間停止したあとにボールをはさむ。 最後は前進と後退をしてボールをシュートする。 task main() { SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(0); // タイマーをリセット while (FastTimer(0)<800) { // 通常のライントレース if (SENSOR_3 < 35) { turn_left1; } else if (SENSOR_3 < 40) { turn_left0; Wait(3); } else if (SENSOR_3 < 45) { go_forward; } else if (SENSOR_3 < 50) { turn_right0; } else { turn_right1; } } ClearTimer(0); while (FastTimer(0)< 19) { //交差点判定用ライントレース if (SENSOR_3 < 35) { turn_left1; } else if(SENSOR_3 < 40) { turn_left0; } else { if (SENSOR_3 < 45) { go_forward; } else if (SENSOR_3 < 50) { turn_right0; } else { turn_right1; } ClearTimer(0); } } Off(OUT_AC);Wait(200); // 2秒間停止 OnFwd(OUT_B); Wait(120); // アームを閉じる Off(OUT_B); turn_right1; Wait(25); // 進行方向修正 OnFwd(OUT_AC);Wait(20); // 交差点を渡る ClearTimer(0); while (FastTimer(0)<850) { // 通常のライントレース if (SENSOR_3 < 35) { turn_left1; } else if (SENSOR_3 < 40) { turn_left0; } else if (SENSOR_3 < 46) { go_forward; } else if (SENSOR_3 < 50) { turn_right0; Wait(2); } else { turn_right1; } } ClearTimer(0); while (FastTimer(0)< 23) { // 三叉路用ライントレース if (SENSOR_3 < 35) { turn_left1; } else if(SENSOR_3 < 40) { turn_left0; } else { if (SENSOR_3 < 45) { go_forward; } else if (SENSOR_3 < 50) { turn_right0; } else { turn_right1; } ClearTimer(0); } } Off(OUT_AC);Wait(200); // 2秒間停止 turn_right1; Wait(25); // 進行方向修正 OnFwd(OUT_AC);Wait(30); // 交差点を渡る ClearTimer(0); while (FastTimer(0)< 30) { if (SENSOR_3 < 35) { turn_left1; } else if(SENSOR_3 < 40) { turn_left0; } else { if (SENSOR_3 < 45) { go_forward; } else if (SENSOR_3 < 50) { turn_right0; } else { turn_right1; } ClearTimer(0); } } Off(OUT_AC); OnRev(OUT_C); Wait(30); // 方向修正 Off(OUT_C); OnRev(OUT_B); Wait(90); // アームを開く Off(OUT_B); OnFwd(OUT_AC); Wait(50); // ボールをシュート OnRev(OUT_AC); Wait(50); Off(OUT_AC); } *考察・感想 [#l667e810] 課題1に比べて慣れてきたがプログラミングが難しかった。長いプログラムになってしまった。 今回のプログラムは100%成功するプログラムでは無かった。通常のライントレースのときに、三叉路や交差点まで設定した秒数よりも早かったり遅かったりすると曲がれなかったり通り過ぎたりした。次はもっと安定するプログラムを書きたいと思う。電池にも左右された。ボールをはさむアイディアは良かったと思う。こちらは安定してボールをはさめた。(ボールの位置の微調整は必要なのだが)今回は授業外に集まる事が多く、非常にためになった。仲間と協力できてよかった。