2016a/Member

・目次

課題

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

コース図

http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2 (参照)

ミッション

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

•A地点からB地点へ (一人目) ◦A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点

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

•C地点からA地点へ (三人目) ◦C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

私は、B地点からC地点のルートを担当した。

メンバー

tom・funatsu・tatsuya

ロボットの説明

私達は、NXTと言う種類のロボットを使用した。

IMG_2677.JPG
IMG_2679.JPG

<センサー部分>

IMG_2678.JPG

プログラム

・定義

#define BLACK 43 //黒色の定義
#define WHITE 54 //白色の定義
#define SPEED1 19
#define go_forward OnFwd(OUT_BC,SPEED1); //前進
#define turn_left(t,w1,w2) OnFwd(OUT_B,w1); OnRev(OUT_C,w2); Wait(t);Off(OUT_BC);
#define turn_left1 OnFwd(OUT_B,SPEED1);Off(OUT_C); //
#define turn_left2 OnFwd(OUT_B,SPEED1);OnRev(OUT_C,SPEED1); //
#define turn_right(t,w1,w2) OnFwd(OUT_C,w1); OnRev(OUT_A,w2); Wait(t);Off(OUT_BC);
#define turn_right1 Off(OUT_B);OnFwd(OUT_C,SPEED1); //
#define turn_right2 OnRev(OUT_B,SPEED1);OnFwd(OUT_C,SPEED1); //
#define short_break Off(OUT_BC);Wait(1000);PlaySound(SOUND_UP); //1秒止まって音を鳴らす
#define cross_line go_forward;Wait(200);Off(OUT_BC);Wait(1000); //交差点を渡る
#define nMAX 350 カーブとみなせる回数の最大値

,和腓く曲がる △肋さく曲がる

今回はこの定義を使った。

・サブルーチン

void line_trace()//黒い線上に沿って走る
{
SetSensorLight(S1);
int nOnline=0;
    while (nOnline < nMAX ) { ////黒がnMAX回続かない限り線の左端をトレースする
    if (SENSOR_1 < BLACK-5) {       
      turn_right2; 
      nOnline++;  //カウンタを増やす                  
    } else {
    if (SENSOR_1 < BLACK) {
    turn_right1;
    } else if (SENSOR_1 < WHITE) { 
      go_forward;
    } else if (SENSOR_1 < WHITE+5) { 
      turn_left1;               
    } else {                         
      turn_left2;                   
    }
    nOnline=0; //カウンタを0にする
    }
    Wait(STEP);
   }
   short_break;
   nOnline=0; //カウンタを0にする
Off(OUT_BC);
}
void line_closs()//機体の向きを調整する
{
	cross_line;
	SetSensorLight(S1);
	do{
	if (SENSOR_1 < BLACK) {       
      turn_right1;                    
	} else if (SENSOR_1 > WHITE) {
	turn_left2;
	}
	}
      while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
      Off(OUT_BC);
}

光センサーが黒をnMAX(350)回以上連続で判断すると交差点とみなし停止する。

void line_right()//交差点で右に曲がる
{
	cross_line;
	turn_right(1000,40,40);
	SetSensorLight(S1);
	do{ //線の左端を探す
	if (SENSOR_1 < BLACK) {       
      turn_right1;                    
	} else if (SENSOR_1 > WHITE) {
	turn_left2;
	}
	}
      while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
      Off(OUT_BC);
}

交差点を渡り切った後、次のライントレースのためにロボットの向きを調節するプログラム。

void line_left()交差点で左に曲がる
{
	cross_line;
	turn_left(1000,40,40) //左に曲がる
	SetSensorLight(S1);
	do{ //線の左端を探す
	if (SENSOR_1 < BLACK) {       
      turn_right1;                    
	} else if (SENSOR_1 > WHITE) {
	turn_left2;
	}
	}
      while((SENSOR_1 > BLACK)&&(SENSOR_1 < WHITE));
      Off(OUT_BC);
}

void line_clossの左折版。

void last_move()C地点にゴールする。
{
	go_forward;
	Wait(1500);
	Off(OUT_BC);
}

ゴールしたら、音を鳴らす。

・メインプログラム

task main()
{
	line_trace();
      line_right();
	line_trace();
	line_closs();
	line_trace();
	line_closs();
	line_trace();
	line_right();
	line_trace();
	line_right();
      line_trace();
      last_move();
}

サブルーチンを使用してB地点からC地点へ向かうプログラム。

反省点

スタートからゴールするまで4分3秒と時間がかかった。 ゴール地点と認識しないことが多かった。

感想

電池の残量によってモーターの出力が変わってしまうことが多々あった。 その度に、プログラムを変更し、調整するのには苦労した。 今度は、センサーによるコース認識の感度を上げ、より確実なものにしたい。


添付ファイル: fileIMG_2678.JPG 155件 [詳細] fileIMG_2679.JPG 177件 [詳細] fileIMG_2677.JPG 138件 [詳細]

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