[[戻る>2013b/Member]]
#contents

*課題 [#f8d8effa]
自作したコース(下図)に沿って一周するロボットを作成せよ。
-次のステップでプログラムを作成すること。
--交差点をきちんと認識し、正しく判断して通過できるようにする。
--確実に一周できるようにする。スタート地点から出発して元にもどるようにする。
--空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。
--1個の空き缶でうまくいったら、2個の空き缶でやってみる。


~(下図は、授業で示された松本先生画のコース図)&br;

#ref(zu.jpg)&br;

筆者は反時計回りを担当した。

*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;


-支えとして、車輪ではなく底の丸いパーツを使用した。
~→可動部を減らし、故障しうる箇所を減らした。&br;&br;(ドライブベースの写真)

#ref(image_1.jpeg)
#ref(image_2.jpeg)

(ロボットの写真)

#ref(image.jpeg)

*プログラム [#s5e6edef]

**コード [#y86f0d4c]
 /*マクロ・定数*/
 #define THRESHOLD 45  //ライントレースの閾値
 #define set_H SetPower(OUT_AC,7);  //直進用速度
 #define set_L SetPower(OUT_AC,1);  //カーブ用速度
 #define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A);  //反時計回り旋回
 #define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A);  //反時計回り移動  
 #define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C);  //時計回り移動
 #define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C);  //時計回り旋回
 #define go_fwd set_H;OnFwd(OUT_AC);  //前進
 #define go_rev set_H;OnRev(OUT_AC);  //後退
 #define STEP 1  //ライントレースの各動作時間
 #define C1 1000  //最初の交差点に近づくまでの時間
 #define LAST_C 3000 //最後の交差点に近づくまでの時間
 #define TURN_T 74  //90°回転するための所要時間
 #define CAN_T 61  //缶の大きさ分だけ進むのに必要な時間
 #define Clock FastTimer(0)-AFT+BEF  //缶を動かすのに使った時間を除いた時刻
 #define NCROSS 5 //交差点を判断するための閾値
 #define MOR 100 //交差点を検知したあと、次の交差点を検知し始めるまでの猶予
 
 /*グローバル変数*/
 int nline=0; //交差点横断用のカウンタ
 int BEF=0; //缶を動かす前の時刻を記録する変数
 int AFT=0; //缶を動かした後の時刻を記録する変数
 int RCH=0; //反転カウンタ
 
 /*インライン関数*/
 void line(){ //ライントレース
 if(SENSOR_2<THRESHOLD-7){turn_l1;}  //黒い部分を感知したら反時計回り旋回
 else if(SENSOR_2<THRESHOLD-5){turn_l0;}  //黒寄りの境界を感知したら反時計回り移動
 else if(SENSOR_2<THRESHOLD+3){go_fwd;}  //境界を探知したら直進
 else if(SENSOR_2<THRESHOLD+5){turn_r0;}  //白寄りの境界を感知したら時計回り移動
 else{turn_r1;}  //白い部分を感知したら時計回り旋回
 Wait(STEP);  //決定した動作を一定時間行う
 }
 
 void line_r(){ //方向を反転したライントレース
 if(SENSOR_2<THRESHOLD-7){turn_r1;}
 else if(SENSOR_2<THRESHOLD-5){turn_r0;}
 else if(SENSOR_2<THRESHOLD+3){go_fwd;}
 else if(SENSOR_2<THRESHOLD+5){turn_l0;}
 else{turn_l1;}
 Wait(STEP);
 }
 
 void line_c(){ //ライントレース(交差点探索用)
 if(SENSOR_2<THRESHOLD-7){turn_l1;nline++;} //黒い場所を検知したらカウンタに 1 加える
 else{ //その他の場合はカウンタを 0 に戻す
	if(SENSOR_2<THRESHOLD-5){turn_l0;}
 	else if(SENSOR_2<THRESHOLD+3){go_fwd;}
 	else if(SENSOR_2<THRESHOLD+5){turn_r0;}
 	else{turn_r1;}
	nline=0;
 	}
 Wait(STEP);
 }
 
 /*サブルーチン*/
 sub cross(){ //交差点横断サブルーチン
 Off(OUT_AC);PlaySound(2);Wait(10); //交差点を渡り始めることを知らせる 
 turn_r1;Wait(TURN_T/2); //方向修正
 go_fwd;Wait(40); //交差点を渡る
 if(Clock<LAST_C){turn_r1;until(SENSOR_2<THRESHOLD+5);} //ライン上に戻す
 else{turn_l1;until(SENSOR_2<THRESHOLD+5);RCH++;} //最後の交差点は逆回転でライン上に戻す
 nline=0; //カウンタをリセット
 ClearTimer(1); //一定時間は交差点を検知しないようにする。
 }
 
 sub canturn(){ //缶移動サブルーチン
 BEF=FastTimer(0);  //実行前の時刻を記録
 Off(OUT_AC);PlaySound(5);Wait(10); //缶を動かし始めることを知らせる
 go_fwd;Wait(CAN_T);  //缶と一緒にドライブ長だけ進む
 turn_l1;Wait(2*TURN_T);  //缶と一緒に180°反時計回り旋回
 go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T);  //缶を置いてライントレースの位置へ戻る
 AFT=FastTimer(0)+CAN_T; //実行後の時刻+αを記録
 }
 
 /*メインタスク*/
 task main(){
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0); //走行時間タイマー
 ClearTimer(1); //交差点用タイマー
 
 go_fwd;until(SENSOR_2>=THRESHOLD+4);PlaySound(2);Off(OUT_AC);  //スタート直後の交差点を超えるまで前進
 turn_r1;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC);  //黒いところを感知するまで時計回り旋回
 
 while(true){
	while(Clock<C1||FastTimer(1)<MOR){
		if(SENSOR_1==0){line();} //ライントレース
 		else{canturn();} //缶を検知したら移動させる
 	}	
 
	while(Clock>=C1&&RCH==0&&FastTimer(1)>=MOR){
		if(SENSOR_1==0){
			if(nline>=NCROSS){cross();} //黒い部分を一定以上連続で検知したら交差点を渡る
			else{line_c();} //交差点を探しながらライントレース
			}
 		else{canturn();} //缶を検知したら移動させる
 	}
 
	while(RCH>=1){ //反転カウンタに値が入ったら
		if(SENSOR_1==0){line_r();} //ライントレース
 		else{canturn();} //缶を検知したら移動させる
 	}
 }
 
 }

