* 全体の構想 [#q843db0b]
&br;&br;アームが象の鼻の様な形なので名前はエレファントカシマシという名前です。初めは箱を飛ばす予定だったけど入る確率の低さと飛ばす為の構造が思いつかなかったので却下しました。そして無難にライントレースすることにした。アームの根元に付いたタイヤをモーターで回転させ常に回し続けることでつかんだ箱をおっことさないようにした。これも象からのアイデアをいただきました。箱はひとつずつ正確に運ぶ様にして確実に点数狙いにいきました。&br;&br;

&br;
アームが象の鼻の様な形なので名前はエレファントカシマシという名前です。初めは箱を飛ばす予定だったけど入る確率の低さと飛ばす為の構造が思いつかなかったので却下しました。そして無難にライントレースすることにした。アームの根元に付いたタイヤをモーターで回転させ常に回し続けることでつかんだ箱をおっことさないようにした。これも象からのアイデアをいただきました。箱はひとつずつ正確に運ぶ様にして確実に点数狙いにいきました。
&br;

*ロボットの特徴 [#l314b75f]

&br;
↓見て下さい。これが僕らのロボットです。&br;
#ref(dscn2432_Large.jpg)
何と言っても長いアーム(このアームこそが&SIZE(20){&COLOR(#FF0000){''LEGOエレファントカシマシ''};};の名の由来なのです)。そしてシンプル過ぎるぐらいの&size(20){''スマートな''};ボディ。この二つが大きな特徴となっていると思う。
~まずこのアームは高い位置だろうと低い位置だろうと関係なしに牛乳パックを取ってしまう。だからアームを上下に動かすなどという余分な動作をしなくてすむのだ。この発想からからすでに&size(30){&color(#0000EE){スマート!!!};};
下手に細かな機能を持たせるよりは、大雑把な設計の方を選んだわけだ。
~足回りは半径の小さなタイヤを使い、ライントレースするようにしている。
&br;
* プログラム [#b9dcbc82]
&br;
はい。こんなかんじです。&br;
[[プログラミ>2005/C3/しかた/ロボコン]]
&br;
実はまだまだ完成途中のプログラムです。箱を一つしか入れることが出来ません。
&br;

* 結果 [#x8329bec]

* プログラム [#b9dcbc82]
&br;&br;
はい。こんなかんじです。
&br;
練習ではほぼ100%色を識別し、しっかりかごの中に入れることが出来ました。しかし本番では1回目、2回目とも、入れることが出来ませんでした。&br;
#ref(pict0366_Large.jpg)
そして3回目、最後の希望を託しロボットを発進させました。これまたなんと失敗!!司会の人の『再挑戦しますか?』の質問に,『もちろんです。』と答えました。泣いても笑ってもこれが最後。これを失敗すれば、今までの努力は水の泡。チーム全員で祈りを込め、発進させました。すると神が舞い降りました。なんと成功!!最後の最後でヤツはやってくれました。&br;
#ref(pict0367_Large.jpg)
正直1回目で入っていれば、僕たちはこんなに必死にならなかったでしょう。最後の最後でやってくれたからこそ、これほどにドラマチックな最後を迎えることが出来たのです。&br;
遅くなりましたが、結果はなんと3位!!!これには本当に驚きました。本当にチーム一丸となって必死に取り組んだ結果かなと思いました。神様本当にありがとう…

 #define BLACK 40 //黒い線
 #define C90 140 //90度基準
 #define BKBOX 33 //黒い匣か
 #define WHBOX 46 //白い匣か
 #define GRBOX 38 //緑い匣か
 #define LINE1 300 //一つ目の匣
 #define LINE2 200 //二つ目の匣
 #define LINE3 100 //三つ目の匣
 #define A 15 //微少移動時間
 #define HIRAKU 200 //掴む時間
 #define SHIMARU 200 //離す時間
 
 void c90(int x){//90度回転する関数
	if(x==2){//反時計回りなら(仮)
		OnFwd(OUT_A);
		OnRev(OUT_C);
		Wait(C90-17);
	}
		if(x==3){//時計回りなら(仮)
		OnFwd(OUT_A);
		OnRev(OUT_C);
		Wait(C90+17);
	}
	if(x==0){//時計回りなら
		OnFwd(OUT_C);
		OnRev(OUT_A);
		Wait(C90);
	}		
	else if(x==1){//半時計回りなら
		OnFwd(OUT_A);
		OnRev(OUT_C);
		Wait(C90);
	}
	
 }
 void hiraku(){//開く関数
	OnRev(OUT_B);
	Wait(HIRAKU);
 }
 void shimaru(){//閉る関数
	OnFwd(OUT_B);
	Wait(SHIMARU);
	OnFwd(OUT_B);
 }
 void tomaru(){//止まる関数
	Off(OUT_A+OUT_C);
 }
 
 task main()
 {
	SetSensor(SENSOR_1, SENSOR_LIGHT);//左光センサー
	SetSensor(SENSOR_3, SENSOR_LIGHT);//右光センサー
	SetSensor(SENSOR_2, SENSOR_LIGHT);//色識別光センサー
 
	int state;//状態変数
	int time;//状態遷移変数
	int line;//何列目か変数
	int count;//何個目の匣か変数
	int greenline;//緑の線何本目か変数
	int work;//作業用
	int flag;//黒い線フラグ
	state = 0;
	time = 0;
	line = 1;
	count = 1;
	flag =0;
	while(true){
		while(line <= 3){
			state = 200;
			tomaru();/////////////////////
			hiraku();
			OnFwd(OUT_A+OUT_C);
			Wait(100);
			tomaru();
			shimaru();
			state = 100;
			if(SENSOR_2 > WHBOX)state += 10;
			else if(SENSOR_2 < BKBOX)state += 30;
			else state += 20;
			if(line==1){//1列目なら
				OnRev(OUT_A+OUT_C);
				Wait(count*50+50);
				c90(1);
 //				while(!(SENSOR_1<BLACK)){
					OnFwd(OUT_C+OUT_A);
					Wait(50);
 //				}
				c90(0);
					OnFwd(OUT_C+OUT_A);
				Wait(50);
				c90(1);
					OnFwd(OUT_C+OUT_A);
				Wait(50);
			}
			else if(line==2){//2列目なら
				while(!(SENSOR_1<BLACK && SENSOR_3<BLACK)){
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				c90(0);
				while(!(SENSOR_1<BLACK && SENSOR_3<BLACK)){
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				c90(0);
				while(!(SENSOR_1<BLACK)){
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				c90(1);
			}
			else if(line==3){//3列目なら
				
			}
			tomaru();/////////////////////
			if(state % 100 >= 30){//黒い匣なら
				greenline = 3;
			}
			else if(state % 100 >= 20){//緑の匣なら
				greenline = 1;
			}
			else if(state % 100 >= 10){//白い匣なら
				greenline = 2;
			}
			work= greenline;
			while(!(SENSOR_3 < BLACK && SENSOR_1 < BLACK)){
				//2つのセンサーが同時にセンサーを感知しない限り
				//ライントレースせよ
				if(SENSOR_1>BLACK && SENSOR_3>BLACK){
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				else if(SENSOR_1< BLACK){
					while(SENSOR_1< BLACK){
						OnFwd(OUT_C);
						OnRev(OUT_A);
						Wait(A);
					}
				}
				else if(SENSOR_3< BLACK){
					while(SENSOR_3< BLACK){
						OnFwd(OUT_A);
						OnRev(OUT_C);
						Wait(A);
					}
				}
				tomaru();/////////////////////
			}
			while(work!=0){
				if((SENSOR_3 < BLACK && SENSOR_1 < BLACK)){
					flag++;/////黒い線を何本通過したか的なカウンタ
					OnFwd(OUT_A+OUT_C);
					Wait(30);
				}
				else if(flag==0 && SENSOR_1>BLACK && SENSOR_3>BLACK){//ライントレース
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				else if(flag==0 && SENSOR_1< BLACK){
					while(SENSOR_1< BLACK){
						OnFwd(OUT_C);
						Wait(A);
					}
				}
				else if(flag ==0 && SENSOR_3< BLACK){
					while(SENSOR_3< BLACK){
						OnFwd(OUT_A);
						Wait(A);
					}
				}//////////////////////////////ライントレースここまで
				if((SENSOR_3 > BLACK && SENSOR_1 > BLACK) && flag>0){
					work--;
					flag=0;
					OnFwd(OUT_A+OUT_C);
					Wait(20);
				}
				tomaru();/////////////////////
			}
			OnFwd(OUT_A+OUT_C);
			Wait(15);
			c90(2);
			OnRev(OUT_A+OUT_C);
 //			if(line==1){
 //				Wait(LINE1);
 //			}
 //			else if(line==2){
				Wait(LINE2+30);
 //			}
 //			else if(line==3){
 //				Wait(LINE3);
 //			}
			tomaru();/////////////////////
			state = 250;
			hiraku();//////////////
			shimaru();
			OnFwd(OUT_A+OUT_C);
 //			if(line==1){
 //				Wait(LINE1);
 //			}
 //			else if(line==2){
				Wait(LINE2-20);
 //			}
 //			else if(line==3){
 //				Wait(LINE3);
 //			}
			tomaru();/////////////////////
			c90(3);
			work= greenline-1;
			while(work!=0){
				if((SENSOR_3 < BLACK && SENSOR_1 < BLACK)){
					flag++;/////黒い線を何本通過したか的なカウンタ
					OnFwd(OUT_A+OUT_C);
					Wait(30);
				}
				else if(flag==0 && SENSOR_1>BLACK && SENSOR_3>BLACK){//ライントレース
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				else if(flag==0 && SENSOR_1< BLACK){
					while(SENSOR_1< BLACK){
						OnFwd(OUT_C);
						Wait(A);
					}
				}
				else if(flag ==0 && SENSOR_3< BLACK){
					while(SENSOR_3< BLACK){
						OnFwd(OUT_A);
						Wait(A);
					}
				}//////////////////////////////ライントレースここまで
				if((SENSOR_3 > BLACK && SENSOR_1 > BLACK) && flag>0){
					work--;
					flag=0;
					OnFwd(OUT_A+OUT_C);
					Wait(20);
				}
				tomaru();/////////////////////
			}
			while(!(SENSOR_3 < BLACK && SENSOR_1 < BLACK)){
				if(SENSOR_1>BLACK && SENSOR_3>BLACK){
					OnFwd(OUT_A+OUT_C);
					Wait(A);
				}
				else if(SENSOR_1< BLACK){
					while(SENSOR_1< BLACK){
						OnFwd(OUT_C);
						OnRev(OUT_A);
						Wait(A);
					}
				}
				else if(SENSOR_3< BLACK){
					while(SENSOR_3< BLACK){
						OnFwd(OUT_A);
						OnRev(OUT_C);
						Wait(A);
					}
				}
				tomaru();/////////////////////
			}
					OnFwd(OUT_A+OUT_C);
					Wait(30);
			if(line==1){
				if(count==1){
					c90(1);
					OnFwd(OUT_A+OUT_C);
					Wait(LINE2-150);
				}
				if(count==2){
					c90(1);
					OnFwd(OUT_A+OUT_C);
					Wait(10);
				}
				tomaru();/////////////////////
			}
			else if(line==2){
				
			}
			else if(line==3){
				
			}
			count++;
			if(count>3){
				line++;
				count=1;
			}
		}
	}
 }
&br;

* 反省点 [#o3ef92f6]

&br;
反省点、それはずばり、もっと早くに作業に取りかかるべきだったということです。ちょっと取りかかるのが遅すぎました。みんなでもっと呼びかけ合って、構想を練っていれば、もっと余裕を持って作業が出来ただろうし、プログラムも全部の箱を運べるくらいのものが出来ていただろうと思います。
&br;

&br;&br;
*感想 [#lc6360a0]

* 反省点 [#x8329bec]
&br;&b&br;&br;
&br;
正直、3位という結果には驚きました。反省点はたくさんありますが、3位だったからこれでいいかな?って思ってます。本当に楽しかったです。でも、賞品はもうちょっといい物がよかったかな!?
&br;

*コメント!!! [#rb75c37b]

-他の班のロボコンのページや、そこへの僕のコメントを参照しながらがんばってみましょう。 -- [[まいける(TA)]] &new{2006-02-17 (金) 05:40:01};

#comment


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