#contents
*ロボットの説明 [#xefd4b91]
**ロボット全体 [#s0fe2ba3]

ベースはそのまま使用し、前方の光センサーを少しタイヤ近づけました。
#ref(2016a/Member/kurokouchi/Mission2/01.jpg,100%,01)

**ロボットの改良 [#qfc487e6]

ロボットの後ろタイヤを外し、カーブを曲がりやすくしました。
#ref(2016a/Member/kurokouchi/Mission2/03.jpg,100%,01)

カーブを曲がりやすくしたことで短い区間でも機体の姿勢を戻すことが出来る様になりました。

#ref(2016a/Member/kurokouchi/Mission2/04.jpg,100%,01)

しかし、機体が左右に細かく動くためタイヤが外れやすくなりました。また、交差点をカーブとして認識することが多いことなど安定性があまりないため上の機体の状態に戻しました。

*プログラムの説明 [#o7f33ffa]

**ライントレース [#a6417992]
線の左側境界部分をトレースするプログラムです。
 
  if(SENSOR_2 > 52) //白部分 右回転
  {
  ClearTimer(0);
  SetPower(OUT_AC,2); //回転しすぎないように力を弱めに設定する
  OnFwd(OUT_A);
  OnRev(OUT_C);
  }
  else if(SENSOR_2 > 50) //弱白部分 右旋回
  {
  ClearTimer(0);
  SetPower(OUT_AC,2); //旋回しすぎないように力を弱めに設定する
  OnFwd(OUT_A);
  Off(OUT_C);
  }
  else if(SENSOR_2 > 42) //境界部分 直進
  {
  ClearTimer(0);
  SetPower(OUT_AC,4); 
  OnFwd(OUT_A);
  OnFwd(OUT_C);
  }
  else if(SENSOR_2 >38 ) //弱黒部分 左旋回
  {
  ClearTimer(0);
  SetPower(OUT_AC,2); //旋回しすぎないように力を弱めに設定する
  OnFwd(OUT_C);;
  Off(OUT_A);
  }
  else{ //黒部分 左回転
  SetPower(OUT_AC,2); //回転しすぎないように力を弱めに設定する
  OnRev(OUT_A);
  OnFwd(OUT_C);
  }


**交差点の判別 [#m4335358]

交差点は黒い部分が長く続いた時に交差点として判別するようにした。そこでタイマーを使い黒い部分以外の時はタイマーを初期化するようにした。
  ClearTimer(0);

タイマーが30より多くカウントした時に交差点として判別する。

  if(FastTimer(0)>30)

またカーブでの誤作動を防ぐためにタイマーをもう一つ追加して次の交差点までのおおよその秒数をカウントしなければ交差点と判別しないようにしました。
"l_time"はグローバル変数で、秒数を指定できるようにした。

  if(FastTimer(0)>30&&FastTimer(1)>l_time)

**判別後の処理 [#pffb2821]

前進
 sub top(){
    Off(OUT_AC); //停止
    PlaySound(SOUND_UP);  //交差点判別音
    Wait(100);  //1秒間待つ
    OnRev(OUT_C);
    OnFwd(OUT_A);
    Wait(40);
    OnFwd(OUT_AC);
    Wait(10);
 ClearTimer(0); //交差点判別用タイマー初期化
 ClearTimer(1); //次の交差点までのタイマー初期化
 }

左折
 sub left(){
    Off(OUT_AC); //停止
    PlaySound(SOUND_UP);  //交差点判別音
    Wait(100);  //1秒間待つ
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(20);
 ClearTimer(0); //交差点判別用タイマー初期化
 ClearTimer(1); //次の交差点までのタイマー初期化
 }

右折
 sub right(){
    Off(OUT_AC); //停止
    PlaySound(SOUND_UP);  //交差点判別音
    Wait(100);  //1秒間待つ
    OnRev(OUT_C);
    OnFwd(OUT_A);
    Wait(80);
 ClearTimer(0); //交差点判別用タイマー初期化
 ClearTimer(1); //次の交差点までのタイマー初期化
 }

**特別な交差点の判別 [#u883c8f5]

#ref(2016a/Member/kurokouchi/Mission2/06.png,100%,01)

上の様な交差点判別するにはロボットの姿勢をすぐに戻さなければいけないが、機体の性能上判別が困難なため以下のプログラムを追加した。

 sub line_r(){
 int ch=0;
 ClearTimer(0);
 ClearTimer(1);
   while(ch==0)
   {
   if(SENSOR_2 > 52)
   {
     ClearTimer(0);
     SetPower(OUT_AC,2);
     OnFwd(OUT_C);
     OnRev(OUT_A);
   }
   else if(SENSOR_2 > 50)
   {
   .
   .
   .
   .
 }

これによってひとつ前の交差点から左側をトレースしていたものを右側をトレースさせるようにした。

**最後の交差点の判別 [#jc9ff40f]
ゴール地点の四角の中に入るために、最後の交差点を判別したら以下の処理を実行する。

 sub last(){
    Off(OUT_AC); //停止
    PlaySound(SOUND_UP);  //交差点判別音
    Wait(100);  //1秒間待つ
    OnRev(OUT_C); //姿勢をまっすぐにする
    OnFwd(OUT_A);
    Wait(40);
    OnFwd(OUT_AC); //前進
    Wait(200); //2秒間待つ
    Off(OUT_AC); //停止 
 ClearTimer(0); //交差点判別用タイマー初期化 
 ClearTimer(1); //次の交差点までのタイマー初期化
 }

**メインプログラム [#d9c9b7dd]

 task main ()
 {
 
   SetSensor(SENSOR_2, SENSOR_LIGHT);
 
   l_time=300; //次の交差点までの秒数を3秒に設定
   line_l(); //左側境界部分をトレース
   left(); //S地点を左折
   line_l(); 
   left(); //P地点を左折
   line_l(); 
   top(); //Q地点を直進
   l_time=700; //次の交差点までの秒数を7秒に設定
   line_l();
   top(); //Q地点を直進
   l_time=300; //次の交差点までの秒数を3秒に設定
   line_l();
   right(); //R地点を右折
   line_r(); //右側境界部分をトレース
   left(); //P地点を左折
   l_time=700; //次の交差点までの秒数を7秒に設定
   line_l();
   last();
 
 }


*課題結果 [#p077b3a2]

課題コースはC地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点のコースです。
#ref(2016a/Member/kurokouchi/Mission2/05.png,100%,01)

C地点からA地点までのタイムは1分10秒でした。

*反省・感想 [#qd4c5222]
ロボット本体にもう少し工夫した方が良かったと思いました。次回の課題ではプログラムだけではなくロボットにも工夫したいです。
今回の課題では到達率がほぼ10割で、安定性のあるプログラムが書けました。しかし、到達タイムが1分切れなかったことが残念でした。

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