- 追加された行はこの色です。
- 削除された行はこの色です。
[[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%,)
#ref(2008b/A8/課題2右/全景.JPG,20%,)
**コンセプト [#hcaa1a4b]
今回の課題では、二台のロボットが入り組んだコースを走るため、次のようなコンセプトのロバットを制作した。
素早い
シンプル
**ベース製作 [#c98b8d27]
今回の課題では、二台のロボットが入り組んだコースを走るため、次のようなコンセプトのロボットを制作した。
・素早い
・シンプル
**ベース [#c98b8d27]
今回のベースはドライブベースをもとに製作した。
前回の課題で、四輪タイヤではカーブでの摩擦が大きいことを学んだため、今回の課題も二輪+キャスターによる機構に決定した。
#ref(2008b/A8/課題2左/IMGP0154.JPG,20%)
#ref(2008b/A8/課題2右/ベース.JPG,20%)
**センサー取り付け [#u0e6c304]
光センサーは二つ取り付けた。二つの光センサーでコースの黒線を挟むようにして進めることにした。
その光センサーの前方にタッチセンサーを取り付けた。
#ref(2008b/A8/課題2左/IMGP0153.JPG,20%,)
タッチセンサーは相手のロボのどこにぶつかっても反応できるようにバンパーを二重にし、その間に相手のロボが入り込まないように補強を施した。
**キャスター [#f5f585ac]
キャスターは十分に動くスペースを確保し、車体が傾かないように高さを調節した。
#ref(2008b/A8/課題2左/IMGP0156.JPG,20%,)
さらに相手のバンパーがぶつかっても問題のないようにブロックを積んで高くした。
**センサー[#u0e6c304]
今回の課題では、二台のライントレースロボットを同時に走らせるので、光センサーとタッチセンサーを使用した。
#ref(2008b/A8/課題2右/ダブルバンパー.JPG,20%)
***光センサー [#t5ab022d]
当初このロボットは、コースの黒線に光センサーが入るように作成した。
しかし、もう一つのグループのロボットがコースの黒線を光センサーが挟むように作られており、コースもそのロボット用に作られていたので我々のロボットもそのような仕様に変更した。
つまり、下図のようになる。
#ref(2008b/A8/課題2右/ライントレース.gif,20%)
**タッチセンサー [#u0892d86]
タッチセンサーは、前回の授業で作りかけだったダブルバンパーに設置し、車体前方に取り付けた。
タッチセンサー自体は二個使用したが、コードは一か所に接続し機能的にはシングルバンパーとして使用した。
*プログラム [#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を超えた場合停止する。
#define THRESHOLD 50
int move_count;
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1は光センサー
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3は光センサー
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2はタッチセンサー
SetPower(OUT_A,4); //モーターAの出力を4に
SetPower(OUT_C,7); //モーターCの出力を7に
move_count = 0; //move_countの値を0に
while (move_count <= 8) { //move_countが8以下の時下を繰り返す
if(SENSOR_2==0){ //タッチセンサーが働いていない時
if (SENSOR_1 > THRESHOLD) { //右の光センサーが白のとき
if (SENSOR_3 > THRESHOLD) { //左の光センサーが白の時
OnFwd(OUT_A+OUT_C); //前進
} else { //左の光センサーが黒の時
Off(OUT_A); //左に方向転換
OnFwd(OUT_C);
}
} else { //右の光センサーが黒の時
if(SENSOR_3 > THRESHOLD) { //左の光センサーが白の時
Off(OUT_C); //右に方向転換
OnFwd(OUT_A);
} else { //左の光センサーが黒の時
Off(OUT_A+OUT_C); //停止
Wait(100);
OnFwd(OUT_A+OUT_C); //前進
Wait(70); //交差点を超える
Off(OUT_A+OUT_C);
(move_count);
move_count = move_count +1; //move_countに1を足す
}
}
}
if(SENSOR_2==1){ //タッチセンサーが押されたとき
OnRev(OUT_A+OUT_C); Wait(80); //後退
Off(OUT_A+OUT_C); //停止
Wait(20);
OnFwd(OUT_C); //90°方向転換
OnRev(OUT_A);
Wait(50);
OnRev(OUT_A+OUT_C); //後退
Wait(100);
Off(OUT_A+OUT_C); Wait(400); //停止しもう一台のロボが通過するを
待つ
OnFwd(OUT_A+OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
Wait(35);
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50); //元の位置へ戻る
}
}Off(OUT_A+OUT_C); } //停止
**プログラムの工夫点 [#q44ab613]
最初はセンサーが黒を感知したら片方のタイヤをとめ、もう片方のタイヤを前転させることでカーブを曲がっていた。しかしこのプログラムだと、少しカーブが急になると曲がり切れずに脱線してしまうことがわかった。そこで、正確にカーブを曲がりきるためにタイマーを用いた。もし0.05秒以上センサーが黒を感知したら、つまり曲がり切るのに時間がかかったら、止めていたタイヤを後転させて曲がるスピードを上げた。
ロボットを二周で止めるのには変数を使用した。交差点で一時停止するように黒線を横に引いた。ロボが二つのセンサーで黒を感知、つまり黒の横線の上に着いたら、変数の値を+1して、値が8を超えると停止するように設定した。
ロボを二周で止めるのには変数を使用した。交差点で一時停止するように黒線を横に引いた。ロボが二つのセンサーで黒を感知、つまり黒の横線の上に着いたら、変数の値を+1して、値が8を超えると停止するように設定した。
二台のロボットをお互いに逆方向を向いてライントレースさせるために、もう一台のロボットをよけるプログラムを作った。
簡単なコースではうまくいったが我々のチームのコースのように交差点が集まっている複雑なコースでは成功率は低かった。
*発表を終えて [#hf93795f]
最初は何度ロボを走らせても必ず失敗していて、全く完走しなかった。しかし、コースを逆に走らせてみると、とてもすんなりと完走することができた。発表の時はうまく相手のロボをよけてくれるかが心配だったが、なんとか成功することができた。しかしその後、別のことを試しているときにロボが机から落ちて大破するという事件が起こってしまった。しかし基本的には大きなミスもなく、グループのロボが二台とも完走できたのでよかった。
発表前に何度もリハーサルしたので、発表では一発で成功した。
衝突した時の動きがあまりうまくいかなかったのが残念だった。
A8右はひとりで制作したため、バンパーを無意味なダブルバンパーのままでやるなど、少し雑になってしまった。また、プログラムももう少し工夫すればよかったと思う。
*コメントをどうぞ [#k6619f8c]
- 書くべきことをきちんと押さえていて良いと思います。 -- [[FI]] &new{2009-02-14 (土) 17:30:53};
#comment
カーブを曲がる際の工夫はとても面白いと思います。 FI