**プログラムの詳細(編集中) [#mbb5ecf3]
***ポイントA [#ja4d8cb7]
1.まず白い部分を検知するまで前進する。
2.その後黒い部分を検知するまで時計回り旋回を行う。
1.まず白い部分を検知するまで前進する。~
2.その後黒い部分を検知するまで時計回り旋回を行う。~
この部分を通常のライントレースで通過しようとすると、最初にロボットを置いた場所によっては時計回りコースへ進入してしまうので、このような方法をとった。

***ポイントBまでの間 [#r0146767]
1. 開始後10秒経過するまでは通常のライントレースを行う
2.10秒経過したら、黒い部分を連続で検知した回数の記録(交差点探索)を始める。
3.記録した回数が5回になったら、交差点横断サブルーチンを実行する。
4.交差点横断後1秒以内は通常のライントレースを行い、その後交差点探索を再開する。
1. 開始後10秒経過するまでは通常のライントレースを行う。~
2.10秒経過したら、黒い部分を連続で検知した回数の記録(交差点探索)を始める。~
3.記録した回数が5回になったら、交差点横断サブルーチンを実行する。~
4.交差点横断後1秒以内は通常のライントレースを行い、その後交差点探索を再開する。~

開始後10秒以内・交差点横断後1秒以内に交差点探索を行わず通常のライントレースを行うのは、交差点でない部分を誤って交差点と認識してコースから外れてしまうのを防ぐためである。
開始後10秒以内・交差点横断後1秒以内に交差点探索を行わず通常のライントレースを行うのは、交差点でない部分を誤って交差点と認識してコースから外れてしまうのを防ぐためである。~
なお、交差点横断サブルーチンの内容は次項に譲る。

***交差点横断サブルーチン [#x794f54d]
1.停止して、音を発して交差点横断を始めることを知らせる。
2.ロボットがコースに対しておよそ平行になるように、約45°時計回り旋回をする。
1.停止して、音を発して交差点横断を始めることを知らせる。~
2.ロボットがコースに対しておよそ平行になるように、45°だけ時計回り旋回をする。~
3.0.4秒直進する。~
4.~

*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。
--缶を移動するプログラムが出来なかった。


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