[[2013b/Member]] #contents *MISSION [#s9fc60d9] •2台のロボットで空き缶を収集し、ゴールに空き缶になるべく多く高く積み上げる 基本ルール •競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 •図の左下の隅からスタートする。ロボットが紙からはみ出ない範囲で可能な限りに隅に配置する。 •空き缶を集めて図の「ゴール」と書かれた円弧と直線で囲まれる領域に空き缶を運ぶ •なるべく高く空き缶を積み上げる •運び終わった後、あるいは積み上げた後はロボットはゴールの領域から外に出ること。また空き缶と接触していたはいけない。 •開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 •競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 •途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 * ロボットの説明 [#t9912360] 二つのロボットを缶を集めるロボット、缶を積み上げるロボットに分担して目的を達成する。 *ロボットの説明 [#t9912360] 二つのロボットを缶を集めるロボット、缶を積み上げるロボットに分担して目的を達成します。 #ref(2013b/Member/ryois/Mission2/route2.jpg,100%) 上の図で青い矢印が缶を積み上げるロボットの行動パターン。 赤い矢印が缶を運ぶロボットの行動パターンです。 ゴール地点まで缶を運んでから、ゴール地点で缶を積み上げます。 *メンバー [#l76e027a] •yunagi 積み上げロボの制作 •uirin 空き缶収集ロボの制作とプログラミング •mato 積み上げロボのプログラミング •ryois 空き缶収集ロボの制作とプログラミング *缶を積むロボット [#gadf45a6] こちらのロボットは他のメンバーが分担して製作しました。お疲れ様でした! 定義、サブルーチン(缶を積む)、メインのプログラムは次の通りです 次の写真は缶を持ち上げる仕組みです。このタイヤが回って接触した缶を上に持ち上げます。 #ref(2013b/Member/ryois/Mission2/IMG_0698.JPG) 次の写真のようにアームで缶を2個つかみます。ロボット側の缶がタイヤの回転によって上に持ち上がります。初めて見たときは驚きました。製作者の方お疲れ様です。なんだか感動しました。 #ref(2013b/Member/ryois/Mission2/IMG_0696.JPG) 次の写真はちょっと盛っています。実際には缶は2個しか積めません。精一杯の背伸びです。こうなることを夢見て精進しておりました。 #ref(2013b/Member/ryois/Mission2/IMG_0689.JPG) さて、定義、サブルーチン(缶を積む)、メインのプログラムは次の通りです #define THRESHOLD 50 //しきい値 #define HIPOWER 2 //高速での出力 #define LOWPOWER 1 //低速での出力 #define set_power_H SetPower(OUT_AC,HIPOWER); //モータACを高速で動かす #define set_power_L SetPower(OUT_AC,LOWPOWER); //モータACを低速で動かす #define go_forward(t) set_power_H; OnFwd(OUT_A); Wait(t); Off(OUT_A); //前進する #define go_back(t) set_power_L; OnRev(OUT_A); Wait(t); Off(OUT_A); //後進する #define can_hold(t)set_power_L; OnFwd(OUT_C); Wait(t); //缶を掴む #define can_up(t) set_power_L; OnFwd(OUT_B); Wait(t); Off(OUT_B); //缶を持ち上げる #define can_down(t) set_power_L; OnRev(OUT_B); Wait(t); Off(OUT_B); //缶を下ろす #define can_rerease(t) set_power_L; OnRev(OUT_C); Wait(t); Off(OUT_C); //缶を離す サブルーチン(缶を積む) sub can_stack() { can_hold(100); go_back(30); go_forward(50); can_up(700); go_forward(200); can_down(200); can_rerease(60); go_back(1000); } メインのプログラム task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); go_forward(600); Wait(3000); //缶を集めるロボットがいなくなるのを待つ。 can_stack(); } *缶を運ぶロボット [#qc9239b0] 次の写真は、缶を運ぶロボットの全体の写真です。いたってシンプル! ライントレースをして缶を一つだけ集めて運ぶ。それだけ。しかし、重要な役割! #ref(2013b/Member/ryois/Mission2/IMG_0687.JPG) 次の写真は缶を運んでいる最中のものです。 #ref(2013b/Member/ryois/Mission2/IMG_0693.JPG) 定義 #define THRESHOLD 40 //しきい値 #define HIPOWER 3 //高速での出力 #define LOWPOWER 2 //低速での出力 #define set_power_H SetPower(OUT_AC,HIPOWER); //モータACを高速で動かす #define set_power_L SetPower(OUT_AC,LOWPOWER); //モータACを低速で動かす #define go_forward set_power_H; OnFwd(OUT_AC); //前進する #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回する #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左折する #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右旋回する #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右折する #define time0 800 #define time1 700 #define time3 4000 ・サブルーチン 最初にライン上にうまく乗るために右に旋回します。 sub turn1() { OnFwd(OUT_A); Wait(250); Off(OUT_A); } サブルーチン •最初にライントレースをするためにターンする sub turn1() { OnFwd(OUT_A); Wait(250); Off(OUT_A); } •最初にライントレースをするためにターンする sub turn1() { OnFwd(OUT_A); Wait(250); Off(OUT_A); } •一個目の空き缶にまでいくためのプログラム sub line1() { if (SENSOR_2 < THRESHOLD -5) { turn_right1; } else if (SENSOR_2 < THRESHOLD -3) { turn_right0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward; } else if (SENSOR_2 < THRESHOLD +5) { turn_left0; } else { turn_left1; } } •急カーブをライントレースするためのプログラム sub line2() { if (SENSOR_2 < THRESHOLD +0) { turn_right1; } else if (SENSOR_2 < THRESHOLD +3) { turn_right0; } else if (SENSOR_2 < THRESHOLD +5) { go_forward; } else if (SENSOR_2 < THRESHOLD +7) { turn_left0; } else { turn_left1; } } •一個目の空き缶を運んだあとのプログラム sub uturn() { OnRev(OUT_AC); Wait(150); OnFwd(OUT_A); OnRev(OUT_C); Wait(100);} •ラインの左側を通り、空き缶を回収するプログラム sub line3() { if (SENSOR_2 < THRESHOLD +0) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +5) { go_forward; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } } メインのプログラム task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); turn1(); //最初にターン ClearTimer(0); while (FastTimer(0) <= time0) { line1(); } //time0が終わるまでline1を実行 ClearTimer(0); while (FastTimer(0) <= time1) { line2(); } //time1が終わるまでline2を実行 uturn(); //空き缶を運び終わり、Uターン ClearTimer(0); while (FastTimer(0) <= time3) { line3(); } //time3が終わるまでline3を実行 OnRev(OUT_AC); Wait(150); //空き缶を置いて後退 Off(OUT_AC); } *感想 [#y8ad7bd3] 最初はどのように缶を集めるのかなかなか決まらずロボットの製作は他のチームよりスタートが遅れてしまった。また、何度もロボットを根本的に作り直して、時間的な余裕がなくなっていってしまった。 ロボットを2台別々にしたのはNQCの簡単な構造を生かすうえで正しい判断であったと考えられる。 私は缶を集めるロボットの製作をしました。ライントレースのプログラミングやロボットのアームを中心に行いました。ただ、最終的な調整は相方さんに任せてしまったので申し訳ないです。ありがとうございました。 また、ロボコン当日都合が悪く最後までロボットを見届けることができませんでしたが、缶を無事に集める姿を見ることができてうれしかったです。