[[2007a/MemberOnly/進行状況A]] #contents *今回の課題 [#ba820c16] 黒い線に沿って動くロボットを作成せよ。ただし、 1、速さと正確さを追求すること 2、交差点で優先側を走っていない場合には、一時停止すること 3、前方にあるもう一台のロボットに接触した場合には停止して, 相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと *作戦 [#o213de30] **課題クリアのためには? [#k263fe9d] 今回の課題のメインはライントレースです。しかし、ライントレースより厄介なのは交差点です。交差点を識別し、優先道路なら直進、違うなら一時停止しなければならないからです。この課題は、光センサーの使い方がポイントだと感じました。よって、センサーの付け方からロボットのベースを決めることにしました。 **交差点をどのようにクリアするか? [#nb90b6e9] ***センサーのつけ方 [#p24fcbb0] ライントレースするためのセンサーの取り付け方は、(僕の思いついた限り)3つあります。それぞれの長所、短所を述べたうえで、僕たちの班が選んだ取り付け方と、それを選んだ理由を説明したいと思います。 ------------------------------------------------------- &size(25){※取り付け方1}; 光センサー1つを使います。もし、センサーがライン上にあれば片方のモーターを動かし、センサーがラインを出たらそのモーターをとめ、逆のモーターを動かします。 &size(20){☆メリット}; ライントレースにおいてセンサーを1つしか使わないため、プログラムが簡単になります。 急なカーブもクリアすることができます。 &size(20){★デメリット}; 交差点が識別できません。 --------------------------------------------------------- &size(25){※取り付け方2}; 光センサー2つを使います。光センサーの間隔を2,5cm(ラインの幅)以上広げ、もし、どちらかのセンサーがライン上にきたら、モーターを調整して、もとの状態にもどすプログラムを作る。 &size(20){☆メリット}; たいていのコースをライントレースすることが可能です。コースを脱線する恐れが、ほとんどありません。 &size(20){★デメリット}; 交差点の識別が難しい。 -------------------------------------------------------- &size(25){※取り付け方3}; 光センサー2つを使います。光センサーの間隔を2,5cm(ラインの幅)以内にして、もし、どちらかのセンサーがライン外にきたら、モーターを調整して、もとの状態にもどすプログラムを作る。 &size(20){☆メリット}; 交差点を認識できます。 &size(20){★デメリット}; 急なカーブに対応できず、ラインを見失なってしまいます。 -------------------------------------------------------- ***交差点の考察・まとめ [#q3ef10b5] 僕たちの班は、光センサーを「取り付け方3」のようにしました。理由はいたって単純。交差点をちゃんと攻略できるのは、「取り付け方3」しかないからです。ライントレースにおける「カーブ」に至っては、「取り付け方1」及び「取り付け方2」に負けています。しかし、今回の課題では、1番上の2に書いたように、交差点で優先道路でない場合、一時停止しなければなりません。「取り付け方2」では、やり方によってはできますが、1番きれいに交差点を攻略できるのは「取り付け方3」です。総合してみると、1番だと思った「取り付け方3」を採用しました。 *完成したロボットの説明 [#p93eba86] *完成までの道のり [#pb39e867] **過程1(土台作り) [#r3f2c075] 左右のタイヤにそれぞれモーターを1つずつ使い、土台を支えるために3つのタイヤを使いました。光センサーはロボットの前方に、下に向けて配置しました。また、タッチセンサーも前につける必要があるので、土台は後ろに重心がくるようにしました。 **過程2(タッチセンサー) [#ba910d20] シンプルでかわいらしいタッチセンサーができました。 **過程3(試験走行) [#z3162a60] 試験走行用のプログラムを作って走らせました。しかし、以下のような問題が発生しました。 1つ目、光センサーが床に近すぎたため、ラインと、そうでない部分を判別できなかった。 2つ目、ロボットの動きが速すぎたためすぐにラインをはずれてしまった。 3つ目、プログラムのミスで、タッチセンサーが当たっても止まらないときがあった。 このような問題が発生したため、ロボットとプログラムを組みなおす必要がありました。 **過程4(組みなおし) [#jb1addc4] *プログラム [#te3dbada] define LI 43 //光の強さの境界線を定義 int s_p; //変数を用意 sub search_pro(){ //ラインを見失ったとき用のサブルーチン while ((SENSOR_1 > LI) && (SENSOR_3 > LI)){ //ラインが見つかるまで繰り返す SetPower(OUT_A+OUT_C,7); OnRev(OUT_A);OnFwd(OUT_C); 左を探す Wait(30); OnRev(OUT_C);OnFwd(OUT_A); 右を探す Wait(60); OnRev(OUT_A);OnFwd(OUT_C); ロボットの向きを元にもどす Wait(30); OnFwd(OUT_A+OUT_C); 直進する repeat(7){ //7回繰り返す Wait(10); if (SENSOR_2 == 1) //タッチセンサーにあたったら10秒とまる { Off(OUT_A+OUT_C); Wait(100); } } } } sub s_touch() //タッチセンサーにあたったとき用の命令文(サブルーチン) { SetPower(OUT_A+OUT_C,7); Off(OUT_A+OUT_C); モーターの出力をとめる Wait(100); 10秒待つ } task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2をタッチセンサーと定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3を光センサーと定義 s_p = 2 ; 変数に2を代入 while (true){ while (SENSOR_2 == 0){ //タッチセンサーが反応するまで繰り返す while ((SENSOR_1 < LI) && (SENSOR_3 < LI)) //センサー1、3共にライン上のとき { SetPower(OUT_A+OUT_C,7); OnFwd(OUT_A+OUT_C); 直進する s_p = 1; if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める { s_touch(); } } while ((SENSOR_1 < LI) && (SENSOR_3 > LI)) //センサー1がライン上、センサー3がライン外のとき { OnFwd(OUT_C); 左へ曲がる Off(OUT_A); s_p = 1; if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める { s_touch(); } } while ((SENSOR_1 > LI) && (SENSOR_3 < LI)) //センサー1がライン外、センサー3がライン上のとき { OnFwd(OUT_A); 右へ曲がる Off(OUT_C); s_p = 1; if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める { s_touch(); } } if ((SENSOR_1 > LI) && (SENSOR_3 > LI)) センサー1、3共にライン外のとき { if (s_p == 1){ //このパターンが交差点です SetPower(OUT_A+OUT_C,7); Off(OUT_A+OUT_C); いったん止まる OnRev(OUT_A+OUT_C); Wait(10); すこし下がる Off(OUT_A+OUT_C); 一時停止する Wait(10); OnFwd(OUT_A+OUT_C); 交差点を横切る repeat(9){ Wait(10); s_p = 2; if (SENSOR_2 == 1) タッチセンサーが反応したら、ロボットを止める { s_touch(); } } }else{ //コースを見失ったとき SetPower(OUT_A+OUT_C,7); search_pro(); サブルーチンのサーチプログラムを作動させる } } } } } *工夫したところ [#x3d600ce] *苦労したところ [#w5d32ca7] *感想(制作を終えて) [#k715fb0d] *コメントをどうぞ [#yc269d1d] #comment