目次 #contents * 課題3 [#ec4d39c2] &ref(./2017a-mission3.png,50%,コース); 課題2のコースのある地点に空き缶を置きロボットで缶を集め交差点Tの円の中に積み上げる。高くつみあげると点数が上がる。 詳しくは[[課題3>2017a/Mission3]]参照 * ロボットの説明 [#e851ce11] ** 移動部 [#ia6109ed] &ref(./a_005.jpeg,50%,移動部横図); &ref(./名称未設定.png,50%,球状パーツ); 移動部は説明書に載っている基本のベースを二輪にして、後方に丸いなめらかなパーツを取り付けることによって、小回りがきき、なおかつ紙との摩擦による位置のズレを最小限に抑えられる形にした。 ** アーム [#q5c3c25e] &ref(./a_004.jpeg,50%,アーム部前方); &ref(./a_012.jpeg,50%,全体像); 缶を持ち上げる機構は、走る勢いで缶をタイヤに挟み込んで、上へ上昇するようにした。 &ref(./a_003.jpeg,50%,アーム拡大図); &ref(./a_013.jpeg,50%,回転センサ); 持ち上げるタイヤは、輪ゴムによって大小二つが同時に動くようになっていて、持ち上げた缶が落ちないようになっている。また、一番上に棒を取り付けた回転センサを取り付け、上がってきた缶が棒を押し上げることによって、センサが反応して缶が止まるようにした。 &ref(./a_008.jpeg,50%,押し出し機構); 最終的に缶を置くときに、タイヤに挟んだままでは缶だけ残せないので、囲いごと前方に押し出して本体が後退することで、缶だけがゴールの中に残るようにした。 &ref(./a_007.jpeg,50%,触角); 本体前方に巨大な触角のようなパーツを取り付けて、進路上の缶をより多く集めることができるようにした。 * プログラム [#e2eefa3e] プログラムは、移動用、アーム用共に、動きをサブルーチンとして纏めておくことで、メインタスクが短く、分かりやすくなるようにした。 ** 移動用 [#c129454c] 移動は、ライントレースはせずに、少なくとも2つの缶を確実に取れるようにルートを設定した。 *** 定数 [#ef9fd740] #define SIGNAL_ARM 1 //アームを動かすために送信する信号 #define SIGNAL_GO 2 //アームから受信する動くタイミングを表す信号 *** マクロ [#j8be2920] #define senkai_l Wait(50);OnFwd(OUT_C);OnRev(OUT_B);Wait(80);Off(OUT_BC); //右旋回 #define go_forward OnFwd(OUT_BC); //直進 #define go_back OnRev(OUT_BC);Wait(100);Off(OUT_BC); //後退 *** サブルーチン [#b624bbcc] sub can_catch() //缶の目の前まで進む {go_forward; SendMessage(SIGNAL_ARM); until(Message() == SIGNAL_GO); Off(OUT_BC);} sub tyokushin() //缶を持ち上げてから、右に90°旋回して直進する {go_forward; Wait(370); Off(OUT_BC); SendMessage(SIGNAL_ARM);} sub can_release() //缶をおろして押し出したあと、後退する {until(Message() == SIGNAL_GO); go_back; } *** メインタスク [#a6cdd65f] task main() { SetSensor(SENSOR_3, SENSOR_ROTATION); ClearMessage(); can_catch(); ClearMessage(); can_release(); } ** アーム用 [#b484801d] *** 定数 [#ef9fd740] #define SIGNAL_ARM 1 #define SIGNAL_GO 2 *** マクロ [#ce79003b] #define can_up OnFwd(OUT_A); //缶を上げる #define can_down OnRev(OUT_A);Wait(50);Off(OUT_A); //缶を下げる #define can_push OnFwd(OUT_C);Wait(50);Off(OUT_C); //缶を押し出す *** サブルーチン [#d4645965] sub can_catch() //回転センサーが反応するまで缶を持ち上げる {until(Message() == SIGNAL_ARM); can_up; until(SENSOR_3 < -3); Off(OUT_A); SendMessage(SIGNAL_GO);} sub can_release() //缶を下げて押し出す {until(Message() == SIGNAL_ARM); can_down; Wait(50); can_push; SendMessage(SIGNAL_GO);} *** メインタスク [#u2d4ebf0] task main() { ClearMessage(); can_catch(); senkai_l; ClearMessage(); tyokushin(); can_release(); } * まとめ [#o3b368ba] ** ロボコン結果 [#q3552f8e] 私たち、R7,R8のチームは、缶を一段積み、さらにもう一つ缶を円の中に入れることに成功した。 全体では、技術点を合計して4位となった。 ** 感想 [#a08148a1] 今回の課題では、二組のキットを使って一つのロボットを作ったが、二つの器械を通信によって連動させることで、今まで以上に複雑な動きやプログラムを作ることが出来るようになり面白かった。 今回作ったプログラムは、決められたレール上にある缶を狙って確実に点を稼ぐことを目的に作った。 しかし、光センサーをもっと駆使して、ライントレースをしたり、缶をサーチしたり出来るようなプログラミングを組めば、紙のどこに缶があっても、ゴールまで運べるようになって、技術点も上がったと思うので、もう少し時間があれば努力したかった。 この授業の3つの課題を通して学んだ、目的に応じたロボットを作製する力や、分かりやすいプログラミングを作るようにすることは、工学部としてこの先も多く活用する能力として身についたと思う。