AからCまで行くのロボット及びプログラムを制作した。
#ref(2015a/Member/uworks/Mission2/s_S__30285831.jpg)
*ハードウェア [#g7f6889d]
前輪駆動、後輪をキャスターにしたロボットを制作した。そして光センサーを駆動輪近くにすることや、左右のタイヤの距離をできるだけ小さくして旋回半径を小さくすることによってライントレースの精度を高めた。ボールの回収はタッチセンサーを用いて捕獲する仕組みにした。
#ref(2015a/Member/uworks/Mission2/s_S__30285834.jpg)
センサーの位置をタイヤから近くに配置してラインの識別を早く、地面から近くすることでセンサーの読み取る値に信頼性をもたせた。


*ソフトウェア [#t11159cd]
**ライントレース [#t06e4f74]
ライントレースのプログラムはハードウェアで工夫をしたため基本的なプログラムである。しかし三叉路及び交差点では極端に白色を認識する時間が長くなることがなかったため「三叉路及び交差点」を識別しようとすると急カーブのところで反応したり、三叉路及び交差点を識別できない等の問題が発生した。そのためタイマーを用いてロボットが三叉路及び交差点の近くにいるであろう時間帯のみで三叉路及び交差点の識別を有効にしたらうまく行った。
**ボール捕獲 [#p72d6be8]
変数iを用いることによってボールを捕獲したらタッチセンサーが反応してもアームを動作察せないプログラムを制作した。

以下プログラム
 task main(){
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_1,SENSOR_TOUCH);
 int i = 0;
 int j = 0;
 int T = 0;
 int T = 0;//プログラム開始からの時間
 ClearTimer(1);
 while(1){
 	if(SENSOR_1 == 1){
 	if(SENSOR_1 == 1){//タッチセンサーの識別(一回のみ)
			i++;
			ClearTimer(0);
		}
		if(i == 1){
			OnFwd(OUT_B);
			OnFwd(OUT_B);//ボール捕獲
			Wait(50);
			Off(OUT_B);
			i++;
			ClearTimer(0);
		}
  if(SENSOR_2 > 50 && SENSOR_2 <55){
  if(SENSOR_2 > 50 && SENSOR_2 <55){//以下ライントレース
   OnRev(OUT_A);
   Off(OUT_C);
   ClearTimer(0);
   }if(SENSOR_2 >56){
   	int t = FastTimer(0);
   	int t = FastTimer(0);//白色を認識する時間
   	int T = FastTimer(1);
   	if((T > 1000 && T < 1800) || (T > 2500 && T <3300)){
	   	if(t >20){
   	if((T > 1000 && T < 1800) || (T > 2500 && T <3300)){//三叉路及び交差点があるであろう時間帯
	   	if(t >20){//三叉路及び交差点
   			PlaySound(SOUND_UP);
   			Off(OUT_AC);
   			Wait(200);
  			ClearTimer(0);
  	   	}else{
   			OnRev(OUT_A);
   			OnFwd(OUT_C);
   		}
   	}
   	if(T > 3700){
   	if(T > 3700){//最後のT字路
   		if(t > 20){
   			PlaySound(SOUND_UP);
   			Off(OUT_AC);
   			OnFwd(OUT_B);
			Wait(50);
			Off(OUT_B);
   			OnRev(OUT_AC);
   			Wait(100);
   			Off(OUT_AC);
   			Wait(1000);
   			ClearTimer(0);
   		}else{
   			OnRev(OUT_A);
   			OnFwd(OUT_C);
   		}
   	}else{
   		OnRev(OUT_A);
		OnFwd(OUT_C);
   	}
   }   
   else if(SENSOR_2 < 49 && SENSOR_2 >45){
   	OnFwd(OUT_A);
   	OnRev(OUT_C);
   	ClearTimer(0);
   }
   else if(SENSOR_2 < 40){
   	OnRev(OUT_AC);
   	ClearTimer(0);
   }	
   else{
   OnRev(OUT_C);
   Off(OUT_A);
   ClearTimer(0);
  }
 }
}
 }



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