[[戻る>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]
 #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 1200  //1つ目の交差点までの時間(仮)
 #define C2 2200  //2つ目の交差点までの時間(仮)
 #define C3 2400  //3つ目の交差点までの時間(仮)
 #define TROAD_G 5150  //ゴール探索を始めるまでの時間(仮)
 #define TURN_T 72  //90°回転するにあたっての所要時間
 #define CAN_T 61  //缶を動かすときに用いる時間
 #define cross PlaySound(2);go_fwd;Wait(100);ncross+=1;  //交差点を渡るために1秒前進
 #define Clock FastTimer(0)-AFT+BEF  //缶を動かした時間を除いた時刻
 #define MOR 4  //交差点判定の猶予期間
 
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);  //タイマースタート
 int n=0;  //停止用カウンタ
 int BEF=0;  //缶を動かす前の時刻を記録する変数
 int AFT=0;  //缶を動かした後の時刻を記録する変数
 int ncross=0;  //交差点を渡った回数を記録する変数
 
 go_fwd;until(SENSOR_2>=THRESHOLD+6);PlaySound(2);Wait(5);Off(OUT_AC);  //スタート直後の交差点を超えるまで前進
 turn_r0;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC);  //黒いところを感知するまで時計回り移動
 
 while(n==0){  //ゴールを感知するまで
 
	if(Clock>=C1-MOR&&Clock<=C1+MOR&&ncross==0){cross;}  //交差点を渡る
	else if(Clock>=C2-MOR&&Clock<=C2+MOR&&ncross==1){cross;}
	else if(Clock>=C3-MOR&&Clock<=C3+MOR&&ncross==2){cross;}
 
	else if(FastTimer(0)>TROAD_G&&SENSOR_2<THRESHOLD+3){  //ゴール前の直線部に入る時間になったらゴール探索,ラインから外れたら通常のライントレースに戻す
		PlaySound(2);turn_r1;Wait(TURN_T);Off(OUT_AC);  //90°回転
		if(SENSOR_2<THRESHOLD-3){PlaySound(3);go_fwd;Wait(100);n++;}  //ゴールを発見したら向きを変えずに直進し、停止用のカウンタに+1
		else{turn_l1;Wait(TURN_T);Off(OUT_AC);go_fwd;Wait(10);}  //ゴールを発見できなければ元の向きに戻って探索を続行
		}
 
	else if(SENSOR_1==1){  //缶を動かす
		PlaySound(5);
		go_fwd;Wait(CAN_T);  //缶と一緒にドライブ長だけ進む
		BEF=FastTimer(0);  //実行前の時刻を記録
		turn_l1;Wait(2*TURN_T);  //缶と一緒に180°半時計回り旋回
		go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T);  //缶を置いてライントレースの位置へ戻る
		AFT=FastTimer(0)+CAN_T;  //実行後の時刻+αを記録
	}
 
	else{  //ライントレース
		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);  //決定した動作を10ミリ秒間行う
		}
	}
 
 while(n>0){Float(OUT_AC);}  //停止用カウンタが0でなくなったら停止する
  
 }
 
*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログラムが完成しなかった。
--交差点を判別するプログラムが出来ず、時間による判定となってしまった。
--缶を移動するプログラムが出来なかった。

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