*ロボットの紹介 [#ka0eb18a] 私たちのロボットは、できるだけコンパクトなものになるように工夫しました。 例えば、車体の前にある空き缶をつかむ部分です。空き缶をつかむアームの部分は、どうしても長くなるのでそこの下にできるスペースでタッチセンサーと光センサーを近くにつけました。しかし、こうすることでタッチセンサーの反応が悪く効率が良くないのでタイマーを使うことによってより正確になりました。 光センサーが斜めに付いているので、しきい値の設定が他とは違って工夫できたかと思います。一つのモーターで2つのアームを動かすのでアームの噛み合い具合にとても気を使いました。アームに付いた歯車は空回りできるようにしてモーターの故障を防ぎました。 #ref(2013a/Member/Sho/Mission1/1373524663100.jpg,70%) #ref(2013a/Member/Sho/Mission1/1373524685053.jpg,70%) #ref(2013a/Member/Sho/Mission1/1373524701220.jpg,70%) *コース攻略 [#w3a23940] #ref(2013a/Member/Sho/Mission1/robotics-2013a-mission1.jpg,100%) -円を回るときに右回りが難しかったので、曲がるときは極力スピードを下げました。 -交差点では、nMAXの値によって通過できるかできないか大きく別れたのでここの調整を意識しました。 -ライントレースのとき、しきい値がとても大きく影響したので入念に調べました。具体的には、黒ラインのしきい値が33〜35で、その他の白の部分は52〜55でした。なぜかは分かりませんが、ロボットをライントレースさせるたびに最適なしきい値が変わりました。 -回り方に関しては、始めに右に曲がるか左に曲がるかでプログラムを組んで、曲がり次第ライントレースをスタートさせるようにしました。 -音をある間隔ごとに出すことによって、タイマーによる時間がどのぐらい経過しているのかをわかりやすくしました。 *プログラム説明 [#ce91a882] #define THRESHOLD 35 #define HIPOWER 7 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward1 set_power_H;OnFwd(OUT_AC); #define go_forward2 set_power_L;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 moter set_power_L;OnFwd(OUT_B) #define STEP 1 #define nMAX 3 #define short_break Off(OUT_AC);Wait(10); #define CROSS_TIME 30 #define cross_line go_forward1;\ Wait(CROSS_TIME);short_break #define time0 500 #define time1 1500 #define time2 1900 #define time3 2700 #define time4 2900 #define time5 4000 #define time6 4300 #define time7 5000 -ここまでがこのプログラムにおける定義 sub line_trace1() //普通のライントレース { if (SENSOR_2 < THRESHOLD -6) { turn_left0; } else if (SENSOR_2 < THRESHOLD -3) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { go_forward1; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } Wait(STEP); } sub line_trace2() //急な回転のライントレース { if (SENSOR_2 < THRESHOLD -1) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { turn_right1; } else { go_forward1; } Wait(STEP); } -急カーブをする場合には、スピードを落とさないとまがり切れません。普通のカーブとプログラムを分けたのは、普通のカーブまで急カーブ用でやると動きがスムーズにいかず、もたついた動きになるからです。 sub line_cross() //交差点を通過 { int nOnline=0; while(nOnline < nMAX){ if (SENSOR_2 < THRESHOLD -6) { turn_left1; nOnline++; } else { if (SENSOR_2 < THRESHOLD -3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward1; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1;Wait(nMAX*STEP*10); cross_line; nOnline=0; } task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); go_forward1;Wait(35); turn_left1;Wait(100); while(FastTimer(0) <= time0) { line_trace1(); } OnFwd(OUT_B);Wait(50);Off(OUT_B); while(FastTimer(0) <= time1) { line_trace1(); } while(FastTimer(0) <= time2) { line_cross(); } while(FastTimer(0) <= time3) { line_trace2(); } while(FastTimer(0) <= time5) { line_trace2(); } while(FastTimer(0) <= time6) { line_cross(); } while(FastTimer(0) <= time7) { line_trace2(); } turn_right1;Wait(100); //缶を放す動作 go_forward1;Wait(100); turn_left1;Wait(200); OnRev(OUT_B);Wait(50);Off(OUT_B); OnRev(OUT_AC);Wait(100); while(true){ line_trace2(); } } -缶を置くところを通り過ぎてから180度ターンしてから缶を放して、ゴールに向かう。 *まとめ [#ze9cfd38] プログラムするときに急カーブがとても苦労しました。特に右回りは、黒ラインの外に出ると逆にターンしてしまい修正が大変でした。ロボットは、自分が想像していたよりもかなり思い通りに動かなくなることが多くありました。そして、プログラムを作るときはしっかりと明白なものにすることが大切だと感じました。 プログラムの管理を時間制にするかセンサーにするかで大きく違ったプログラムができることも分かりました。 空き缶を置くところでは、ロボットが旋回するときに空き缶が倒れてしまってうまくいかなかったので残念でした。 この課題の大切なところは、ロボットを動かして動かしながらプログラムを改善していくことだと思いました。