目次

課題

下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
2016a-mission2.png

ミッション

次の経路を黒い線にそって動くロボットを作成する。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。

  • B地点からC地点へ
    B地点→R右折→Q直進→Q直進→P右折→S右折→C地点

機体の改善

機体表.jpg機体裏.jpg
前回の機体は大きなタイヤと小さなタイヤを2つずつ付けていたが、このままでは小回りがきかないと考えた。そこで、大きいタイヤを外し、機体の底に回転する半球状のパーツを付けることによって動きやすくすることができた。

プログラム

機体の動かし方について

今回は、線の境界を辿って進むようにプログラミングした。下図のように機体が線の右側をトレースする。トレース方法.png

プログラムの内容について

まず定義を述べる。

#define ONLINE 29//センサーが黒線上にある時間
#define THRESHOLD 45//白黒中間の値
#define HIPOWER 6
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);//AとCのモーターを早めに動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER);//AとCのモーターを遅めに動かす
#define turn_left1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define turn_left2 set_power_L;OnFwd(OUT_C); Off(OUT_A);//左回転
#define turn_right2 set_power_L;OnFwd(OUT_A); Off(OUT_C);//右回転
#define turn_right1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define go_forward set_power_H; OnFwd(OUT_AC);//直進

次にサブルーチンを定める。

sub line_follow()//ライントレースするサブルーチン
{
  SetSensor(SENSOR_2, SENSOR_LIGHT);//光センサーを用いる

  ClearTimer(0);//タイマーを用いる

 
int ch=0;//変数を宣言する
  while(ch==0){    //変数が0の間実行する
    if(SENSOR_2 < THRESHOLD-7) {
      turn_right1;    //センサーが黒線上にいたら右旋回する
    } else if (SENSOR_2 < THRESHOLD-5) {
      ClearTimer(0);
      turn_right2;    //センサーが黒に寄った境界上にいたらタイマーをリセットして右回転する
    } else if (SENSOR_2 < THRESHOLD+4) {
      ClearTimer(0);
      go_forward;    //センサーが境界上にいたらタイマーをリセットして直進する
    } else if (SENSOR_2 < THRESHOLD+6) {
      ClearTimer(0);
      turn_left2;    //センサーが白に寄った境界上にいたらタイマーをリセットして左回転する
    } else {
      ClearTimer(0);
      turn_left1;    //センサーが白紙上にいたらタイマーをリセットして左旋回する
    }
    if(FastTimer(0) > ONLINE) {    //もしタイマーのカウントが0.29秒を超えたら(交差点と判断したら)実行する
      Off(OUT_AC);
      PlaySound(SOUND_DOUBLE_BEEP);//音を鳴らす
      Wait(100);//一秒間停止
      ClearTimer(0);//タイマーをリセットする
      ch=1;//変数を1にする
    }
    Wait(1);
    }
}

この時宣言した変数はライントレースと交差点を認識した時の動作の切り替えの役目を持っている。交差点を認識した時に変数を1にすることでwhile(ch==0)から抜け出し、次の動作へ移る。 その時の動作は以下のサブルーチン2つである。

sub cross_turn()//右折するサブルーチン
{
    OnFwd(OUT_A);OnRev(OUT_C);
    Wait(60);
    Off(OUT_AC);
}
sub cross_forward()//直進するサブルーチン
{
    OnFwd(OUT_AC);Wait(70);OnFwd(OUT_C);Wait(20);
    Off(OUT_AC);
}

最後にタスクを示す。

task main()
{
    line_follow();
    cross_turn();//1つ目の交差点
    line_follow();
    cross_forward();//2つ目の交差点
    line_follow();
    cross_forward();//3つ目の交差点
    line_follow();
    cross_turn();//4つ目の交差点
    line_follow();
    cross_turn();//5つ目の交差点
    line_follow();
    OnFwd(OUT_C);
    OnRev(OUT_A);//旋回して機体の向きを調整する
    Wait(25);
    Off(OUT_AC);
    OnFwd(OUT_AC);//前進して機体の位置を調整する
    Wait(250);
    Off(OUT_AC);
}

結果と反省

  • ライントレースは意外と上手く動き、BからCまで行くのに53.4秒という好記録を出した。プログラムも前回の反省を活かしてスマートにすることができた。特に、サブルーチンを活用できたと思う。交差点もきちんと認識できていた。
  • 反省点としては、線の右側をトレースすることで円の内側を走ることとなり、誤作動が時々起こってしまったことが挙げられる。しかし、部品を取り替えてスムーズに動くようにしたので、誤作動の回数はとても少なくなった。今回は悪いところを改良していくことができ、その結果好タイムを出せたのではないかと考えている。

添付ファイル: fileトレース方法.png 134件 [詳細] file2016a-mission2.png 146件 [詳細] file機体裏.jpg 139件 [詳細] file機体表.jpg 141件 [詳細]

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