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

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


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

#ref(zu.jpg)
#ref(zu.jpg)&br;

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

*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;&br;
~→小回りがきくようになった。&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 STEP 1  //ライントレースの各動作時間
 #define C1 1300  //1つ目の交差点までの時間(仮)
 #define C2 2100  //2つ目の交差点までの時間(仮)
 #define C3 2900  //3つ目の交差点までの時間(仮)
 #define TROAD_G 5150  //ゴール探索を始めるまでの時間(仮)
 #define TURN_T 72  //90°回転するにあたっての所要時間
 
 task main()
 {
 
 SetSensor(SENSOR_1,SENSOR_TOUCH);  //センサー定義
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 ClearTimer(0);  //タイマーリセット・スタート
 int n=0;  //カウンタ定義
 
 go_fwd;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Wait(5);Off(OUT_AC);  //スタート直後の交差点を超えるまで前進
 turn_r0;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OUT_AC);  //黒いところを感知するまで時計回り移動
 turn_r0;until(SENSOR_2>=THRESHOLD+10);PlaySound(2);Off(OUT_AC);  //もう一度白いところを感知するまで移動を続ける
 turn_l0;until(SENSOR_2<=THRESHOLD+5);PlaySound(2);Off(OUT_AC);  //ラインの境界まで反時計回り回転
  
 while(n==0){  //ゴールを感知するまで
 
 	if(FastTimer(0)==C1){go_fwd;Wait(50);}  //交差点を通る時間になったら直進
 	if(FastTimer(0)==C2){go_fwd;Wait(50);}
 	if(FastTimer(0)==C3){go_fwd;Wait(50);}
 
 	if(FastTimer(0)>TROAD_G&&SENSOR_2<THRESHOLD-1){  //ゴール前の直線部に入る時間になったらゴール探索,ラインから外れたら通常のライントレースに戻す
 		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_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){Off(OUT_AC);}  //カウンタが0でなくなったら停止する
 
 }

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


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