[[2009b]]
CENTER:&size(30){課題3:光を追いかけてブロックを投げるロボット};

*概要 [#rf9030ff]

インストの「top secret」を参考にして、白いホイールを(2個以上)連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)

1.全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる。方向を定めたのち、懐中電灯の30cm以内に近づかない範囲で必要な距離を移動してもよい。懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。
 
2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
 
3.懐中電灯を動かしたとき懐中電灯に向かって進み、見失った時には再び全方向から懐中電灯を探しだす。7秒以上追尾できたら懐中電灯に向かってブロックを投げる。

懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。

僕らが今回作るのはオトナのオ・モ・チャ(はあと

*メンバー [#ab98eb01]

ゆうたろう&br;
NISHI


目次
#contents

*マシン [#q44a730d]

**台車 [#q0d25d76]

 今回、ディファレンシャルギア(作動装置)を用いた台車を使用する。
&ref(differential_gear.jpg,left,ディファレンシャルギア);
ディファレンシャルギアとは?・・・モーター1個で左右のホイールを動かせるようにした装置。モーターの回転の向きで左右のホイールの回転が変わる。また、左右のホイールの回転数の違いを許容でき、スムーズな方向転換や旋回を可能にする。左の写真では&br;




**投射機 [#jca9e026]
 
 今回、白ホイールをとばすだけでなく連射機能も兼ね備えた投射機の作成が課題である。よって、投げる方式よりも打ち出す方式の方が良いと考えた。&br;
 理由は2つあり、まず投げる方式だと連射できるようにするためにはモーター1個では困難であり、2個使う必要性が発生するため。さらに、モーターを2個搭載するとマシンがおもくなってしまうことである。&br;
 以上のことから、投射機は打ち出す方式が理想的であると判断した。

&ref(arm_rensha.jpg,left,アームと連射機);

 弾を打ち出すアームと連射機          



***工夫した点 [#e670147f]
 
 今回、台車に使用するモーターは1個でありマシンが重すぎると動かなくなってしまう恐れがある。強度を優先すればマシンは重くなってしまう、マシンの軽さを優先すると強度がなくなる。強度と重量のバランスを考慮にいれて投射機を作成した。

&ref(mashine_heavy.jpg,left);   
&ref(mashine_right.jpg,right);&br; 
 before                      after&br;
頑丈だが重い・・・           強度は減ったがそれなりの強度を保ち軽くした
頑丈だが重い・・・           強度は減ったが軽くした。強度は充分ある


*プログラム [#zacd5c9a]

**ゆうたろう [#hee2bf24]
task main()
{
SetPower(OUT_C,6);
int light_max=0;
int t_max=0;
SetSensor(SENSOR_1,SENSOR_LIGHT);
 task main()
 {
 SetPower(OUT_C,6);             //アームのパワーを6に設定

OnRev(OUT_A);
Wait(1500);

ClearTimer(0);

while(Timer(0) <= 1500)
{
if(SENSOR_1 > light_max)
{
OnFwd(OUT_A);
Wait(20);
Off(OUT_A);
light_max=SENSOR_1;
t_max=Timer(0);
}

repeat(4)
{
OnRev(OUT_C);
Wait(22);
Off(OUT_C);
Wait(100);
}
}
}



 int light_max=0;             
 int t_max=0;
 SetSensor(SENSOR_1,SENSOR_LIGHT);        //
 
 OnRev(OUT_A);
 
 ClearTimer(0);
 
 while(Timer(0) <= 1500)
 {
 if(SENSOR_1 > light_max)                 //
 {
 OnFwd(OUT_A);
 Wait(20);                                //
 Off(OUT_A);                              //
 light_max=SENSOR_1;
 t_max=Timer(0);
 }
 
 repeat(3)
 {
 OnRev(OUT_C);
 Wait(22);
 Off(OUT_C);
 Wait(100);                               //白ホイールを投射
 }                                        
 }
 }
 
 
 
**NISHI [#c7913ed0]

 #define LW 45                           //光量の最低値を50に設定
 #define LS 65                      //最大値を70に設定
 #define Th OnRev(OUT_C); Wait(17); Off(OUT_C);      //弾を発射
 task main(){
	SetSensor(SENSOR_1,SENSOR_LIGHT);     
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	
	while(true){                                   //センサーが
		if((SENSOR_1>LW)&&(SENSOR_3>LW)){     //両方50以上なら
		OnFwd(OUT_A);Wait(34);                 //前進する
		OnRev(OUT_A);Wait(30);}
		else if((SENSOR_1>LW)&&(SENSOR_3<LW)){ //1だけ50以上なら
		OnFwd(OUT_A);}                         //右折する
		else if((SENSOR_1<LW)&&(SENSOR_3>LW)){ //3だけ50以上なら
		OnRev(OUT_A);}                         //左折する
		else if((SENSOR_1>LS)&&(SENSOR_3>LS)){ //両方70以上なら
		Off(OUT_A);Wait(400);            //4秒停止して
		until((SENSOR_1>LS)&&(SENSOR_3>LS)){   //70以上のままなら
		Th} break;}                  //弾を発射する
		}
	Off(OUT_A+OUT_C);
	
	}

自分は、プログラム2の方を担当した。

前期の人のプログラムやそれに対する先生方のコメントを参考に作成してみた。

*感想 [#c151d74a]

**ゆうたろう [#h8cd466f]
今回、マシンの投射機に連射機能を持たせなければならず、結構苦労した。プログラムは過去の人のものを参考にして作った。

**NISHI [#zb52973e]

今回、ロボ・プログラム共に何かを参考にしてばかりでオリジナリティがほぼないのが少々罪悪感。

ただ、基は早くできても問題点の解決は自分でしなければいけなかったのでそれが難儀だった(そんなに変わってないけどね〜)。

*コメント [#nf8104ca]

#COMMENT


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