*課題2 [#q9f9cf6a]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
**コース [#sd0456bc]
#ref(2019a/Member/aoto/Mission2/course2019a.png,100%,robot)
黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールには、長さ15または16のブロックおく。
**ミッション [#b86789f7]
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
*ロボット [#p655b343]
#ref(2019a/Member/aoto/Mission2/robot.jpg,50%,robot)

光センサーをタイヤの間に取り付けた
#ref(2019a/Member/aoto/Mission2/robot2.jpg,50%,robot2)

ボールを運ぶ部分は3つ目のモーターを使うことでより安定してボールを運ぶ機構を作ることができると考えられるが、私たちは簡易的なアームにすべてを託した。
*プログラム [#ma223713]
**定義 [#offa0f4f]
右折、左折、右旋回、左旋回、そして直進を定義した。
 #define migi0 OnFwd(OUT_C,25);Off(OUT_B);        //左折
 #define hidari0 OnFwd(OUT_B,25);Off(OUT_C);      //右折
 #define migi1 OnFwd(OUT_C,30);OnRev(OUT_B,30);   //左旋回
 #define hidari1 OnFwd(OUT_B,30);OnRev(OUT_C,30); //右旋回
 #define tyokusinn OnFwd(OUT_BC,30);              //直進

光センサーの値を測定したところ
-黒26
-黒灰35
-白灰45
-白52

という結果になった。以後この値をもとにプログラムを作成した。
**交差点で停止するライントレースプログラム [#o8f0c9c9]
交差点で停止させるには黒にいる時間が一定時間を超えると、ライントレースを止めるプログラムを作る必要がある。

 void line_trace()   
 {
     SetSensorLight(S3);
     long t0;                     //long型でt0を定義
     t0=CurrentTick();            //t0に現在の時間を代入
     while(CurrentTick()-t0<100){ //今からt0になるまで0.1秒経つまでの間プログラムを行う
         if(SENSOR_3>50){         //明るさ51以上だと判断した際はその場で右旋回
             migi1;
             t0=CurrentTick();    //t0を更新
         }else if(SENSOR_3>43){   //明るさ44〜50だと判断した際は右に曲がる
             migi0;
             t0=CurrentTick();    //t0を更新
         }else if(SENSOR_3>38){   //明るさ39〜43だと判断した際は直進
             tyokusinn;
             t0=CurrentTick();    //t0を更新
         }else if(SENSOR_3>30){   //明るさ31〜38だと判断した際は左に曲がる
             hidari0;
             t0=CurrentTick();    //t0を更新     
         }else{
             hidari1;             //明るさ30以下だと判断した際はその場で左旋回
         }   
     }
 }

このプログラムは黒以外の値をとるとt0を更新し続けるため、交差点のような長いあいだ黒の値を取る地点で停止をし、それ以外はライントレースを行うようになっている。

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