2016a/Member 目次

課題

今回の課題はライントレースをするロボットを作ること。

ミッション

黒い線に沿って動くロボットを作成する。
なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMission2&openfile=2016a-mission2.png

コース

・B地点からC地点へ(二人目)
  ◦B地点→R右折→Q直進→Q直進→P右折→S右折→C地点

ロボット本体の説明

左右二つのモーターを用いて本体の前後運動、回転運動、旋回運動を行う。

ロボチ.png

本体の前方につけた光センサーを用いてライントレースを行う。

ロボチ1.png

プログラムの説明

定義

以下はサブルーチンを作る上での基本的な定義である。

#define TURN_TIME 5
#define BLACK 42
#define WHITE 50
#define RIGHT_H OnFwd(OUT_A); OnRev(OUT_C); Wait(TURN_TIME);//右旋回
#define RIGHT_L OnFwd(OUT_A); Off(OUT_C); Wait(TURN_TIME);//右回転
#define LEFT_H OnFwd(OUT_C); OnRev(OUT_A); Wait(TURN_TIME);//左旋回
#define LEFT_L OnFwd(OUT_C); Off(OUT_A); Wait(TURN_TIME);//左回転
#define GO_FORWARD(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);
#define STEP 1

サブルーチン

黒い線上をたどるプログラムになっており、交差点で一時停止し、音が鳴る。
交差点の判断にはタイマーで、黒が0.35秒以上続いたときに判断するようにしてある。
線上をたどるうえで、線の右側をたどるようになっている。黒の時は右に、白の時は左に回転する。

sub LINE()
 {
  ClearTimer(0);
  while(FastTimer(0) < 35) {
      if (SENSOR_2 < BLACK) {
        RIGHT_L;
         } else
            if (SENSOR_2 < BLACK+2){
             RIGHT_H;                 
              }
              else if (SENSOR_2 > WHITE-2) {
              LEFT_L;
              ClearTimer(0);
               } else if (SENSOR_2 >= WHITE) {
              LEFT_H;               
              ClearTimer(0);
              } else {
             GO_FORWARD(50);
             ClearTimer(0);
             }
              Wait(STEP);
              }
              Off(OUT_AC);
              ClearTimer(0);
              PlaySound(SOUND_UP);
              Wait(100);
               }  

以下二つのサブルーチンは、交差点で傾いた機体を正しい向きに直すことと、交差点を通過するためのものである。  

 sub CROSS_RIGHT()
 {
    while(FastTimer(0) < 100) {
       RIGHT_L;
   }
    ClearTimer(0);
   }
 sub CROSS_LEFT()
 {
    while(FastTimer(0) < 160) {
        LEFT_L;
    }
    ClearTimer(0);
   }

下のサブルーチンは半円のような急な曲がり角を曲がるためのプログラムである。

 sub WHOLE()
 {
    while(FastTimer(0) < 36) {
      if(SENSOR_2 < BLACK+2){
        RIGHT_L;
         } else
             if (SENSOR_2 > WHITE-2){
            LEFT_L;
            ClearTimer(0);
             } else if (SENSOR_2 >= WHITE) {
            LEFT_H;
            ClearTimer(0);
             } else {
            GO_FORWARD(50);
            ClearTimer(0);
             }
            Wait(STEP);
             }
            Off(OUT_AC);
            ClearTimer(0);
             }

メイン

task main()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   GO_FORWARD(120);
   LINE();
   CROSS_RIGHT();
   LINE();
   WHOLE();
   LINE();
   GO_FORWARD(50);
   LINE();
   GO_FORWARD(50);
   repeat(2);{
     LINE();
     CROSS_RIGHT();
   }
   LINE();
   GO_FORWARD(50);
} 

反省点

今回はゴールに辿りつけなかった。作業スピードが遅くプログラムを修正する時間を取れなかった。なので次回以降では作業スピードをあげ、調整する時間をとれるように心がけたい。

感想

今回の課題で新たに出てきたサブルーチンに初めのうちは戸惑ったが、理解してしまえばとても便利なプログラムだと思う。サブルーチンを用いることでtask main()の中身がより簡潔になり今までと比べてコンパクトなプログラムになったと思う。少しずつではあるがプログラムにおいて出来ることが増えてきているので、次回以降の課題でも出来ることを増やしていけたらいいと思う。


添付ファイル: fileロボチ1.png 231件 [詳細] fileロボチ.png 269件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-04 (木) 23:30:08