[[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

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS