*目次 [#cdeb80d5]
#contents

*課題 [#e2ed52bc]
risを使い光センサーによりライントレースを行う。

コースは模造紙にマジックペンで以下のように描いて作る。

&ref(2016a-mission2.png);

私がロボットを走らせるコースは

A地点からB地点へ 

    A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点

である

*本体について [#x624b260]
&ref(attachment00(3).jpg);

課題1のときから大きく構造は変えていないがいくつか工夫はした。まずはタイヤである。2つ取り外し、スムーズに移動できるようになった。

&ref(attachment01(2).jpg);

ふたつ目は光センサーの取り付け位置である。遠すぎると、少しの小回りで大きく動いてしまうため誤動作が多かった。そのため最初はなるべく本体に近づけて固定しようと工夫した。課題1のときはあったでっぱりを取り外しそこにセンサーを取り付けた。すると誤動作は少なくなったが今度は微調整が増え、なかなか進まなくなった、そこで「多少は離さないとセンサーが動かなすぎて進んでいかない」という先生の助言に従い適度に本体から離してみたところ、大幅にスピードアップできた。

*プログラミング [#n4da8cb7]
**定義 [#w84e84e0]

初めに以下の定義をした

#define turn_left Off(OUT_A); OnFwd(OUT_C);//左折

#define turn_leftS OnRev(OUT_A); OnFwd(OUT_C); //左旋回

#define turn_right OnFwd(OUT_A); Off(OUT_C);//右折

#define turn_rightS OnFwd(OUT_A); OnRev(OUT_C);//右旋回

#define go_forward OnFwd(OUT_AC);//直進
**サブルーチン [#ed4b7539]
メインのタスクを簡単にするためにいくつかサブルーチンを作った
***ラインを辿るために [#c1b860ce]
私たちの班は、黒線と白い部分の境目をトレースするという方法をとった。
境目の明るさを測り。それよりも明るくなったら黒線の方へ、暗くなったら白い方へ微調整し、進んで行く。

これがそのサブルーチンである
 sub line_follow()
 {
      ClearTimer(0);   // まずはタイマーをリセットする(理由は後述)
      while(FastTimer(0)<25)//whileのカッコで囲まれた動作は
       {          //タイマーが一定の時間を超えるまで行われる
               if(SENSOR_2<45){//もし、センサーがラインの境目よりはるかに暗いと判断した時
                  turn_leftS;// 左旋回→これが交差点判別に使われる(後述)
                 }
               else if(SENSOR_2<47){//もし、センサーがラインの境目より少し暗いと判断した時
                  turn_left;//  左折
                  ClearTimer(0);//タイマーをリセットする
		 }
		 else if(SENSOR_2<54){//もし、センサーがラインの境目の明るさだと判断した時
	           go_forward;    //直進
		    ClearTimer(0);//タイマーをリセットする
		 }
	 	 else if(SENSOR_2<57){//もし、センサーがラインの境目より少し明るいと判断した時
		    turn_right;     //右折
		    ClearTimer(0);//タイマーをリセットする
                 }
		 else {   //もし、センサーがラインの境目よりかなり明るいと判断した時 
                  turn_rightS;  //右旋回
		    ClearTimer(0);//
                 }
       }
      Off(OUT_AC);//whileの範囲を超えたら電源が落ちる
             
 }

ラインの左側をトレースしたため暗くなったら左折、明るくなったら右折をすればよい。

どこからが明るく、どこからが暗いのか具体的な値を決めるために、試行錯誤を繰り返した。

***交差点を認識するために [#xf892129]
私達の班では、交差点では比較的長く左折してもセンサーが明るく反応しなくなると考えた

そこでタイマーを用い、一定時間左旋回(交差点はかなり暗いため)をしたら交差点と認識するようにプログラミングした、そのため上のサブルーチンを見れば分かる通り、左旋回以外の動作をしたあとにはタイマーをリセットしている。左旋回が連続して長く続くとタイマーの数字が増え、一定の値を超えたら停止するようにした。

***交差点を超える [#b97abbf4]
交差点上ではライントレースができないそのため以下のサブルーチンを作った
 sub go_forwardS()//交差点を直進
 {
      turn_rightS;//右旋回(僅かに左に傾いているため)
      Wait(10);  
      go_forward;//直進
      Wait(30);
      
 }

 sub turn_leftSS()//交差点を左折
 {      
      while(SENSOR_2<47)//明るくなるまで左折
       {
         turn_leftS;
       }
 }
      

**task main [#w6b00b69]
いよいよメインの動作についてだ

 task main()
 {
      SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーをセット
      line_follow();                    //AP間のラインを辿る
      PlaySound(SOUND_LOW_BEEP);        //交差点を認識したらサウンドを鳴らす
      Wait(100);                        //交差点では一秒停止
      PlaySound(SOUND_CLICK);           //出発前にもう一回サウンドを鳴らす
      go_forwardS();                    //交差点を直進
      line_follow();                    //PQ間のラインを辿る
      PlaySound(SOUND_LOW_BEEP);        //交差点を認識したらサウンドを鳴らす
      Wait(100);                        //交差点では一秒停止
      PlaySound(SOUND_CLICK);           //出発前にもう一回サウンドを鳴らす
      go_forwardS();                    //交差点を直進
      line_follow();                    //QQ間のラインを辿る
      PlaySound(SOUND_LOW_BEEP);        //交差点を認識したらサウンドを鳴らす
      Wait(100);                        //交差点では一秒停止
      PlaySound(SOUND_CLICK);           //出発前にもう一回サウンドを鳴らす
      go_forwardS();                    //交差点を直進
      line_follow();                    //QR間のラインを辿る
      PlaySound(SOUND_LOW_BEEP);        //交差点を認識したらサウンドを鳴らす
      Wait(100);                        //交差点では一秒停止
      PlaySound(SOUND_CLICK);           //出発前にもう一回サウンドを鳴らす
      turn_leftSS();                    //交差点を左折
      line_follow();                    //RB間のラインを辿る
      go_forward;                       //最後の枠を超える
      Wait(100);
      Off(OUT_AC);                      //停止
      PlaySound(SOUND_UP) ;             //クリア時のサウンド。所要時間41秒

 }

サブルーチンのおかげでかなり簡略化されている。が、サウンド→停止→サウンドがセットの動作になっているので、これも交差点での動作としてサブルーチンを作れば更にtask mainを短くできたのではないかと今更思った。

*まとめ [#k2c8a417]
きちんとゴールまでたどり着くことができた。

センサーの位置でスピードが劇的に変わったので驚いた。

ただしまれに誤動作をおこし、ゴールにたどりつけないこともあった。10回に1回程度なのでなかなk原因を探れず改善に至れなかったのが心残りだ。そして課題1のときと同じくロボットの脆さも問題だ。
しかし課題1のときよりも楽しんで取り組めたと思う。

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