[[2008b]] *課題 ライントレースロボットの作成 [#a7cd55b7] **内容 [#v4633c8e] チームで作成したコースに沿って動くロボットを作成 **注意点 [#j6efedd9] - 速さと正確さを追求すること - 交差点で優先側を走っていない場合には、一時停止すること - 前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと - コースを2周したら自動的に止まること *目次 [#g44cdeb3] #contents *コース [#e6826e93] コースは変則的にカーブを織り交ぜ、交差点が4つあるコースを作った。 #ref(2008b/A8/課題2左/IMGP0145.JPG,20%,コース) 特に考えずに書いてみたら交差点のうち3つが一か所に集中してしまったので難易度が高くなった。 *ロボット製作 [#u15ec97c] #ref(2008b/A8/課題2左/IMGP0155.JPG,20%,) **コンセプト [#hcaa1a4b] 今回の課題では、二台のロボットが入り組んだコースを走るため、次のようなコンセプトのロバットを制作した。 素早い シンプル **ベース製作 [#c98b8d27] 今回のベースはドライブベースをもとに製作した。 前回の課題で、四輪タイヤではカーブでの摩擦が大きいことを学んだため、今回の課題も二輪+キャスターによる機構に決定した。 #ref(2008b/A8/課題2左/IMGP0154.JPG,20%) **センサー取り付け [#u0e6c304] 光センサーは二つ取り付けた。二つの光センサーでコースの黒線を挟むようにして進めることにした。 その光センサーの前方にタッチセンサーを取り付けた。 #ref(2008b/A8/課題2左/IMGP0153.JPG,20%,) タッチセンサーは相手のロボのどこにぶつかっても反応できるようにバンパーを二重にし、その間に相手のロボが入り込まないように補強を施した。 **キャスター [#f5f585ac] キャスターは十分に動くスペースを確保し、車体が傾かないように高さを調節した。 #ref(2008b/A8/課題2左/IMGP0156.JPG,20%,) さらに相手のバンパーがぶつかっても問題のないようにブロックを積んで高くした。 *プログラム [#vc43ed1c] このロボットはコースの黒線を光センサーが挟むように作られているのでセンサーが黒線を感知した時に方向修正するプログラムを作った。 具体的には、右のセンサーが黒を感知したら右へ、左なら左へ方向修正できるようにした。 **今回のプログラム [#ab3fc642] #define THRESHOLD 40 //閾値 #define RUN_TIME 5 int move_count; //変数 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ−1は光センサー SetSensor(SENSOR_2, SENSOR_TOUCH); //センサ−2はタッチセンサー SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3は光センサー move_count = 0; //変数に0を代入 while(move_count <= 8) //値が8以下の間 { if(SENSOR_2==0) //値が0なら { if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) //光センサーが二つとも白の上にある場合直進する。 { OnFwd(OUT_A+OUT_C); } if(SENSOR_3 < THRESHOLD) //右のセンサーが黒の上にある場合タイマー0をリセット・スタート。 タイマー0が0.05秒以下なら左タイヤのみで曲がる。 タイマー0が0.05秒を超えたら右タイヤも後転させて曲がる。 {ClearTimer(0); while(FastTimer(0) <= RUN_TIME) { (SENSOR_3 < THRESHOLD); Off(OUT_C); OnFwd(OUT_A);} OnRev(OUT_C);OnFwd(OUT_A);} if (SENSOR_1 < THRESHOLD) //左のセンサーが黒の上にある場合タイマー1をリセット・スタート。 タイマー1が0.05秒以下なら右タイヤのみで曲がる。 タイマー1が0.05秒を超えたら左タイヤも後転させて曲がる。 {ClearTimer(1); while(FastTimer(1) <= RUN_TIME) { (SENSOR_1 < THRESHOLD); Off(OUT_A); OnFwd(OUT_C);} OnRev(OUT_A);OnFwd(OUT_C);} if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //センサーが二つとも黒の上にある場合2秒停止。その後0.7秒直進。このとき変数の値を+1する。 { Off(OUT_A+OUT_C);Wait(200); OnFwd(OUT_A+OUT_C);Wait(70);(move_count); move_count = move_count +1; }} if(SENSOR_2==1) //タッチセンサーに何かが触れた場合0.8秒後進。 0.5待機し、0.8秒前進し、元の位置に戻る。 { OnRev(OUT_A+OUT_C);Wait(80); Off(OUT_A+OUT_C);Wait(50); OnFwd(OUT_A+OUT_C);Wait(80); } }Off(OUT_A+OUT_C); //変数の値が8を超えた場合停止する。 } **プログラムの工夫点 [#q44ab613] 最初はセンサーが黒を感知したら片方のタイヤをとめ、もう片方のタイヤを前転させることでカーブを曲がっていた。しかしこのプログラムだと、少しカーブが急になると曲がり切れずに脱線してしまうことがわかった。そこで、正確にカーブを曲がりきるためにタイマーを用いた。もし0.05秒以上センサーが黒を感知したら、つまり曲がり切るのに時間がかかったら、止めていたタイヤを後転させて曲がるスピードを上げた。 ロボを二周で止めるのには変数を使用した。交差点で一時停止するように黒線を横に引いた。ロボが二つのセンサーで黒を感知、つまり黒の横線の上に着いたら、変数の値を+1して、値が8を超えると停止するように設定した。 *発表を終えて [#hf93795f] 最初は何度ロボを走らせても必ず失敗していて、全く完走しなかった。しかし、コースを逆に走らせてみると、とてもすんなりと完走することができた。発表の時はうまく相手のロボをよけてくれるかが心配だったが、なんとか成功することができた。しかしその後、別のことを試しているときにロボが机から落ちて大破するという事件が起こってしまった。しかし基本的には大きなミスもなく、グループのロボが二台とも完走できたのでよかった。 *コメントをどうぞ [#k6619f8c] #comment カーブを曲がる際の工夫はとても面白いと思います。 FI