[[2016a/Member]]

・目次
#contents
*課題 [#ubab1e3f]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。

*コース図 [#id45d691]
http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission2 (参照)

*ミッション [#oc3264ca]
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。ただし、なるべく速く正確に動くロボットになるように工夫して、交差点では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地点のルートを担当した。

*メンバー [#qb973488]
tom・funatsu・tatsuya

*ロボットの説明 [#j547dadf]
私達は、NXTと言う種類のロボットを使用した。
#ref(2016a/Member/tom/Mission2/IMG_2677.JPG)
#ref(2016a/Member/tom/Mission2/IMG_2679.JPG)
<センサー部分>
#ref(2016a/Member/tom/Mission2/IMG_2678.JPG)

*プログラム [#k22b8b3f]
・定義
 #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 STEP 1
 #define turn_right2 OnRev(OUT_B,SPEED1);OnFwd(OUT_C,SPEED1);
 #define short_break Off(OUT_BC);Wait(1000);PlaySound(SOUND_UP);
 #define cross_line go_forward;Wait(200);Off(OUT_BC);Wait(1000);
 #define nMAX 350
今回はこの定義を使った。

・サブルーチン
 void line_trace()//ラインに沿って走り交差点で止まる
 void line_trace()//黒い線上に沿って走る
 {
 SetSensorLight(S1);
 int nOnline=0;
     while (nOnline < 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;
     }
     Wait(STEP);
    }
    short_break;
    nOnline=0;
 Off(OUT_BC);
 }

 void line_closs()
 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);
 }

 void line_right()
 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()
 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 last_move()
 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();
 }

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

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



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