[[2005/C2]]
*全体の構成 [#hd525389]
ロボット1台で1個づつ確実に牛乳パックを運び入れる。~
最初は、牛乳パックを乗り越えようかとかいろいろ考えたが、結局ライントレースすることにした。
**運ぶ順番 [#lf715643]
 一個目…ライントレース側の列で青箱側の牛乳パック
 二個目…ライントレース側の列で真ん中(隣は捨てる)
 三個目…真ん中の列の青箱側
 四個目…真ん中の列の真ん中
 五個目…真ん中の列の壁側
 六個目…奥の列の青箱側

*ロボットの特徴 [#rcdcba28]
-いらないものを省き、軽量かつ頑丈に作ったため、''コンパクト''である。
-1段目の牛乳パックを入れるときロボットの''前輪が持ち上がる''。
-前輪が持ち上がったとき倒れないよう、''ストッパーとしてしっぽ''をつけた。
-バランスを考え、上下にNQCを設置。''上下のNQCが通信するための反射板として、'羽'を利用''した。
-箱を確実につかむため''手にタイヤを4つ使用''した。
**NQCの分担 [#qe8f6eaa]
 上…箱をつかむ
 下…タイヤを動かす
   ライントレース(光センサ2個使用)
   箱の色を見分ける(光センサ1個使用)
   前輪を持ち上げる(補助輪を下げる)

*プログラム [#h522ae7f]
**メインプログラム [#x660df79]

-[[メインプログラム>2005/C2/ロボコン/プログラム1]]
-[[サブプログラム>2005/C2/ロボコン/プログラム2]]

 int place;	//牛乳パックを置く場所を設定
 int get=1;	//牛乳パックの数
 
 //ライントレース
 sub trace() {
 	while ((SENSOR_1 > 48) || (SENSOR_3 > 48)) {
 		if (SENSOR_1 < 48) {
 			OnFwd(OUT_C);
 			Off(OUT_A);
 		} else if (SENSOR_3 < 48) {
 			OnFwd(OUT_A);
 			Off(OUT_C);
 		} else {
  			OnFwd(OUT_A+OUT_C);
 		}
 	}
 }
 
 //牛乳パックをつかむ
 sub getbox() {
 	Wait(50);
 	ClearTimer(0);
 	while (Timer(0) <= 10) {
 		SendMessage(51);
 	}
 	Wait(50);
 }
 
 //牛乳パックを置く
 sub putbox() {
 	Wait(50);
 	ClearTimer(0);
 	while (Timer(0) <= 10) {
 		SendMessage(52);
 	}
 	Wait(50);
 }
 
 task main() {
 
 //センサの設定
 	SetSensor(SENSOR_1,SENSOR_LIGHT);	//ライントレース(左)
 	SetSensor(SENSOR_2,SENSOR_LIGHT);	//牛乳パックの色判別
 	SetSensor(SENSOR_3,SENSOR_LIGHT);	//ライントレース(右)
 
 	while(get <= 6) {
 
 //初めの牛乳パック
 		if (get == 1) {
 			getbox();
 
 	//ライントレースへ
 			OnRev(OUT_A+OUT_C);
 			Wait(15);
 			OnFwd(OUT_C);
 			Wait(20);
 			OnFwd(OUT_A);
 			Wait(100);
 			until(SENSOR_1 < 45);
 
 //2個目の牛乳パック
 		} else if (get == 2) {
 
 	//つかむ位置合わせ
 			OnRev(OUT_A+OUT_C);
 			Wait(40);
 			Off(OUT_A);
 			OnFwd(OUT_C);
 			Wait(40);
 			OnFwd(OUT_A);
 			Wait(55);
 			Off(OUT_C);
 			Wait(50);
 			OnFwd(OUT_C);
 			Wait(30);
 			Off(OUT_A+OUT_C);
 
 			getbox();
 
 	//振り返り、そのままライントレースへ
 			OnRev(OUT_A+OUT_C);
 			Wait(5);
 			OnFwd(OUT_A);
 			Wait(70);
 			until(SENSOR_1 < 45);
 
 //3個目以降の牛乳パック
 		} else if (get >= 3) {
 
 	//奥から2番目の交差点まで進む
 			Off(OUT_C);
 			OnFwd(OUT_A);
 			Wait(35);
 			OnFwd(OUT_C);
 			until(SENSOR_1 < 40);
 			trace();
 			OnFwd(OUT_A+OUT_C);
 			Wait(20);
 			trace();
 
 	//3〜5個目の牛乳パック
 			if (get <= 5) {
 				OnFwd(OUT_A+OUT_C);
 				Wait(20);
 				Off(OUT_C);
 				OnRev(OUT_A);
 				Wait(90);
 				OnFwd(OUT_A+OUT_C);
 
 		//牛乳パックごとに位置を合わせ、牛乳パックをつかむ
 				if (get == 3) {			//3個目
 					Wait(15);
 					Off(OUT_A+OUT_C);
 					getbox();
 				} else if (get == 4) {		//4個目
 					Wait(50);
 					Off(OUT_A+OUT_C);
 					getbox();
 					OnRev(OUT_A+OUT_C);
 					Wait(30);
 					Off(OUT_A+OUT_C);
 				} else {			//5個目
 					Wait(85);
 					getbox();
 					OnRev(OUT_A+OUT_C);
 					Wait(60);
 					Off(OUT_A+OUT_C);
 				}
 
 		//黒線上に戻る
 				OnRev(OUT_A);
 				until(SENSOR_3 < 45);
 				OnRev(OUT_C);
 				Wait(20);
 
 	//6個目の牛乳パック
 			} else {
 
 		//一番奥の交差点まで進む
 				OnFwd(OUT_A+OUT_C);
 				Wait(20);
 				trace();
 
 		//位置を合わせ、牛乳パックをつかむ
 				OnFwd(OUT_A+OUT_C);
 				Wait(20);
 				Off(OUT_C);
 				OnRev(OUT_A);
 				Wait(90);
 				OnFwd(OUT_A+OUT_C);
 				Wait(15);
 				Off(OUT_A+OUT_C);
 				getbox();
 
 		//黒線上へ戻る
 				OnRev(OUT_A);
 				until(SENSOR_3 < 45);
 				OnRev(OUT_C);
 				Wait(20);
 
 		//奥から2番目の交差点まで進む(越える)
 				trace();
 				OnFwd(OUT_A+OUT_C);
 				Wait(20);
 			}
 
 	//ライントレースへ
 			trace();
 			OnFwd(OUT_A+OUT_C);
 			Wait(20);
 			trace();
 			Off(OUT_C);
 			OnFwd(OUT_A);
 			Wait(25);
 			OnFwd(OUT_C);
 			until(SENSOR_1 < 45);
 		}
 
 //カゴ側へ移動
 		trace();
 
 //牛乳パックの色判別→入れるカゴを決定
 		if (SENSOR_2 < 40) {		//黒
 			place = 3;
 		} else if (SENSOR_2 > 46) {	//白
 			place = 2;
 		} else {			//緑
 			place = 1;
 		}
 
 //カゴ前へ移動
 		repeat(place) {
 			OnFwd(OUT_A+OUT_C);
 			Wait(20);
 			trace();
 		}
 
 //床上の牛乳パック→持ち上げてカゴに入れる
 		if ((get >= 3) && (get <= 5)) {		//判別(3〜5個目の牛乳パック)
 			OnFwd(OUT_A+OUT_C);
 			Wait(30);
 			Off(OUT_A+OUT_C);
 			Wait(20);
 
 	//車体を上げる
 			OnFwd(OUT_B);
 			Wait(100);
 			Off(OUT_B);
 
 			Wait(20);
 			OnRev(OUT_C);
 			Wait(100);
 			OnFwd(OUT_A+OUT_C);
 			Wait(40);
 			Off(OUT_A+OUT_C);
 			putbox();
 
 	//牛乳パックを離した後、車体を下げる
 			OnRev(OUT_B);
 			Wait(80);
 			Off(OUT_B);
 
 			Wait(20);
 
 //箱上の牛乳パック→そのままカゴに入れる
 		} else {
 			OnFwd(OUT_A+OUT_C);
 			Wait(20);
 			Off(OUT_A);
 			OnRev(OUT_C);
 			Wait(85);
 			OnFwd(OUT_A+OUT_C);
 			Wait(30);
 			Off(OUT_A+OUT_C);
 			putbox();
 		}
 
 //黒線上へ戻る
 		OnRev(OUT_C);
 		until(SENSOR_1 < 45);
 
 		get++;		//次に取る牛乳パックの番号を設定
 
 //牛乳パック側へ移動
 		trace();
 		repeat(place) {
 			OnFwd(OUT_A+OUT_C);
 			Wait(20);
 			trace();
 		}
 	}
 }
1台目に組み込んだメインのプログラム(若干修正版)。とりあえず牛乳パック6個を運べるようプログラムしてある。移動と指示は全てこちらで行い、牛乳パックをつかむか放すかで大まかに分けることができる。~
つかむ方では、変数getを用いて、次につかむ牛乳パックが何個目かを判別し、その牛乳パックを目指して移動する。~
一方、放す方では、変数placeを目指すカゴまでに交差点を越える回数とし、つかんでいる牛乳パックの色によって値を変え、行き先を変更する。また、getの値によって、牛乳パックを持ち上げるか否かを判別するようになっている。~
ちなみに、実は発表時、センサ2の宣言を書き忘れていた。でも動いたということは、なくてもかまわない?


**サブプログラム [#vb005562]
 task main() {
 	while(true) {
 		ClearMessage();
 
 //51を受信→牛乳パックをつかむ
 		until(Message() == 51);
 		OnFwd(OUT_A);
 
 //52を受信→牛乳パックを放す
 		until(Message() == 52);
 		OnRev(OUT_A);
 		Wait(30);
 		Off(OUT_A);
 	}
 }
こちらは2台目に組み込んだプログラムで、通信を利用して牛乳パックをつかんだり放したりするだけの簡単なもの。51と52を使ったのは、他班のロボットと通信して誤作動を起こさないようにという思いから。

*ロボコンの写真 [#g4b204a1]
#ref(dscn2460_Medium.jpg)
#ref(pict0351_Medium.jpg)
#ref(dscn2461_Medium.jpg)
#ref(pict0352_Medium.jpg)
#ref(dscn2418_Medium.jpg)
#ref(pict0353_Medium.jpg)
#ref(pict0354_Medium.jpg)
#ref(pict0355_Medium.jpg)
#ref(pict0356_Medium.jpg)
#ref(dscn2462_Medium.jpg)


*反省点 [#g4e7b192]


コメントをお願いします。
#comment

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