#contents *課題2 [#w78e3196] 課題2では黒い線に沿って動くロボットを作り、そして一つの周回コースを2台のロボットが逆向きに走行することを想定して次の2種類のプログラムを作成しました。 -相手のロボットに接触したら反転して進む。 -相手のロボットに接触したらそのロボットを右側から避けて通り、再びライン上に戻って進む。 *完成までの道のり [#r9134df3] この課題をクリアするために最初に考えたことは、 -ロボットについて -プログラムについて -コースについて (あたりまえですが)この3つです。これから、それぞれについて順を追って説明していこうと思います。 **ロボットについて [#be810e40] まずロボットについてです。 最初に目指したロボットの理想形は、小回りが利いてどんな急カーブもスムーズに曲がることができるロボットでした。 そのためロボットを小型化して、さらに移動速度を適度に落とそうとしました。しかし!一言で小型化といっても思ったよりも簡単ではありませんでした。モーター自体が結構な大きさで小さくするには限界がありました。それに加えて速度も落とそうと思うとどうしても前輪と後輪とモーターの間にギアを入れなければならないため、全長が長くなってしまうのです。つまり相反することをしようとしていました。 そして今回は、全体的に前回の反省を生かして、「ロボットの強度」を意識しました。小型化しつつ、速度を落とし、かつ強度を保つことはさらに難しく、すべてを満たしたロボットを作ることを断念・・・。 考えた結果、基本の形(パーツ)を組み合わせることで強度を保つことだけにポイントを絞って作りました。そのためオリジナリティには欠けるかもしれませんが、安定感がぐっと増してその後の作業をスムーズにすすめられました。 各パーツについて… -足の部分はタイヤです。キャタピラに比べ、よりスムーズな回転と移動ができると考えたためです。 -光センサーは本体の前方に取り付けました。2つのセンサーを線の外側をはさむようにして取り付けました。つまり常にセンサーが白い部分を通るようにして進んでいきます。本体から遠すぎず近すぎず、適当な位置に取り付けることができたと思います。 -タッチセンサーは本体の前方、光センサーの真上にを取り付けました。ダブルバンパーです。タッチセンサーについては、前方になければ役目を果たさないので自然にこの位置に。 **プログラムについて [#m0924035] 一番苦労したのは、やはりコース復帰時のプログラムです。その苦労したプログラムを見てください! -接触したら反転して進むプログラム↓ #define line_black 40 //線を判断する基準の明るさを定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1に光センサーをセット SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2にタッチセンサーをセット SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3に光センサーをセット while(true) //以下の動作を繰り返す { while(SENSOR_2==0) //センサー2が押されていない間以下の動作を繰り返す { if((SENSOR_1>line_black) && (SENSOR_3>line_black)) {OnFwd(OUT_A+OUT_C);} //センサー1とセンサー3が両方とも白い部分の上になったら直進 if(SENSOR_3<line_black) {OnFwd(OUT_A);Off(OUT_C);} //センサー3が黒い線上になったら右に曲がりながら進む if(SENSOR_1<line_black) {OnFwd(OUT_C);Off(OUT_A);} //センサー1が黒い線上になったら左に曲がりながら進む } OnFwd(OUT_A); OnRev(OUT_C); //センサー2が押されたら右回りに回転する until(SENSOR_3<line_black); {OnFwd(OUT_A);Off(OUT_C);} //センサー3が黒い線上になったら右に曲がりながら進んでコースに復帰 } } -接触したらそのロボットを右側から避けて通り、再びライン上に戻って進むプログラム↓ #define line_black 40 //線を判断する基準の明るさを定義 #define turn_time 60 //回転の時間を定義 sub linetracing() //ライントレースの動作を定義 { if((SENSOR_1>line_black) && (SENSOR_3>line_black)) { OnFwd(OUT_A+OUT_C); } //センサー1とセンサー3が両方とも白い部分の上になったら直進 if(SENSOR_1<line_black){ OnFwd(OUT_C); Off(OUT_A); } //センサー1が黒い線上になったら左に曲がりながら進む if(SENSOR_3<line_black){ OnFwd(OUT_A); Off(OUT_C); } //センサー3が黒い線上になったら右に曲がりながら進む } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1に光センサーをセット SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2にタッチセンサーをセット SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3に光センサーをセット while(true) //以下の内容を繰り返し続ける { while(SENSOR_2 == 0) //センサー2が押されていない間ライントレースを続ける { linetracing();} OnRev(OUT_A+OUT_C); Wait(20); //そのまま避けようとしてもぶつかるので、少し後進 OnFwd(OUT_A); Wait(turn_time); //右回りに回転 OnFwd(OUT_C); Wait(100); //Cも正回転させ前進 OnRev(OUT_A); Wait(turn_time); //左回りに回転 OnFwd(OUT_A); //Aも正回転させ前進 until(SENSOR_3<line_black); { OnFwd(OUT_A); Off(OUT_C);} //センサー3が黒い線上になったら右に曲がりながら進んでコースに復帰 } } **コースについて [#p6224e7e] はじめに作ったコースは急すぎるカーブがいくつもあり曲がりきれなかったので全体的に緩やかなカーブへ改良しました。 *苦労した点と工夫した点 [#gdf6dbc4] これまで書いた中にもありますが、 -苦労した点 +ロボットの小型化して、さらに移動速度を適度に落とすこと +光センサーの位置 +コース復帰時のプログラム 1は実現できませんでした。 2はセンサーが本体から離れすぎているとセンサーの回転半径が大きくなってしまってうまく曲がれず、逆に近すぎるとセンサーがカーブを感知した時点ではもうタイヤがその付近にあるため回転半径が小さくてもうまく曲がれないので、適度な距離を見つけるのに苦労しました。最終的にバンパーの下に取り付けるのがちょうど良く、うまくいきました。 3は光センサーを2つ付けたことによる苦労がありました。右回りで反転する場合、コースに復帰するには左側のセンサーがラインを感知するまで回転させればいいと思っていました。でもそれではロボットに接触した時点で線をまたいでいるので、反転することなくそのまま前進してしまうということがわかりました。それを改善するために右回転で右側のセンサーがラインを感知するまで回転させました。そしてそのままではラインを二つのセンサーが挟んでいないので、そこから左のモーターだけを回してコースに戻しました。 右に避けて復帰する場合は特に難しくなく、戻ってくるときにあまりにも急な角度にならないように気をつけるだけで、あとは右側のセンサーが感知するまで進ませました。 -工夫した点 --基本のパーツを組み合わせてシンプルで強度のあるロボットを作りました。 --光センサーの位置。 --コース復帰時のプログラム。 --光センサーを2つ、線の外側に配置した。 *コメントをどうぞ [#h5b841ea] コメントはこちらへ↓ -いきなり小型で速くて丈夫で・・・なんて贅沢で無謀です&worried; まずは課題の目的を達成してから徐々に改善しましょう。 -- [[まいける(TA)]] &new{2006-12-07 (木) 22:22:19}; #comment