[[2009b]]


//CENTER:只今作成中

目次
#contents
*チーム [#l02624f3]
**チーム名 [#y49c64f3]
株式会社 とだ
**メンバー [#ud8d069a]
 その壱 とだ~
 その弐 なかみゅう~
 その参 SHIMA~

*ロボコン競技内容 [#x6401341]
**課題:玉入れロボット[#s59b9347]
 ピンポン玉をできるだけたくさん所定の場所に運ぶ

**フィールドの説明 [#l42d3efc]
#ref(field4.jpg,right,around)
 ・フィールドは約160cm×110cm~
 ・18個のピンポン玉はフィールドの中央にある、2x4の角材(長さ40cm)2本にはさ
まれた正方形の領域にあり、領域のこの角材が置かれていない辺には500mlの紙パックが並べられている~
 ・紙パックはすべての面に白あるいは緑色の画用紙がはられている~
 ・目的地の長方形は19mm×19mmの角材で仕切られていている~
 ・黒い線の太さは約25mm~
#ref(field_all.jpg,left,around,50%)
パックは緑もしくは白の直方体である。フィールドの中央にあるオレンジの丸はピンポン玉である。
~
#ref(field_center.jpg,left,around,50%)
#Clear

**ルール[#xb98a5cb]
***基本ルール [#c9877109]
 ・単独の競技(1回)および対戦の競技(リーグ戦、計2回の対戦)の合計点で争う~
 ・スタート時は「スタート地点」の内部以外に接していないこと~
 ・スタート時のロボットは2個を越えないこと(スタート後はいくつに分裂してもかまわない)~
 ・開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること~
 ・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない~
 ・途中でうまく動かなくなった場合、1回限り再スタートすることができる~
 ・競技時間終了までにもとのスタート地点にもどらなければならない(リーグ戦では戻らなくてもよい)~
 ・競技時間は3分とする。ただし審判が、競技続行不能と判断した場合は途中で終了する

***基本得点の計算方法 (単独競技) [#q6f70ec7]
 ・ボール1個あたり2点で計算する。~
 ・ボーナス点として5個入れるごとに5点追加~
 ・時間内(3分)にスタート地点にもどらないと-4点(ただしRCXを搭載するロボットの一部でも戻っていれば -2点)~
 ・最高で51点~
***基本得点の計算方法 (リーグ戦) [#la84423e]
 ・ゴールに入れたボールの数で競い、勝ったチームは10点、引き分けの時は5点、負けたチームは0点とする。~
 ・さらにゴールに入れたボール1個あたり1点を加点する~
 ・競技終了後、ゴールの内部にロボットが触れていれば-1点~
 ・最高で20点~
***技術点の計算方法 [#oe26404f]
 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について全てのチーム(3チーム)+TAが20点満点で採点し平均点を求める。~
 得点の目安  ・紙パックの処理 (3点)~
          ・ボールの収集 (3点)~
          ・ボールの運搬 (3点)~
          ・ボールのシュート (3点)~
          ・2台のRCXの連携 (3点)~
          ・その他 (5点)~

*ロボットの作成 [#xac09bd4]

**方針 [#j6aa403e]
 効率よくパックをどかし、ピンポン球を運搬できるロボットを製作する。

**製作に移る前に [#r72a29d2]
 初め、一つの大きなロボットを製作するつもりでした(下図参照)が、ピンポン球を収集することが困難であったため、パックをどかすロボットとピンポン球を収集するロボットの2台を製作することとなった。
#ref(1_robo_f.jpg,left,around,50%)
#ref(1_robo_r.jpg,left,around,50%)
#Clear

**ピンポン球収集ロボット [#u6632eb3]
***構造と仕組み [#i95dc0b5]
 収集ロボットの構造は、ロボットの中央(左右のタイヤの間)にキャタピラが備え付けられていて、キャタピラは、ピンポン玉の上面と接するような高さに設置されている。~
#ref(syuusyuu.jpg,around,120%)
#Clear
 また、キャタピラの先端にはピンポン玉を回収しやすくするためのアームが設置されていて、このアームは、ピンポン玉をゴールに排出する際にピンポン玉を持ち上げるのに役立つ。排出時は、アームとキャタピラに加え、ゴールを囲む木枠も利用する。なお、ピンポン玉は最高6個回収できる。~
#ref(haisyutu.jpg,center,around,120%)
#Clear
 車体には、光センサーと回転センサーの両方が設置されて、移動する時に利用する。~
 車体の移動速度は、ギアの組み合わせの関係で結構速いので、先手をとることも可能である。

***改良前の作品 [#u8e14c08]
 改良前の作品には、移動手段として光センサーではなく、タッチセンサーが取り付けられていたが、この場合、移動にずれが生じると修正することが困難であったため光センサーになった。~
 移動のずれは、左右のホイールのモーターの回転数が多少違うため、まっすぐに進もうとすると、どちらか左右に少しずつ曲がってしまうことにより発生する。タッチセンサーで修正しようとすると、壁もしくは障害物に当たらないと修正できない。しかも、実際に実行しようとすると、たいして修正できなかった。~
 しかし、光センサーだと、黒いラインがフィールド上に敷きめぐらされているため、修正されやすくなる。なお、光センサーは、下の図でわかるように車体前面に左右対称に取り付けられている。
#ref(2_robo_f.jpg,around,left,50%)
#ref(2_robo_r.jpg,around,right,50%)
#Clear

                        ↑正面                                                           ↑右側
#Clear
#ref(2_robo_t.jpg,around,left,50%)
#Clear
                        ↑タッチセンサーのアップ

***完成 [#n216b881]
 完成したものは、全長約30cmという巨大なものになった。改良前の作品では、タッチセンサーが取り付けられていたが、完成したロボでは、タイヤの軸より少し前に光センサーが左右1個ずつ取り付けられている。
#ref(3_robo_f.jpg,around,left,50%)
#ref(3_robo_r.jpg,around,right,50%)
#Clear

                        ↑正面                                                           ↑右側
#Clear
#ref(3_robo_b.jpg,around,left,50%)
#ref(3_robo_d.jpg,around,right,50%)
#Clear

                        ↑背後                                                           ↑下から
#Clear
下からの図をみると光センサーがわかりやすい。~
NQC本体が車体の真ん中より右寄りなのは、車体のバランスをとるためである。こうしないとまっすぐ走行させようとするとやや左にそれる。~
下の図は、ピンポン球を実際に取る姿を再現したものである。図は、改良前の作品であるが、とる姿はほぼ変化がないので気にしないでください。~
#ref(2_robo_f_p.jpg,around,left,50%)
#ref(2_robo_r_p.jpg,around,right,50%)
#Clear

                        ↑正面                                                           ↑右側~
下図はNQCを外した時に上から見えるピンポン玉収集の姿である。~
#ref(2_robo_u_p.jpg,around,center,50%)
#Clear

***工夫した点・苦労した点など [#u29ed85b]
 工夫した点は、車体のタイヤをやや前方に取り付けることにより、ロボットが回転運動した時も、収集したピンポン玉を逃しにくくしてある点である(瞬間中心の関係)。~
#ref(kuhuu2.jpg,around,120%)
#Clear
 また、前方のアームの長さも床に届かないような高さにし、左右のアームの間隔は少し緩めに設置されているので、ピンポン玉が詰まった際にアームが多少広がり、アームにかかった無理な力を逃がし、アームは回転し続けます。~
#ref(kuhuu1.jpg,around,120%)
#Clear
 さらに、アームとキャタピラの回転は連動していて、一つのモーターで回転します。~
 前方のクローは、ゴールにピンポン玉を入れる時、ピンポン玉を入れやすくする役割を担っている。

***問題点 [#mb65bd46]
 ・車体が大きすぎるため回転運動させようとすると、周辺の障害物にあたり回転が困難である。~
 ・アームが少し短いため、ピンポン玉収集があまりうまくいかない。(前進しながらなら回収しやすい)~
 ・ピンポン玉を回収する関係上、光センサーの幅がやや広めなので、ライントレーサーがうまくいかないこともある。

***プログラム [#y4a54e69]
 #define THRESHOLD 40                                //明るさの識別値   
 #define T 40                                        //明るさの識別値   
 #define go_forward OnFwd(OUT_A+OUT_C);              //前進プログラム
 #define go_back OnRev(OUT_A+OUT_C);                 //後進プログラム
 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);       //右旋回プログラム
 #define turn_left OnRev(OUT_A);OnFwd(OUT_C);        //左旋回プログラム
 #define stop Off(OUT_A+OUT_C);                      //停止のプログラム
 #define end Off(OUT_A+OUT_C);                       //停止のプログラム
 #define cs ClearSensor(SENSOR_2);                   //センサー2をリセット
 #define rs1 -25                                     //part1を後進するための回転数
 #define rs2 47                                      //part3を前進するための回転数の1
 #define rs3 -25                                     //part4を後進するための回転数の2
 #define rs4 58                                      //part4を前進するための回転数の1
 #define rr1 12                                      //反転するための回転数
 #define rr2 3                                       //少し右旋回するための回転数
 #define rr3 5                                       //45°右旋回するための回転数
 #define rl1 -4                                      //少し左旋回するための回転数
 #define rl2 -14                                     //part4で左旋回するための回転数
 #define arm1 OnFwd(OUT_B);                          //アーム(ピンポン玉回収)
 #define arm2 OnRev(OUT_B);Wait(1000);Float(OUT_B);  //アーム(ピンポン玉排出)   
 
 task main ()
 {
 	SetPriority(1);
 	SetSensor(SENSOR_1,SENSOR_LIGHT);          //SENSOR1は光センサー
 	SetSensor(SENSOR_2, SENSOR_ROTATION);       //SENSOR2は回転センサー
 	SetSensor(SENSOR_3,SENSOR_LIGHT);           //SENSOR3は光センサー
 	int n;                                //nは変数
 	n=0;                                 //初めnは0
 
 	Wait(2000);                           //20秒間待機(part1開始) 
 	cs;go_back;until(SENSOR_2<=rs1);            //少し後進
         cs;turn_right;until(SENSOR_2>=rr1);         //車体を反転(part1終了)
 
	repeat(5)                             //以下のプログラムを5回繰り返す(part2〜part5開始)
 		{
 		cs;turn_right;until(SENSOR_2>=rr2);          //少し右旋回(part2開始)
 		go_forward;Wait(10);stop;                 //少し前進
 		go_forward;Wait(10);end;                  //少し前進
 		cs;turn_right;until(SENSOR_2>=rr2);          //少し右旋回
 		arm1;                                  //ピンポン玉収集開始
 		repeat(3)                              //以下のプログラムを3回繰り返す
 			{
 			go_forward;Wait(10);stop;         //少し前進
 			go_back;Wait(10);stop;            //少し後進
 			go_forward;Wait(10);end;          //少し前進
 			go_back;Wait(10);end;             //少し後進
 			}
              Off(OUT_B);                            //アーム停止
 		cs;turn_left;until(SENSOR_2<=rl1);           //少し左旋回
 		go_back;Wait(10);stop;                    //少し後進
 		go_back;Wait(10);end;                     //少し後進
 		cs;turn_left;until(SENSOR_2<=rl1);           //少し左旋回(part2終了)
 		start follow_line_1;until(SENSOR_2>=rs2);    //ライントレースの1開始(part3開始)
 		stop follow_line_1;
 		start follow_line_2;until(SENSOR_3>T);       //ライントレースの2へ切り替え
 		stop follow_line_2;
 		cs;turn_right;until(SENSOR_2>=rr3);          //45°右旋回
 		cs;go_forward;until(SENSOR_2>=rs3);          //ゴールまで前進
 		arm2;                                  //ピンポン玉排出開始(part3終了)
 		cs;go_back;until(SENSOR_2<=-rs3);            //後進(part4開始)
 		cs;turn_left;until(SENSOR_2<=rl2);           //左旋回
 		start follow_line_1;until(SENSOR_2>=rs4);    //ライントレースの1開始
 		stop follow_line_1;
                  cs;turn_right;until(SENSOR_2>=rr1);          //車体を反転(part4終了)
                  n=n+1;   

turn_right;until(SENSOR_2>=rr);Off(OUT_A+OUT_C);         //右へセンサー2がrl以下になるまで旋回
 		turn_right;until(SENSOR_2>=rr);Off(OUT_A+OUT_C);         //右へセンサー2がrl以下になるまで旋回
 		go_forward;Wait(20);Off(OUT_A+OUT_C);                    //少し前進
 		ClearSensor(SENSOR_2);                                   //part2始まり
 		turn_right;until(SENSOR_2>=rr2);Off(OUT_A+OUT_C);        //右へセンサー2がrl以下になるまで旋回

 		arm1;                                                    //アームを起動
  		repeat(2)
 			{
 			ClearSensor(SENSOR_2);
 			go_forward;until(SENSOR_2>=rs2_2);Off(OUT_A+OUT_C);      //センサー2がrs2_2以上になるまで前進
 			Wait(200);
 			ClearSensor(SENSOR_2);
 			go_back;until(SENSOR_2<=-rs2_2);Off(OUT_A+OUT_C);
 			Wait(200);
 			}              					           //part2終わり
 
 										     //part6開始 
 		go_back;until(SENSOR_2<=rs6);Off(OUT_A+OUT_C);           //センサー2が-rs2_1以下になるまで後進
 		turn_left;Wait(25);Off(OUT_A+OUT_C);                     //少し左旋回
 		Float(OUT_B);                                            //アーム停止
 									           //part6終了

 		ClearSensor(SENSOR_2);                                   //part7開始
 		turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C);          //センサー2がrl以下になるまで左旋回
 		go_back;Wait(100);Off(OUT_A+OUT_C);                       //少し後退
 		ClearSensor(SENSOR_2);
 		turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C);          //センサー2がrl以下になるまで左旋回
 		start follow_line_forward;until((SENSOR_2>=rs7)&&(SENSOR_3>THRESHOLD));
 		stop follow_line_forward;Off(OUT_A+OUT_C);               //T字まで手前まで前進
 		start follow_line_forward_2;until(SENSOR_3<THRESHOLD);
 		stop follow_line_forward_2;Off(OUT_A+OUT_C);		     //T字路まで前進
 										     //part7終了       
 
 		ClearSensor(SENSOR_2);
 		turn_right;until(SENSOR_2>=rr8);Off(OUT_A+OUT_C);        //センサー2がrr以上になるまで右旋回
 		ClearSensor(SENSOR_2);
 		go_forward;Wait(300);Off(OUT_A+OUT_C);                   //センサー2がrs8以上になるまで前進
 		PlaySound(2);Wait(100);arm2;                             //ピンポン玉排出
										     //part8終了
 
 		ClearSensor(SENSOR_2);                                   //part10開始
 		go_back;until(SENSOR_2<=-rs8);Off(OUT_A+OUT_C);          //センサー2が-rs8以下になるまで前進
 		ClearSensor(SENSOR_2);
 		turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C);          //センサー2がrl以下になるまで左旋回
 		go_back;Wait(50);Off(OUT_A+OUT_C);                       //少し後進
 		start follow_line_back;until(SENSOR_2>=rs10);stop follow_line_back;Off(OUT_A+OUT_C);
 										      //センサー2がrs10以上になるまで後進
 										     //part10終了
 		}

 }        
 
 task follow_line_forward()				    //ラインに沿って前進するプログラム
 {
 	while(true)
 		{
		if(SENSOR_1>THRESHOLD)			    //左側のセンサーが白で
			{
			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら
  				{Off(OUT_A+OUT_C);go_forward;}//直進する
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);turn_right;}//右折する
 			}
 		else if(SENSOR_1<THRESHOLD)		    //左側のセンサーが黒で
 			{
 			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら 
 				{Off(OUT_A+OUT_C);turn_left;} //左折する
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);go_forward;}//直進する。
 			}                    
 		}
 }
 
 task follow_line_back()					    //ラインに沿って後進するプログラム
 {
 	while(true)
 		{
		if(SENSOR_1>THRESHOLD)                     //左側のセンサーが白で
			{ 
 			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら
				{Off(OUT_A+OUT_C);go_back;}   //後進
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);turn_left;} //左旋回
 			}
 		else if(SENSOR_1<THRESHOLD)		    //左側のセンサーが黒で
 			{
 			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら 
 				{Off(OUT_A+OUT_C);turn_right;}//右旋回
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);go_back;}   //後進
 			}
 		}                    
 }
 task follow_line_forward_2()				    //ラインに沿って前進するプログラム
 {
 	while(true)
 		{
		if(SENSOR_3>THRESHOLD)			      //右側のセンサーが白で
			{
			if(SENSOR_1>THRESHOLD)		      //かつ左側のセンサーが白なら
  				{Off(OUT_A+OUT_C);OnFwd(OUT_C);}//右折する
 			else if(SENSOR_1<THRESHOLD)	      //かつ左側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);OnFwd(OUT_A);}//左折する
 			}
 		else if(SENSOR_1<THRESHOLD)		    //左側のセンサーが黒で
 			{

 			}                    
 		}
 }
 
 task follow_line_back_2()					    //ラインに沿って後進するプログラム
 {
 	while(true)
 		{
		if(SENSOR_1>THRESHOLD)                     //左側のセンサーが白で
			{ 
 			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら
				{Off(OUT_A+OUT_C);go_back;}   //後進
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);turn_left;} //左旋回
 			}
 		else if(SENSOR_1<THRESHOLD)		    //左側のセンサーが黒で
 			{
 			if(SENSOR_3>THRESHOLD)		    //かつ右側のセンサーが白なら 
 				{Off(OUT_A+OUT_C);turn_right;}//右旋回
 			else if(SENSOR_3<THRESHOLD)	    //かつ右側のセンサーが黒なら
 				{Off(OUT_A+OUT_C);go_back;}   //後進
 			}
 		}                    
 }
**パックを排除するロボット [#x175aadf]
***構造と仕組み [#i95dc0b5]
 このロボットの構造は、他のグループと同様にタッチセンサーが備わったバンパーと上から下ろされるアームでパックをはさみ、パックを移動させます。~
 パックは、3個程度までなら回収できます。~
 移動には、光センサーのみが使用されます。
***完成 [#n216b881]
***工夫した点・苦労した点など [#u29ed85b]

***問題点 [#mb65bd46]

***プログラム [#y4a54e69]
*感想 [#jad47c94]

*コメント [#me0d2489]


#comment


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