[[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 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(330)回以上連続で判断すると交差点とみなし停止する。
光センサーが黒を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地点へ向かうプログラム。

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

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

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