*課題について [#a4c9d99a]
#ref(課題.png)
次の経路を黒い線にそって動くロボットを作成する。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。

B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点

*ロボットについて [#e2ca7413]
#ref(KIMG0030.JPG)

#ref(KIMG0032.JPG)

できるだけ光センサーとタイヤとの距離を近くして、誤差が生じにくくした。
また部品も最小限の量に抑え、軽量化した。

*プログラムについて [#zcee2141]
**サブルーチン [#he76347d]
***交差点直進 [#w0577773]
 sub go()
 {
 Off(OUT_AC); //停止  
 Wait(100);   //10秒間  
 OnFwd(OUT_AC);  //前進
 Wait(10);  //1秒間    
 ClearTimer(0); //タイマークリア
 }
***交差点左折 [#nd714e68]
 sub turnL()
 {
 Off(OUT_AC);  //停止
 Wait(100); //10秒間   
 OnRev(OUT_A);
 OnFwd(OUT_C); //左旋回
 Wait(75); //7.5秒間   
 ClearTimer(0); //タイマークリア
 }
***交差点右折 [#jbe825d0]
 sub turnR()
 {
 Off(OUT_AC); //停止 
 Wait(100); //10秒間    
 OnRev(OUT_C);
 OnFwd(OUT_A); //右旋回
 Wait(75); //7.5秒間       
 ClearTimer(0); //タイマークリア
 }
***ゴール枠に入る [#oad06b9c]
 sub goal()
 {
 Off(OUT_AC);  //停止 
 Wait(100); //10秒間
 OnFwd(OUT_AC); //前進
 Wait(10); //1秒間
 Off(OUT_AC); //停止
 ClearTimer(0); //タイマークリア
 }
**メインプログラム [#p2cc42f1]
 task main()
 {
 

  while(FastTimer(0)>300) //3秒以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 turnR(); //右旋回

  while(FastTimer(0)>1100) //11秒以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 go(); //直進

  while(FastTimer(0)>1300) //13秒以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 go(); //直進

  while(FastTimer(0)>700) //7以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 turnR(); //右旋回

  while(FastTimer(0)>1100) //11秒以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 turnR(); //右旋回

  while(FastTimer(0)>1100) //11秒以上になったら
   {
     if(SENSOR_2>45) //かなり白かったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_C);
        OnRev(OUT_A); //右へ 
      }
     else if(SENSOR_2>38) //間だったら
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_AC); //前進
      }
     else
      {
        SetPower(OUT_AC,2); //2の速度で
        OnFwd(OUT_A);
        OnRev(OUT_C); //左へ
      }
   }

 goal(); //ゴール

 }

**交差点の判別について [#bada25f3]
交差点から交差点の間の直線をライントレースするのにかかる時間をそれぞれ測り、その時間だけ経ったら交差点に到達したものと認めるようにした。

*結果 [#ffbcae7a]
この課題の提出期限の日の時点で上記のプログラムをロボットに送信することができなかった。文法上のミスがあることは確かであったが、自分の理解度が低いせいかそれを発見することはできなかった。
この課題の提出期限の日の時点で上記のプログラムをロボットに送信することができなかった。文法上のミスがあることは確かであったが、

自分の理解度が低いせいかそれを発見することはできなかった。

しかしその後、先生のご指摘を頂いたおかげでなんとかロボットにプログラムを送信することができた。

*問題点 [#bcb637f1]
・自分の理解度の低さ故か、自力で文法上のミスを発見できなかった。

・ライントレースが非常にぎこちない動きだった。

*思い通りに行かないと思われる原因 [#m66b15c0]
交差点から交差点の間の直線をライントレースするのにかかる時間をそれぞれ測り、その時間だけ経ったら交差点に到達したものと認めるようにしたが、

ライントレースがスムーズに進んだり進まなかったりする可能性が有り、必ずしもその時間に交差点に到達するとは限らない状態にある。

また、「while(FastTimer(0)>300)」の部分だが、これでは3秒経ってからループが開始されることになるので、

3秒間ライントレースをすることはできなく、このままではロボットが動き始めたら3秒後にライトレースが始まって、それを永遠に来る返す形になってしまう。

そして、ライントレースも白かったら右へ、黒かったら左へというように、左側の境界線を走るときの使用になってるため、

たとえ時間通りに交差点まで到達し曲がれたとしても、曲がりきった時の光センサーの場所が左側ではなく、右側の境界線であるとライントレースができなくなり、

ロボットが永遠に旋回したり、どっかに行ってしまうことになる。

最後に、このプログラムは全体的に見ると、少しでもロボットの動きがずれると取り返しのつかない状態になってしまうことが分かった。


*感想・反省 [#nef535c3]
タイマー・サブルーチン・if文など様々なプログラミングの文法に関して理解に乏しいどころか、上手く使いこなすことができなかった。

思った以上にセンサーの値などの微調節がとても時間がかかったり、些細なプログラムミスを見つけられず期限内に終わらせることはできなかった。

最終的には先生のご指摘のおかげで、ロボット本体を動かすことはできなかったものの、プログラムの送信まではすることができたので良かった。

次の課題ではできるだけ文法を理解し、そして上手く使いこなせるように努力していきたい。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS