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

*概要 [#rf9030ff]

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

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

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

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

*メンバー [#ab98eb01]

ゆうたろう&br;
NISHI


目次
#contents

*マシン [#q44a730d]

**台車 [#q0d25d76]

今回、ディファレンシャルギア(作動装置)を用いた台車を使用する。

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





CENTER:&ref(gear_left.jpg,left,マシン左部のギア); &ref(gear_right.jpg,right,マシン右部のギア);&br;
CENTER:マシン左側        マシン右側
&br;







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

CENTER:&ref(arm_rensha.jpg,left,アームと連射機);  
&ref(ret.jpg,right,投射機の全体像);

CENTER: 弾を打ち出すアームと連射機        
投射システム
投射システム&br;&br;


''〜問題点〜''&br;
ホイールは4個搭載できるが4個だと弾の軌道が3、4発目あたりから安定しなくなる。だが、3個搭載だと軌道が安定する。よって、3個搭載が基本になってしまった。&size(6){&color(gray){4個搭載できるのに・・・};};&br;
改良できれば良かったが、時間がなかった。&size(5){&color(gray){だからA2Lのパクりじゃないって!};};



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

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

&size(5){&color(gray){おい、A2Lの劣化版とか言った奴出てこい};};


*プログラム [#zacd5c9a]

**ゆうたろう [#hee2bf24]
 #define RUN_TIME 100                     //プログラムの稼働時間を1秒に設定
 #define RUN_TIME 100                          //プログラムの稼働時間を1秒に設定
 
 task main()
 {
 SetPower(OUT_C,6);             //アームのパワーを6に設定
  SetPower(OUT_C,6);                 //アームのパワーを6に設定
 
 int light_max=0;             
 int t_max=0;
 SetSensor(SENSOR_1,SENSOR_LIGHT);        //光センサー1を設定
  int light_max=0;             
  int t_max=0;
  SetSensor(SENSOR_1,SENSOR_LIGHT);            //光センサー1を設定
 
 OnRev(OUT_A);
   OnRev(OUT_A);
 
 ClearTimer(0);                           //クリアタイマーをセット
   ClearTimer(0);                              //クリアタイマーをセット
 
 while(Timer(0) <= RUN_TIME)
 {
 if(SENSOR_1 > light_max)                 //光が最大の方向があったら
 {
 OnFwd(OUT_A);
 Wait(20);                                
 Off(OUT_A);                              //打ち出す方向へむく
 light_max=SENSOR_1;
 t_max=Timer(0);
 }
       {
        if(SENSOR_1 > light_max)               //光が最大の方向があったら
                  {
                   OnFwd(OUT_A);
                   Wait(20);                                
                   Off(OUT_A);                 //打ち出す方向へむく
                   light_max=SENSOR_1;
                   t_max=Timer(0);
                  }
  
 OnRev(OUT_C);
 Wait(22);
 Off(OUT_C);                               //ホイールを打ち出す
              OnRev(OUT_C);
              Wait(22);
              Off(OUT_C);                       //ホイールを打ち出す
           }
 }
 }

回って投げる!それだけ!!&br;
このプログラムでint t_maxの必要性が感じられない
 
 
 
**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以上なら
	while(true){
		if((SENSOR_1>LW)&&(SENSOR_3>LW)){     //ライトが前にあるなら
		OnFwd(OUT_A);Wait(34);                 //前進する
		OnRev(OUT_A);Wait(30);}
		else if((SENSOR_1>LW)&&(SENSOR_3<LW)){ //1だけ50以上なら
		else if((SENSOR_1>LW)&&(SENSOR_3<LW)){ //右に移動したら
		OnFwd(OUT_A);}                         //右折する
		else if((SENSOR_1<LW)&&(SENSOR_3>LW)){ //3だけ50以上なら
		else if((SENSOR_1<LW)&&(SENSOR_3>LW)){ //左に移動したら
		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以上のままなら
		else if((SENSOR_1>LS)&&(SENSOR_3>LS)){ //ある程度近づいたら
		Off(OUT_A);Wait(400);            //ライトが動かないことを確認
		until((SENSOR_1>LS)&&(SENSOR_3>LS)){   //動いていなければ
		Th} break;}                  //弾を発射する
		}
	Off(OUT_A+OUT_C);
	
	}

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

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

*感想 [#c151d74a]

**ゆうたろう [#h8cd466f]
今回、マシンの投射機に連射機能を持たせなければならず、結構苦労した。プログラムは過去の人のものを参考にして作った。
今回、マシンの投射機に連射機能を持たせなければならず、結構苦労した。プログラムは過去の人のものを参考にして作った。あと投射システムをA2Lからパクッてません。あれ家で作ってきたんだから。偶然だって!偶然!!&size(5){&color(gray){大体、A2Lが俺をパクッたんだ。どこまでも卑怯なA2Lめ、いつか滅ぼしてやる};};

**NISHI [#zb52973e]

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

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

*コメント [#nf8104ca]
-全体的に書くべきことは書けています。 一人目に関しては、変数をせっかく設定しているのでそれをうまく使いましょう。変数を用いて、光の最大値を探す課題であるので。二人目に関しては、やりたいことは何となくわかるのですが、もう少し説明を加えましょう。つまり、どういう意図・判断で命令を実行させているのかをはっきりさせてください。 -- [[FI]] &new{2010-01-27 (水) 00:49:29};
- 全体的にわかりやすくなっていますが、お二人とも、プログラムがやや見にくいです。インデントは(http://ja.wikipedia.org/wiki/字下げスタイル)あたりを参考に見やすさを心がけてください。ゆうたろうさんのプログラムの方では、例えば「t_max=Timer(0);」の文に対して「○○をt_maxにとっておく」のように、変数が何をするものなのかを書いてください。そうすることで、変数の必要/不要もわかりやすくなると思います。 -- [[こさか]] &new{2010-02-10 (水) 15:42:59};
- プログラムだけでも良いので、1人目の方は課題にあったものにしましょう。二人目に関しては、今のままでも十分だと思いますが、場合分けをもう少しうまくできるかと思います。もれなく、重複なしに、わかりやすくを目標にしてください。例えば、左右の光 が両方ともLW以下のときは、マシンは何もしなくなくなってしまいます-- [[FI]] &new{2010-02-18 (木) 05:58:05};

#COMMENT


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