*ライントレースロボット [#oc0f9745]
目次
#contents


*課題 [#c1ecc07c]
 黒い線に沿って走るロボットの製作、ただし以下の事に注意する
~ 1 速さと正確さの追求
~ 2 交差点で優先道路を走ってない場合には、一時停止をする
~&ref(2007b/A5/課題2右/い.jpg);
~ 3 前方にあるロボットと衝突した場合、相手のロボットが離れるのを待つこと
*ロボット紹介 [#f3914037]
まずキャスターをつけ3輪駆動にする事にした。この方が曲がりやすく回転も容易にできると思ったからだ。
~バンパーはシングルバンパーにしてマシンのよけいな部分を剥ぎ落とした。

~&ref(2007b/A5/課題2右/車輪.jpg);   &ref(2007b/A5/課題2右/071204_165731.jpg);                                        &ref(2007b/A5/課題2右/全体.jpg);       
~前輪駆動にすることでセンサの反応が後輪駆動にするより早い。よって小回りを利かせた走行が可能となった。
~ &ref(2007b/A5/課題2右/はね.jpg);
~マシンの形状としては3輪で走る意外はノーマルなタイプとなった。
**光センサーの取り付け [#x4328df2]
~&ref(2007b/A5/課題2右/せんさ.jpg);               &ref(2007b/A5/課題2右/光2.jpg);
~2つの光センサーで黒い線を挟むような『挟み型』を採用。 右の光センサが反応することで右に曲がり、左センサが反応することで左に進みます。両方白を感知するときはまっすぐ進むのです。
~メリットとして黒線からはみ出たときに反応が早い。比較的楽に曲がる事ができます
~デメリットとしては交差点に止まれの線がないと
光センサが認識しないという欠点があります。つまり全てのコースに対応するという訳でないということです。


**問題 [#re7e363d]
今回の課題で以下の問題が発生した
 1 急なカーブに対応できるか?
 2 交差点を通るためのプログラムはどうするか?
 3 まっすぐに進まないマシン
~1の問題は我々の無計画なコース作りに問題があった。マシンの性能を知らずにコースを作ったので急なカーブ多く、交差点前でもカーブがある。急カーブでマシンが脱線してしまった。
~2交差点を通るプログラムは両方のセンサーが同時に白を感知した回数を数え、3数えると元のループに戻るものだったが、交差点の前にカーブがあり停止線に曲がって止まるようになってしまった。そのまま進むと渡った後元のループに戻らなかった。
~3我々のマシンはなぜか左に曲がってしまう。

**1の問題解決 [#z058dc73]
まず急カーブの問題を解決するためにモータを密着させマシンの幅を限界まで狭くした。                                          こうする事で小回りを利かすようにしたのである。   
~また前方に駆動輪を設置することによって後方に設置するよりも早く反応し小回りの良さが上がった。
~そしてカーブするときに片方のモーターを止める事で急カーブにも対応できるようにした。    
~&ref(2007b/A5/課題2右/もーた2.jpg);

**2の問題 解決[#of1d254b]
2の問題は白を2回感知した後、ずれていたら修正するようにプログラムを直した。
***交差点を渡るプログラム [#i903f892]
 x=0;
			while(x<3){
			if(SENSOR_2==1){         //タッチセンサーが感知したらループから抜け出します
				break;
				}
				if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){     //黒を感知するまで進みます
	 			until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD)||(SENSOR_2==1));
				x++;                            //白を感知した回数を数えます
				}else if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){      //白を感知するまで進みます
				if(x<2){
				until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
				}else{
				until((SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)||(SENSOR_2==1));
				x++;
				}

***片方が交差点の黒線から外れたときの修正プログラム [#w4ce0450]
 else if((SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD)&&(x==2)){                    //左が感知したら左に曲がります
	 			
 Off(OUT_A);
	 			
 OnFwd(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){      //両方が白を感知するまで進みます
	 	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
	 	x=3;
	 	}else if((SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD)&&(x==2)){ //右が感知したら右に曲がります。
		OnFwd(OUT_A);
 		Off(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
		 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){ //両方が白を感知するまで進みます
	 	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
	 				}
			  x=3;
~こうすることでもし黒線を片方だけ感知しても修正してくれます

**3の問題解決[#y0595e86]
~3の問題は直進できるようにするためにSetPowarをつかいモーターの速度の微調整をする事で解決した。
しかしそれでも完全に直進しない
 task main(){
      SetPower(OUT_A,7); //左のモータ出力7
      SetPower(OUT_C,4);   //右のモータ出力4



*コース紹介 [#qa623e67]
~コースは全体的にカーブが多く2つの交差点を設けてある(直線がほとんどない)
~全体写真
~&ref(2007b/A5/課題2右/こーす.jpg);
~交差点前に急カーブがある。おかげでマシンの性能が問われるようなコースにした
~交差点写真
~&ref(2007b/A5/課題2右/こうさ.jpg);

*プログラム [#b7d4e8c8]
~アームセンサが反応した時に以下の3種類の対応を見せる 
**&#9312;3秒間停止して待つ [#l4544280]
 Off(OUT_A+OUT_C);
 	Wait(300);    //3秒停止
**&#9313;その場で1回転だけ360度旋回する [#r276ca44]
 OnFwd(OUT_A);         //左モータ正回転
	OnRev(OUT_C);       //右モータ逆回転
	if(SENSOR_3<THRESHOLD){                                                    //もしセンサ3が白を感知していたら
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);//両方が黒を感知するまで
		}
	until(SENSOR_3<THRESHOLD);
	until(SENSOR_3>THRESHOLD);
	until(SENSOR_3<THRESHOLD);
**&#9314;180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る [#b1c0318f]
 OnFwd(OUT_A);
 	OnRev(OUT_C);
 	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
 		}
	hurimuki();
		OnFwd(OUT_A);
	 	OnRev(OUT_C);
 		until (SENSOR_3<THRESHOLD);
 	}

**&#9312;&#9313;&#9314;の複合とプログラムの全体 [#nc793bf8]
 #define THRESHOLD 40     //光感知のための数値です
 #define return_time 50     //5秒戻るための数値です
 int x,y=0;
 sub hurimuki(){                              //5秒戻るときのサブルーチンです
 	until (SENSOR_3<THRESHOLD);
	ClearTimer(0);
	while(Timer(0)<return_time){
	OnFwd(OUT_A);
	OnFwd(OUT_C);
	until(SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD );
	if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
 	Off(OUT_A);
 	OnFwd(OUT_C);
                                                                                       
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
	 OnFwd(OUT_A);
	 Off(OUT_C);
                                                                                        
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 	}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
 	Off(OUT_A+OUT_C);
 	Wait(200);
 	OnFwd(OUT_A+OUT_C);
	x=0;
 	while(x<3){
 	if(SENSOR_2==1){
 	break;
 	}
 	if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
        until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD));
 	          x++;
 	}else if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){
          until((SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 	}else if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
            Off(OUT_A);
	OnFwd(OUT_C); 
            
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
	 	x--;
		}else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
		OnFwd(OUT_A);
		Off(OUT_C);
            until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD));
 		x--;
 			}
 			}
 		}
 	}
  }
 void atattara(){   //バンパーにあたったら何をするかです。一周ごとに仕事が違います。
	if(y<=2){
 	Off(OUT_A+OUT_C);
 	Wait(300);
 	}else if(y>2&&y<=4){
 	OnFwd(OUT_A);
 	OnRev(OUT_C);
 	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
 		}
 	until(SENSOR_3<THRESHOLD);
 	until(SENSOR_3>THRESHOLD);
 	until(SENSOR_3<THRESHOLD);
 	}else {
 	OnFwd(OUT_A);
 	OnRev(OUT_C);
 	if(SENSOR_3<THRESHOLD){
	until(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD);
 		}
	hurimuki();
		OnFwd(OUT_A);
	 	OnRev(OUT_C);
 		until (SENSOR_3<THRESHOLD);
 	}
  }
 task main(){
      SetPower(OUT_A,7);
      SetPower(OUT_C,4);
 	SetSensor (SENSOR_1,SENSOR_LIGHT);
 	SetSensor (SENSOR_3,SENSOR_LIGHT);
 	SetSensor(SENSOR_2,SENSOR_TOUCH);
 while(true){
 		if(SENSOR_2==1){   //バンパーが感知すると作動します。いつでも作動します
 		atattara();
 		}
	 	OnFwd(OUT_A);
	        OnFwd(OUT_C);
  until((SENSOR_1<THRESHOLD|| SENSOR_3< THRESHOLD )||(SENSOR_2==1));//どちらかのセンサーが黒を感知するまで走ります
	 if(SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD){
	 Off(OUT_A);
         OnFwd(OUT_C);
                
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 }else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){
	 OnFwd(OUT_A);
	 Off(OUT_C);
                 
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
 		}else if(SENSOR_3< THRESHOLD&&SENSOR_1< THRESHOLD){
 	Off(OUT_A+OUT_C);
 	Wait(200);
 	OnFwd(OUT_A+OUT_C);
 	x=0;
 	while(x<3){
 	if(SENSOR_2==1){          //タッチセンサーが感知したらループから抜け出します
 	break;
 	}
  if(SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD){         //黒を感知するまで進みます
        until((SENSOR_1<THRESHOLD||SENSOR_3<THRESHOLD)||(SENSOR_2==1));
 	x++;                        //白を感知した回数を数えます
  }else if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){  //白を感知するまで進みます
 	if(x<2){
 	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
 	}else{
 	until((SENSOR_1>THRESHOLD||SENSOR_3>THRESHOLD)||(SENSOR_2==1));
 	x++;
 	}
 	}else if((SENSOR_1<THRESHOLD&&SENSOR_3> THRESHOLD)&&(x==2)){  //左が感知したら左に曲がります
	Off(OUT_A);
	OnFwd(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));//両方が白を感知するまで進みます
	 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));
			}
	x=3;
	 }else if((SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD)&&(x==2)){ 
	 OnFwd(OUT_A);
 	 Off(OUT_C);
 until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD)||(SENSOR_2==1));
	 if(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD){
	until((SENSOR_1>THRESHOLD&&SENSOR_3>THRESHOLD)||(SENSOR_2==1));              //両方が感知するまで進みます
		}
	x=3;
 	}
  if(x==2){
 	y++;
 	 }
         }
	}
  }
 }
このプログラムは1週するごとにアームセンサの反応する内容が違います。1週目は3秒止まる。2週目は1回転。3週目は180度回転後、5秒間逆走し再び元に戻ります。&#9312;&#9313;&#9314;を掛け合わせた走りをします
*結果 [#d047c3d0]
他班のロボットと走行させたところバンパーが高すぎた。これだと横からの反応に弱く衝突したときに飛ばされてしまい、コースからはずれてしまう。そこでバンパーの範囲を広くし、バンパーの高さを低くした。
*まとめ [#c1c725bd]
**工夫したところ [#c394cd7d]

~三輪駆動にすることで曲がりやすくしたところ
~小回りのきく幅にしたところ
~交差点で曲がっても戻るようにしたところ
~バンパーの反応が1週ごとに異なること
**苦労したところ [#u2355ff6]
交差点でずれても修正するプログラムを考えるのがつらかった

~コースがカーブだらけなので調整が大変でした

*感想 [#y34db20c]
コース作りのときもっと計画的に作ればよかったと深く反省する。おかげでプログラム製作が大変だった。
バンパーの反応が1週ごとに異なる動作をする。ここが1番の他班のとの違いだと自負する。  

*コメントをどうぞ [#y073999a]
#comment

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