#contents

*課題3の内容とルール [#tfe55046]


*ロボットの概要 [#xf9efff3]
後輪駆動です。
後ろのタイヤ2つと前につけた棒の3点で支えています。
#ref(./CA3C0286.JPG,100%,)

投げる装置

#ref(./CA3C0287.JPG,100%,)

***モーター1つで方向転換できる仕組み [#ca63015a]
ディファレンシャル・ギアとラチェットを用いて考えられる方法

+左右のタイヤの回転方向は同じ+ラチェットは1つ →直進可、方向転換一方向のみ可
+左右のタイヤの回転方向は逆+ラチェット2つ   →直進不可、方向転換左右とも可


(2)を採用。


#ref(./CA3C0288.JPG,100%,)

**製作過程 [#of227fff]
-初めはキャスターを使っていた。しかしキャスターがうまく動かず、摩擦を大きくする原因になってしまった。

  キャスターの改良もしたが、試しに棒一本を使ってみたところ上手くいったので、採用することにした。



-タイヤが空回りしてしまうという問題があった。後輪の摩擦を大きくすることで解決をはかった。

  実際には、1,RCXを後ろ寄りにつける 2,前の棒を長めにする という方法をとった。

*プログラム [#z47e3adb]

***光センサ1つでライントレースする仕組み [#z6388ae2]

 #define THRESHOLD 40				//しきい値
 task main(){
 	SetSensor(SENSOR_1, SENSOR_LIGHT);	//センサー1定義(ライントレース用)
 	while(1){
 		if(SENSOR_1<THRESHOLD){		//最初にライン上(黒)の場合
 			OnFwd(OUT_C);Wait(15);		//左に逸らす
 			if(SENSOR_1>THRESHOLD){		//ライン外(白)の場合
 				OnRev(OUT_C);Wait(15);	//右に逸らす
 			}
 		}
 	}
 	Off(OUT_C);
 }

ディファレンシャル・ギアを使うと直進が出来ないため、ジグザクに進ませるようにしました。

**松澤(追跡あり) [#k84a262e]

 #define THRESHOLD 40			//しきい値
 #define RUN_TIME 500			//相手を探す時間
 int s=0;					//打つ回数の変数
 void shoot(){	//弾を打つ関数
 	OnFwd(OUT_A);	//一度引く
 	Wait(5);
 	OnRev(OUT_A);	//打つ
 	Wait(5);
 	OnFwd(OUT_A);	//引く
 	Wait(5);
 	Off(OUT_A);
  	s++;					//sをインクリメント
 }
 task main(){
	SetSensor(SENSOR_1, SENSOR_LIGHT);	//センサー1定義(ライントレース用)
 	SetSensor(SENSOR_3, SENSOR_LIGHT);	//センサー3定義(相手の探索用)
 	int l=0;			//入力された光の値用の変数
 	int l_max=0;			//光の最大値用の変数
 	while(s != 2){		//弾を2回打つまで繰り返す(2回打たなければ終わらない)
 		ClearTimer(0);		//Timer(0)をリセット
 		while(Timer(0)<=RUN_TIME){	//相手を探すループ
  			if(SENSOR_1<THRESHOLD){		//最初にライン上(黒)の場合
				OnFwd(OUT_C);Wait(15);		//左に逸らす
 				repeat(2){PlaySound(SOUND_CLICK) ;}
 				if(SENSOR_1>THRESHOLD){		//ライン外(白)の場合
 					OnRev(OUT_C);Wait(15);	//右に逸らす
 				}
 			}
 			if(SENSOR_3>60){		//蛍光灯か相手の光かを判断する(ある程度光が当たっていたら)
 				l=SENSOR_3;			//lに観測値を代入
 				if(l>l_max){		//入力値が観測最大値よりも大きかったら
 					l_max=l;	//l_maxに観測値lを代入(l_maxを更新)
 				}
 			}
 		}
 		if(SENSOR_3>=((l_max-5)||(l_max+5))){	//SENSOR_3がl=max(相手の光)を感知したら[誤差±5]
 			repeat(16){			//5秒間追跡する
 				OnFwd(OUT_C);Wait(15);
 				OnRev(OUT_C);Wait(15);
 			}
 			shoot();		//弾を打つ
 		}
 		PlaySound(SOUND_UP);
 	}
 	Off(OUT_C);
 }

**伊藤 [#re7d4db2]

 task main()
 {
     SetSensor(SENSOR_1,SENSOR_LIGHT);
     SetSensor(SENSOR_3,SENSOR_LIGHT);
  while (1)
  {
   if (SENSOR_3<40)			//ライントレース
   {OnRev(OUT_C);
    Wait(25);
    if (SENSOR_3>40)
    {OnFwd(OUT_C);
     Wait(25);
     }
    }
   if (SENSOR_3>45)			//光センサ45以上の時
   {OnFwd(OUT_A);			//弾を打つ				
    Wait(20);
    Off(OUT_A);
    OnRev(OUT_A);
    Wait(20);
    Off(OUT_A);
   }    
  } 
 }
 
 
*反省 [#lb11e93d]

**松澤 [#s2d03151]

**伊藤 [#h649d1e2]

*コメント欄 [#de1d6748]


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