*0,目次 [#i87ce71c]
#contents
*1,課題3懐中電灯に向かってブロックを投げるロボットを作成せよ! [#r9076bd9]

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

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

~懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい
*2,ロボットの概要 [#vf9ec5f2]
**駆動部分 [#l125d79d]
#ref(2009a/A3/課題3右/基本構造.jpg)
~駆動部には説明書の「top secret」のディファレンシャルギアを使用。
#ref(2009a/A3/課題3右/ストッパー.jpg)
~このストッパーを使用することで、それぞれのタイヤを独立させて駆動させる。
#ref(2009a/A3/課題3右/ギア改善前1.jpg)
~ギアを左右それぞれ奇数、偶数にすることで、同じ方向に動くのを防ぐ。
~また、立体的にすることで、小型化を図った。
~ところがこのギアの組み合わせだと噛み合わせが悪いので、↓のようにした。
#ref(2009a/A3/課題3右/ギア部分.jpg)
#ref(2009a/A3/課題3右/内部.jpg)
~内部はこんな感じ。上と下にある黒い突起は床及び机を引っ掻かないようにするためのもの。
**アーム [#d8f75cc2]
#ref(2009a/A3/課題3右/アーム.jpg)
~ギア比を調節することで、力を強くしたのと、アームに留め具をつけることで、ブロックを落とさないようにした。
**全体図 [#j38b9977]
#ref(2009a/A3/課題3右/全体図横.jpg)
~横からの図↑
#ref(2009a/A3/課題3右/全体図正面.jpg)
~正面からの図↑。
~ちょっとわかりにくいかもしれませんが、正面上部に光センサーがあります。
*3,プログラムについて [#f041344f]
**Dsの作ったプログラム [#ycc02125]
~担当したプログラムは2番です。 
 #define L 60 //ライトの閾値を設定
 #define T 150 //おおよそ一周する時間を設定
 #define GT 500 //ライトが止まった後、動く時間を設定
 #define G OnFwd(OUT_C);Wait(20);OnRev(OUT_C);Wait(20);Off(OUT_C); //前に進むプログラムを設定
 #define TH OnFwd(OUT_B);Wait(10);Off(OUT_B); //ブロックを投げるプログラムを設定
 task  main()
 {SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーに設定
  ClearTimer(0); //タイマーを初期化
 until(Timer(0)>T) //1周するまでに光があれば、追いかけるようにし、なければ次の動作へ
 {until(SENSOR_2>L){OnFwd(OUT_C);ClearTimer(0);}
                               until(SENSOR_2>L) {OnRev(OUT_C);ClearTimer(0);}     
                                }
  ClearTimer(0);  //再度タイマーを初期化し、
  while(Timer(0)<GT){G;}  //懐中電灯に近づき、
  TH;  //ブロックを投げて終了。
 }
~光センサー一つでどうやって懐中電灯が動かなくなったかを判断するかという点に悩まされた。が、一周するまで何もなければ動いていないことになることに気づき、このようなプログラムに。
**堀内の作ったプログラム [#dcd58f28]
 #define ROUND 100 // 1周する時間
 #define GO Off(OUT_C);OnRev(OUT_C);Wait(30);OnFwd(OUT_C);Wait(30);OnRev(OUT_C);Wait(30); //ライトに向かって進む
 #define throw Off(OUT_C);OnFwd(OUT_B);Wait(100);Off(OUT_B);//投げる
 task main()
 {
	SetSensor(SENSOR_2,SENSOR_LIGHT);//センサー2を光センサーに設定
	ClearTimer(0);
	int n = 0;	//光の最大値
	while(Timer(0) <  ROUND) { 
		OnFwd(OUT_C);		
		if(SENSOR_2 > n) { 
			n=SENSOR_2;		
		}	
	} 
	while(n > SENSOR_2 ) { //センサー2が最大値に達しなければ回り続ける  
		OnFwd(OUT_C);		
	}
	while(SENSOR_2 >= n) { // ライトを見つけたら	
	GO;	// ライトに向かって進み
	}
	throw; // 投げる
 } 
*4,良かった点、工夫した点 [#i4ae1663]
~課題1、課題2のプログラムよりも良いプログラムがつくれたと思う。defineを1、2の課題よりも使ったためプログラムが簡略化されたことも良かった。(堀内)
~思ったよりプログラムを簡潔にまとめられたのでよかった。また、ロボットのギア比等を工夫して作れたのもよかった。by Ds
*5,苦労した点 [#w7ac780e]
~いつものことながらやはりプログラムが自分にとってはややこしかった(堀内)
~ギアの噛み合わせが上手くいかずに手間取ってしまった。 by Ds
*6,反省点 [#r52fb33b]
~ロボットを作ったりするのをほとんどやってもらってしまった。ロボコンの準備の時は協力してできるようにしたい。(堀内)
~ロボット本体にこだわりすぎてプログラムにかける時間が少なくなってしまった。次回は時間配分に気をつけたい。 by Ds
*7,コメントをどうぞ [#ua4d7bc9]
- ロボットの解説は詳しくて良いです。プログラムは、簡略化されていますが説明が少なすぎてさっぱりです。「次の動作へ」の次の動作とは何かとか、ここで変数nに何を代入しているとか比べているとか、if文では「○○だったら、××をする」といった説明がないと、自分たちはわかっても、見る側は、何を判断して何をしているのかわかりません。 -- [[こさか]] &new{2009-07-23 (木) 21:50:43};
- 課題2ではできれば全方向に動く光をできるだけ追跡するようにしましょう。光センサはちょっとした具合で認識した値が変わるので、while(n > SENSOR_2 )とするよりも、while(n+5>SENSOR_2 || SENSOR_2>n-5)と幅を持たせた方がいいかもしれません。 -- [[FI]] &new{2009-08-05 (水) 07:29:50};
- 課題2ではできれば全方向に動く光をできるだけ追跡するようにしましょう。光センサはちょっとした具合で認識した値が変わるので、while(n > SENSOR_2 )とするよりも、while(SENSOR_2>n-5)くらいに幅を持たせた方がいいかもしれません。 -- [[FI]] &new{2009-08-05 (水) 07:29:50};

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS