[[2009b]]

----------------------------
CENTER:&size(30){ロボコン〜玉入れロボット〜};
----------------------------
RIGHT:製作者:
CENTER:只今作成中
RIGHT:製作者:ゆあ,kata,PuKKu
//CENTER:只今作成中

目次
#contents

*ロボコンの競技内容(詳しくは[[ロボコン>2009b/ロボコン]]へ) [#kf84829c]
 ピンポン玉をできるだけ多く所定の場所に入れる。
**フィールド [#v585f877]
LEFT:単位(mm)
#ref(2009b/A2/ロボコン/field3.jpg,around,60%)
-フィールドは約160cm×110cm
-18個のピンポン玉はフィールドの中央にある、2x4の角材(長さ40cm)2本にはさまれた正方形の領域にあり、領域のこの角材が置かれていない辺には500mlの紙パックが並べられている
-紙パックはすべての面に白あるいは緑色の画用紙がはられている
-目的地の長方形は19mm×19mmの角材で仕切られていて
-黒い線の太さは約25mm
#Clear
LEFT:単位(mm)


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

*ロボットの作成 [#tc0f6bb4]
**方針 [#e8e50710]
 確実に多くのピンポン玉を集めて所定の場所に入れたい。それを行うために重要なことは次の2点であった。
***ピンポン玉をどう集めて入れるか [#r4d3fcec]
 ピンポン玉を入れる目的地は19mmの高さがあるために直径が40mmであるピンポン玉を入れるには、ただ押し込むだけでは難しい。そのために、ピンポン玉を少しだけ持ち上げていれる必要がある。その方法として考えられるのは、集めるときにピンポン玉を持ち上げる方法と入れるときに持ち上げる方法がある。私たちは、試行錯誤の末、両方の方式でロボットを作ることにした。
#ref(2009b/A2/ロボコン/IMG_000110.jpg,right,around,20%)
 ピンポン玉を入れる目的地は19mmの高さで囲まれているため、直径が40mmであるピンポン玉を入れるには、ただ単に押すだけでは難しい。そのため、ピンポン玉を枠の中に入れるには、少しだけも持ち上げていれる必要がある。その方法として考えられるのは、集めるときにピンポン玉を持ち上げる方法と入れるときに持ち上げる方法がある。私たちは、試行錯誤の末、両方の方式でロボットを作ってみることにした。
#Clear
''〜集めるときにピンポン玉を持ち上げる方法〜''~
 私たちは、スロープのブロックを使って枠より高く持ち上げることができるスロープを作り、アームを回しながらピンポン玉をかき集め、スロープに沿って持ち上げる方法を考えた(左図)。右図は案が出た当初に作ったロボットの様子である。
#ref(2009b/A2/ロボコン/IMG_02230.jpg,right,around,30%,右図)
CENTER:    &ref(2009b/A2/ロボコン/houshin1.jpg,center,around,55%,左図);
#Clear
RIGHT:右図:最初に作ったロボット
CENTER:左図:イメージ図

''〜入れるときにピンポン玉を持ち上げる方法〜''~
 ピンポン玉を押すだけで入れることができるようにするために、kataの何度もの実験の末に生み出された構造(壁)を私たちは採用した。下図のように、ピンポン玉を枠と壁で挟み込むことによって、上に持ち上げる。そして、壁が枠に更に近づくことで枠の中にピンポン玉を押し込む。
CENTER:&ref(2009b/A2/ロボコン/houshin220.gif,right,around,40%,下図);
CENTER:下図:イメージ図
***紙パックをどうするか [#ee561274]
 
**ロボコンまでの過程 [#rb97b1ea]
**完成(最終形態) [#xbf4ef1a]
**ロボットの特徴 [#md2f42a5]
***ピンポン玉を集めて入れるロボット [#u7417795]
***紙パックを移動させるロボット [#xfcfd65d]
**工夫した点・苦労した点など [#w064da81]
**問題点 [#pe82b4ab]
*プログラム [#v757cfd6]
**ピンポン玉を集めて入れるロボット [#u3587279]
*最初 [#ce4cbb86]
 define Bright 45  
 #define GOFWD(t) OnRev(OUT_A+OUT_C);  Wait(t);
 #define Stop  Off(OUT_A+OUT_C);
 #define GOREV OnFwd(OUT_A+OUT_C); 
 task main ()
 {
 	 SetSensor(SENSOR_3, SENSOR_LIGHT);
              SetSensor(SENSOR_2,SENSOR_LIGHT);
              SetSensor(SENSOR_1,SENSOR_ROTATION);
              
             while(SENSOR_2 > Bright){
 	 	GOFWD(10);
       	}
       	Wait(10);
       	while(SENSOR_2>Bright){
       		OnRev(OUT_C);
       		Off(OUT_A);
       	}
       PlaySound(SOUND_DOUBLE_BEEP) ; 
     	ClearSensor(SENSOR_1);
      	while (abs(SENSOR_1)< 60) {
              	if (SENSOR_2 <  Bright) {   // çïê¸è&#8222;Ç…Ç¢ÇÈÇ&#8710;Ç´
                    	 	OnRev(OUT_A);
                     		 Off(OUT_C);
                     		 Wait(20);
              	} 
             	else {                      // çïê¸Ç©ÇÁäOÇÍÇΩÇ&#8710;Ç´
                    		Off(OUT_A);
                   	 	OnRev(OUT_C);
                   	 	Wait(20); 
              	}
    	 } 
              Stop;  
 	ClearSensor(SENSOR_1);
 	OnRev(OUT_B);
 	//start arm;
 	/*while(abs(SENSOR_1)<5){
 		OnRev(OUT_C);
 		Float(OUT_A);
 		Wait(40);
 		OnFwd(OUT_A);
 		Wait(5);
 	}*/
 	ClearTimer(0);
 	while(FastTimer(0)<150){
 		OnRev(OUT_A);
 		Float(OUT_C);
 		Wait(60);
 		OnFwd(OUT_C);
 		Wait(20);
 	}
 	Stop;
 	PlaySound(SOUND_DOUBLE_BEEP) ; 
 	while(abs(SENSOR_1)<40){
 		GOFWD(10);
 	}
 	Stop;
 	Wait(100);
 	//stop arm;
 	PlaySound(SOUND_FAST_UP) ;
 	ClearSensor(SENSOR_1);
 	/*while(SENSOR_3<Bright){
 		GOREV;
 	}*/
 	while(abs(SENSOR_1)<40){
  		GOREV;
 	}
 	Stop;
 	Off(OUT_B);
 	/*ClearTimer(0);
  	while(FastTimer(0)<150){
 		OnFwd(OUT_A);
		Float(OUT_C);
		Wait(40);
		OnRev(OUT_C);
		Wait(5);
	}
	Stop;*/
	while(SENSOR_2>Bright){
		OnFwd(OUT_C);
		OnRev(OUT_A);
		
	}
	/*while(SENSOR_3>Bright){
		GOREV;
	}*/
	PlaySound(SOUND_FAST_UP) ;
	Stop;
	ClearTimer(0);
	ClearSensor(SENSOR_1);
	while (FastTimer(0)<500) {
             	if (SENSOR_3 <  Bright) {   // çïê¸è&#8222;Ç…Ç¢ÇÈÇ&#8710;Ç´
                   	 	OnFwd(OUT_C);
                    		 Off(OUT_A);
             	} 
            	else {                      // çïê¸Ç©ÇÁäOÇÍÇΩÇ&#8710;Ç´
                   		Off(OUT_C);
                  	 	OnFwd(OUT_A);
             	}
   	 } 
   	 Stop;
   	 ClearSensor(SENSOR_1);
   	 while(abs(SENSOR_1)<=20){
   	 	OnFwd(OUT_C);
   	 	Float(OUT_A);
   	 	Wait(20);
   	 	OnRev(OUT_A);
   	 }
   	 
   	 ClearTimer(0);
   	 while(FastTimer(0)<500){
   	 	OnFwd(OUT_A+OUT_C);
   	 }
   	 /*ClearSensor(SENSOR_1);
   	 while(abs(SENSOR_1)<=180){
   	 	OnFwd(OUT_A+OUT_C);
   	 }
   	 Stop;*/
   	/*ClearSensor(SENSOR_1);
   	 while(abs(SENSOR_1)<=90){
   		OnFwd(OUT_A);
		Float(OUT_C);
		Wait(40);
		OnRev(OUT_C);
		Wait(40);
   	}
   	Stop;*/
   	/*while((SENSOR_3>Bright) || (SENSOR_2>Bright)){
   		if(SENSOR_3<Bright){
   			OnRev(OUT_C);
   			Off(OUT_A);
   		}else if(SNESOR_2<Bright){
   			OnRev(OUT_A);
   			Off(OUT_C);
   		}else{
   			GOFWD(10);
   		}
   	}
   	GOREV(300);*/
   	//ClearSensor(SENSOR_1);
   	/*while(SENSOR_2 <  Bright){
   		OnRev(OUT_A);
   		Float(OUT_C);
   	}*/
   	while(SENSOR_2<Bright){
   		OnRev(OUT_A+OUT_C);
   	}
   	ClearTimer(0);
   	ClearSensor(SENSOR_1);
     	while (abs(SENSOR_1)<=450) {
     		
             	if (SENSOR_2 <  Bright) {   // çïê¸è&#8222;Ç…Ç¢ÇÈÇ&#8710;Ç´
                   	 	OnRev(OUT_A);
                    		 Off(OUT_C);
             	} 
            	else {                      // çïê¸Ç©ÇÁäOÇÍÇΩÇ&#8710;Ç´
                   		Off(OUT_A);
                  	 	OnRev(OUT_C);
             	}
   	 } 
   	 
             Stop;
               
}
/*task arm(){
	while(true){
		OnFwd(OUT_B);
	}
	Off(OUT_B);
}*/
*二個目 [#fb5f7e3b]
#define FWD_AC OnFwd(OUT_A+OUT_C);
#define FWD_A OnFwd(OUT_A);
#define FWD_C OnFwd(OUT_C);
#define REV_AC OnRev(OUT_A+OUT_C);
#define REV_A OnRev(OUT_A);
#define REV_C OnRev(OUT_C);
#define OFF_AC Off(OUT_A+OUT_C);
#define OFF_A Off(OUT_A);
#define OFF_C Off(OUT_C);
#define FLOAT_AC Float(OUT_A+OUT_C);
#define FLOAT_A Float(OUT_A);
#define FLOAT_C Float(OUT_C);
#define THRESHOLD 45
#define ARM_OPEN OnFwd(OUT_B);
#define ARM_CLOSE OnRev(OUT_B);
#define ARM_STOP Off(OUT_B);
 今回のロボコンの課題で大きな問題となるのが、この紙パックだ。当初は、追突すれば、どうにかなるかと考えていた。だが、実際にできたフィールドを見てみると左図のように、紙パックの間にすき間がなく、しかも5つの紙パックだけが丁度入る広さだったのだ。そのために、無闇にぶつかって行くと、摩擦によって周りの紙パックも一緒に内側に入り、ピンポン玉が取りにくくなってしまう。だから、私たちは上から紙パックを覆い、引き抜いて紙パックを移動させることにした(右図)。
CENTER:&emsp;&emsp;&emsp;&ref(2009b/A2/ロボコン/IMG_022200.jpg,left,around,40%,左図);&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&ref(2009b/A2/ロボコン/houshin03.jpg,right,40%,右図);
CENTER:&emsp;&emsp;&emsp;左図:紙パックの様子&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;右図:イメージ図&emsp;&emsp;
#Clear
**〜ピンポン玉を集めて入れるロボット〜[#u7417795]
''ピンポン玉を集めて入れるロボットNo.1''
#ref(2009b/A2/ロボコン/IMG_00020.jpg,left,around,65%,図1-1)
#ref(2009b/A2/ロボコン/IMG_00041.jpg,right,around,65%,図1-2)
#Clear
LEFT:図1-1
RIGHT:図1-2

 図1は私たちが長い時間をかけて作り上げたロボットである。このロボットは、集めるときにピンポン玉を持ち上げる方法を採用したロボットである。なお、1回目のロボコンに出場した。

task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_ROTATION);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	
	Wait(3000);
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<=21){
		FWD_AC;
	}
	while(abs(SENSOR_2)<=45){
		line_trace();
	}
	45r();
	OFF_AC;
	Wait(100);
	/*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
		if(SENSOR_1>THRESHOLD){
			REV_C;OFF_A;
		}else if(SENSOR_3>THRESHOLD){
			REV_A;OFF_C;
		}else{
			REV_AC;
		}
	}
	OFF_AC;
	ARM_CLOSE;
	Wait(25);
	ARM_STOP;*/
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<25){
		FWD_AC;
	}
	OFF_AC;
	Wait(100);
	ARM_CLOSE;
	Wait(50);
	ARM_STOP;
	ClearSensor(SENSOR_2);
	/*while(abs(SENSOR_2)<25){
		REV_AC;
	}*/
	while(abs(SENSOR_2)<24){
		REV_AC;
	}
	OFF_AC;
	Wait(100);
	ClearSensor(SENSOR_2);
	ClearTimer(0);
	while(SENSOR_1>THRESHOLD) {
		FWD_C;REV_A;
	}
	ClearSensor(SENSOR_2);
	while(SENSOR_3>THRESHOLD){
		line_trace1();
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<=15){
		FWD_A;REV_C;
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<30){
		line_trace1();
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<5){
		FWD_C;REV_A;
	}
	OFF_AC;
	Wait(10);
	FWD_AC;
	Wait(300);
	OFF_AC;
	ARM_OPEN;Wait(30);
	ARM_STOP;
	while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
		REV_AC;
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<=5){
		FWD_C;REV_A;
	}
	while(SENSOR_1>THRESHOLD){
		line_trace3();
	}
	while(abs(SENSOR_2)<=5){
		FWD_C;REV_A;
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<200){
		line_trace3();
	}
	OFF_AC;
	
	/*while((SENSOR_1>THRESHOLD) || (SENSOR_3>THRESHOLD)){
		line_trace();
	}
	while(SENSOR_1<THRESHOLD){
		FWD_A;REV_C;
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<=15){
		line_trace();
	}
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<=5){
		FWD_C;REV_A;
	}
	FWD_AC;Wait(300);
	OFF_AC;
	/*ARM_OPEN;
	Wait(25);
	ARM_STOP;
	while((SENSOR_1>THRESHOLD) ||(SENSOR_3>THRESHOLD)){
		REV_AC;
	}
	while(abs(SENSOR_2)<5){
		FWD_C;REV_A;
	}
	while(SENSOR_1)*/
	
	
	
	
}
CENTER: [[ピンポン玉を集めて入れるロボットNo.1のプログラム>http://yakushi.shinshu-u.ac.jp/robotics/?2009b%2FA2%2F%A5%ED%A5%DC%A5%B3%A5%F3%2F%A5%D4%A5%F3%A5%DD%A5%F3%B6%CC%A4%F2%BD%B8%A4%E1%A4%C6%C6%FE%A4%EC%A4%EB%A5%ED%A5%DC%A5%C3%A5%C8#r1d1437a]]へ
&br;&br;
CENTER:-------
&br;
''ピンポン玉を集めて入れるロボットNo.2''
#ref(2009b/A2/ロボコン/IMG_00160.jpg,left,around,60%,図2-1)
#ref(2009b/A2/ロボコン/IMG_00181.jpg,right,around,60%,図2-2)
#Clear
LEFT:図2-1
RIGHT:図2-2~
#Clear
 苦労しながら作ったロボットであったが、なぜか2回目のロボコンのときには、図2に作り変えてしまった。このときのロボットは、入れるときにピンポン玉を持ち上げる方法を採用している。
CENTER: [[ピンポン玉を集めて入れるロボットNo.2のプログラム>http://yakushi.shinshu-u.ac.jp/robotics/?2009b%2FA2%2F%A5%ED%A5%DC%A5%B3%A5%F3%2F%A5%D4%A5%F3%A5%DD%A5%F3%B6%CC%A4%F2%BD%B8%A4%E1%A4%C6%C6%FE%A4%EC%A4%EB%A5%ED%A5%DC%A5%C3%A5%C8#nf733c40]]へ

sub line_trace(){
	if(SENSOR_1<THRESHOLD){
		FWD_C;REV_A;
	}else if(SENSOR_3<THRESHOLD){
		FWD_A;REV_C;
	}else {
		FWD_AC;
	}
}
***工夫した点・苦労した点など [#w064da81]
''ピンポン玉を集めて入れるロボットNo.1''
-集めたピンポン玉を枠の中に入れるためにモーターの動力を使わないようにした点。
#ref(2009b/A2/ロボコン/IMG_00061.jpg,right,around,40%,図1-3)
#ref(2009b/A2/ロボコン/IMG_00071.jpg,right,around,40%,図1-4)
--枠に当たって、完全にゲートが開いたときのみにピンポン玉が落ちてくるようにした点。(イメージ図参照)~
  枠から離れるとまたゲートが閉じることができる。
--緩やかな傾斜をつけて、ゲートが開くとピンポン玉がスムーズに出ていくことができるようにした点。~
  図1-2で見られるように、前後のタイヤを変えてわずかな傾斜をつけるようにした。

sub line_trace1(){
	if(SENSOR_1<THRESHOLD){
		FWD_A;OFF_C;
	}else{
		FWD_C;OFF_A;
	
	}
}
sub line_trace3(){
	if(SENSOR_3<THRESHOLD){
		FWD_C;OFF_A;
	}else{
		FWD_A;OFF_C;
	
	}
}
sub 45r(){
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<5){
		FWD_A;REV_C;
	}
}
CENTER:&ref(2009b/A2/ロボコン/geta2.gif,50%,イメージ図);

sub 45l(){
	ClearSensor(SENSOR_2);
	while(abs(SENSOR_2)<5){
		FWD_C;REV_A;
	}
}
		
		
	
	
#Clear
-傾斜をつけることによって、スロープと地面の間に隙間ができてしまうため、スロープが自由に上下に動くようにした点。(下図の赤丸部分)
CENTER:&ref(2009b/A2/ロボコン/IMG_00081.jpg,50%,下図);
-触角のようなものを付けて、アームに紙パックが引っかかってしまわないようにした点。(図1-2参照)
-前と後ろに光センサーを付けることで後ろ向きでもライントレースができるようにした点。
-当初は二本のアームの中央にキャタピラを付けてアームを動かしていたが、ピンポン玉を2個以上アームが取り込もうとすると、ピンポン玉がキャタピラに引っかかってしまうために外側に設置し直した点。
-スロープの前に一つだけピンポン玉が入るように紫色の誘導を設置した点。(図1-2参照)
-最もピンポン玉を取り込みやすい位置にアームを設置することが難しかった点。
-
-

''ピンポン玉を集めて入れるロボットNo.2''
-紙パックを移動させるロボットを参考にして、アームを折りたためるようにするなどの小型化に力を入れた点。
-アームの高さを枠に当たらない位置に設置して、アームを閉じたままピンポン玉を逃がすことなく入れられるようにした点。
-アームを動かすギアの組み合わせと壁の長さを調節することが難しかった点。
-

***問題点 [#pe82b4ab]
''ピンポン玉を集めて入れるロボットNo.1''
-フィールドのスケールに対して、ロボットが大きくなりすぎた点。
-大きくなりすぎたことで、プログラムを実行したときの誤差がロボットに与える影響が大きい点。
-紙パックをアームから避けるために触角のようなものを取り付けたが、逆にそれが、アームにときどき引っかかってしまう点。
-スロープの前にピンポン玉が二つ以上入ると、上手に集めることができない点。
-

''ピンポン玉を集めて入れるロボットNo.2''
-わずかな時間で作ったために、構造がもろい点。
-アーム内に9個ピンポン玉が入ると閉じることができなくなる点。

**〜紙パックを移動させるロボット〜 [#f79d43e0]
#ref(2009b/A2/ロボコン/IMG_00100.jpg,left,around,60%,図3-1)
#ref(2009b/A2/ロボコン/IMG_00190.jpg,right,around,60%,図3-2)
#Clear
LEFT:図3-1:正面から
RIGHT:図3-2:壁の部分~
#Clear
 図3は入れるときにピンポン玉を持ち上げる方法を採用したロボットに、紙パックを移動させることができる機能を取り付けたロボットである。つまり、このロボットは、プログラムさえ組むことができれば、一台で、この課題を行うことも可能である。なお、このロボットは1回目と2回目のロボコンで大きな変更はしていない。
&br;&br;&br;
CENTER: [[紙パックを移動させるロボットのプログラム>2009b/A2/ロボコン/紙パックを移動させるロボット]]へ


***工夫した点・苦労した点など [#w064da81]
-アームを少しゆすることでパックをきちんと納めるようにした点。
-パックを左右から抑えるアームはパックを引っかけつつ、外壁には当たらない高さにセットした点。
-右に曲がることが多いので、パーツは全体的に左寄りにセットして曲がりやすくした点。
-2つの光センサーを線の太さギリギリに合わせて取り付けて、ライン上でマシンをまっすぐ向かせるようにした点。
-ウォームギアを使用して、アームが重さで勝手に下がらないようにした点。

***問題点 [#b9006d93]
-回転センサーで多くの移動距離を決めたが、それでもずれが生じる。それを補正するプログラムがない点。
-パックを掴んでいてかつカーブしてからライントレースに移る際、マシンをラインと平行に近付けてから開始しないとアームが壁に引っかかって動けなくなる点。
-ライントレースし直す時間が短いため全体的に速度が遅い点。
-ボールを入れる機構を利用しきれなかった点。

*スタート時のロボットの配置 [#vb5f0cc2]
 黄色で塗ってあるところに、紙パックを移動させるロボットを設置し、緑色で塗ってあるところに、ピンポン玉を集めて入れるロボットを設置した。~
 第1回目のピンポン玉を集めて入れるロボットの黄色の2本の線は触角のようなものを表し、こちらを前としてプログラムを書いている。
#ref(2009b/A2/ロボコン/haichi1.jpg,left,around,60%,1回目)
#ref(2009b/A2/ロボコン/IMG_00140.jpg,right,around,40%,アームの様子)
CENTER:&ref(2009b/A2/ロボコン/haichi2.jpg,right,around,60%,2回目);
#Clear
LEFT:第1回目
CENTER:第2回目
RIGHT:第2回目のピンポン玉を集めて入れるロボットのアームの様子
#Clear
*プログラム [#v757cfd6]
**ピンポン玉を集めて入れるロボット [#u3587279]
 1回目も2回目も完全にプログラムを書き終えることなく、時間切れとなってしまった。1回目のプログラムは、ロボットがフィールドに対して大きかったために、小さな誤差が大きな影響を与えてしまい、プログラムを作成することがかなり難しかった。また、1つの光センサーを利用して、ライントレースをしていたために回転センサーで同じ距離を走らそうとしても、左右の振り具合で大きな変化となってしまい、とても悩まされた。~
 2回目のプログラムは、小型化のおかげで、少し楽にはなった。だが、時間がなくピンポン玉を取った後を、実際に行えるかどうか確認をすることができなかった。このプログラムでは、なるべく同じような動きにはサブルーチンを使うようにして、プログラムを編集しやすいように、書いていった。

 [[プログラム>2009b/A2/ロボコン/ピンポン玉を集めて入れるロボット]]

**紙パックを移動させるロボット [#t63d2905]
#define eye_L SENSOR_1
#define eye_R SENSOR_3
#define  cont 45
#define time 2
#define new_count ClearSensor(SENSOR_2) 
sub follow_line() 
{
	if ((eye_L >= cont ) && (eye_R >= cont )){
		OnRev(OUT_A+OUT_C); Wait(time); Off(OUT_A+OUT_C); 
	}
	else if ((eye_L >= cont ) && (eye_R  <= cont )){
		OnRev(OUT_A); Wait(time); Off(OUT_A);
	}
	else if ((eye_L <= cont ) && (eye_R >= cont )){
		OnRev(OUT_C); Wait(time); Off(OUT_C); 
	}
	else {
		OnRev(OUT_A+OUT_C); Wait(time); Off(OUT_A+OUT_C); 
	}
}
 こちらは、一応戻ってくるところまでできた。多くの動きを回転センサーの値を利用してロボットをコントロールするようにした。また、紙パックを持って右折することが、前に突出しているためにかなり難しかった。

task main ()
{
	SetSensor(eye_L, SENSOR_LIGHT);
	SetSensor(eye_R, SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_ROTATION);
	Wait(20);
new_count;
	while ( abs(SENSOR_2) <= 35 )
		{
		follow_line();
		}
 Off(OUT_A+OUT_C); Wait(50);
new_count;
	while ( abs(SENSOR_2) <= 3 )
		{OnRev(OUT_A); OnFwd(OUT_C);}
OnRev(OUT_A); OnFwd(OUT_C); Wait(5);
OnRev(OUT_A+OUT_C); Wait(45); Off(OUT_A+OUT_C); Wait(100);
OnRev(OUT_B); Wait(200); Off(OUT_B); Wait(100);
OnFwd(OUT_A); OnRev(OUT_C); Wait(15); 
OnRev(OUT_A); OnFwd(OUT_C); Wait(15);   Off(OUT_A+OUT_C);
OnFwd(OUT_A+OUT_C); Wait(60); Off(OUT_A+OUT_C); Wait(100);
 [[プログラム>2009b/A2/ロボコン/紙パックを移動させるロボット]]

new_count;
	while ( abs(SENSOR_2) <= 3 )
		{
		OnFwd(OUT_A); OnRev(OUT_C);
		}
Off(OUT_A+OUT_C); Wait(100);
OnFwd(OUT_A); OnRev(OUT_C); Wait(10);
OnRev(OUT_A); OnFwd(OUT_C); Wait(10);   Off(OUT_A+OUT_C);
OnRev(OUT_A+OUT_C); Wait(5); Off(OUT_A+OUT_C); Wait(100);
OnFwd(OUT_A); OnRev(OUT_C); Wait(5); Off(OUT_A+OUT_C);
new_count;
	while ( abs(SENSOR_2) <= 27)
		{
		follow_line();
		}
PlaySound(1); Off(OUT_A+OUT_C); Wait(100);
new_count;
	while ( abs(SENSOR_2) <= 10)
		{
		OnFwd(OUT_A+OUT_C); 
		}
Off(OUT_A+OUT_C); Wait(100); 
OnRev(OUT_A); OnFwd(OUT_C); Wait(30);   Off(OUT_A+OUT_C);
Off(OUT_A+OUT_C);  Wait(20); 
OnRev(OUT_A+OUT_C); Wait(30); Off(OUT_A+OUT_C); Wait(50);
new_count;
	while ( abs(SENSOR_2) <= 45  )
		{
		follow_line();
		}
Wait(50); OnFwd(OUT_A+OUT_C); Wait(20); Off(OUT_A+OUT_C);
	repeat(3)
		{
		OnRev(OUT_A); OnFwd(OUT_C); Wait(5); Off(OUT_A+OUT_C); Wait(50);
		OnRev(OUT_A+OUT_C); Wait(10); Off(OUT_A+OUT_C); Wait(50);
		OnRev(OUT_A); OnFwd(OUT_C); Wait(10); Off(OUT_A+OUT_C); Wait(50);
		}
		
PlaySound(1); Off(OUT_A+OUT_C);
new_count;
	while ( abs(SENSOR_2) <= 51 )
		{
		follow_line();
		}
OnFwd(OUT_B); Wait(190); Off(OUT_B); Wait(100);
OnFwd(OUT_A+OUT_C); Wait(40); Off(OUT_A+OUT_C);
PlaySound(1); Off(OUT_A+OUT_C);
new_count;
	while ( abs(SENSOR_2) <= 3 )
		{
		OnRev(OUT_A); OnFwd(OUT_C);
		}
Off(OUT_A+OUT_C);
OnRev(OUT_A); OnFwd(OUT_C); Wait(7);
Off(OUT_A+OUT_C); Wait(20);
new_count;
	while ( abs(SENSOR_2) <= 45 )
		{
		follow_line();
		}
OnRev(OUT_C); Wait(80);
OnRev(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C);
}
*感想 [#h7614571]
〜kata〜~
 回転センサーに頼りすぎたかもしれない。しかし時間でモーターを操作しても電池の電圧で移動距離が変化してしまうため、これも使いづらい。パックを運ぶマシンでは二回電池を新品に取り換えたが、そのたびにプログラムを変更しなければならなかった。誤差を無くすまたは小さくするプログラムと回転センサーを組み合わせるようにするべきだった。

** [#e7a10b86]
*感想(ロボコンを終えて) [#ob2b7f89]
〜PuKKu〜~
 時間が限られている中で、プログラムを作成することはとても大切なことだと感じた。なぜなら、今回のピンポン玉を収集するロボットは、実際に試したのは両方とも途中までだった。いくら素晴らしいロボットが作成できたとしても、プログラムがなくては動くことができない。だがら、プログラムはロボットの製作時間よりも長く時間をかけて、ロボットをコントロールできるようにする必要があることが分かった。そして、実際使用する場の大きさをきちんと把握して、その場にあったものを製作することがとても大切だと思った。

〜ゆあ〜~
今回のロボコンではフィールドに対してのロボットの大きさをよく考えずに作ってしまったのが失敗の原因だと思う。小さいロボットで細かい制御をする方が大きいロボットで一度に取るより確実性があることを学んだ。
また、時間内に完成させることができず、先生やほかのグループに迷惑をかけてしまった。時間管理をしっかりすることも成功のために重要なことであると感じた。
*コメント [#o919465d]
- まだ終わっていないみたいなので、採点しませんでした。結構力を入れているみたいなので最後まで頑張ってください。 -- [[FI]] &new{2010-02-18 (木) 15:51:42};

#comment


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