目次
#contents

*課題 [#z1aa8087]
**懐中電灯に向かってブロックを投げるロボット [#ofa836d5]
黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。
+全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
+懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。

**メンバー [#v02e0a5a]
新谷・みのう

*ロボットの製作 [#f760531f]
**製作したロボット [#q933a9f1]
#ref(./100716robo1.jpg,around,80%,ロボット画像1)
#ref(./100716robo2.jpg,around,80%,ロボット画像2)
#clear

**工夫した点 [#sddb5c66]
-なるべく簡単な構造に
-モータで輪ゴムを引き延ばす力をどう得るか
--ギア比(小→大)で力増加、ウォームギアを使用して力を増加し、かつ逆からの力を伝わらなくした。また、各所に力がかかり破壊されてしまうので、丈夫な構造にした。
#ref(./100716robo3.jpg,80%,発射駆動部)

**今後改善すべき点 [#b216905a]
-1発目の発射後、2発目の発射までに時間がかかる(15秒程度)点について

*プログラムの作成(新谷) [#ef4e64e5]
**課題 [#kbff71d2]
-全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。

**作成したプログラム [#hbe95954]

 int tmax_1;
 int tmax_2;//明るいところを見つけた時間を代入する変数
 int lmax_1;
 #define TURN_TIME 400//一周する時間
 #define SHOT_TIME 1480//撃つために必要な時間
 
 task main(){
 tmax_1=0;
 lmax_1=0;
 tmax_2=0;//変数に0代入
 SetSensor(SENSOR_2,SENSOR_LIGHT);//SENSOR_2はSENSOR_LIGHT  
 
 OnRev(OUT_C);//回り始める
 OnFwd(OUT_A);
 ClearTimer(0);//タイマー動かす
 while(FastTimer(0)<TURN_TIME){//TURN_TIMEの時間回り続ける
 if (SENSOR_2>lmax_1){ 
 
 lmax_1=SENSOR_2;//lmax_1にSENSOR_2の値を代入
 tmax_1=FastTimer(0);//tmax_1にFastTimer(0)の値を代入
 Wait(10);
 }else if (lmax_1-15>SENSOR_2 & tmax_2==0){//lmax_1よりSENSOR_2の値が大幅に小さくなるとき
 tmax_2=tmax_1;//tmax_2にtmax_1の値を代入
 lmax_1=0;//lmax_1を0にする
 }
 }
 
 PlaySound(SOUND_DOWN) ;//音を鳴らす
 Off(OUT_A+OUT_C);//回り終わる
 Wait(50);
 OnRev(OUT_A);//回り始める
 OnFwd(OUT_C);
 Wait(400-tmax_1);//二回目に見つけた明るい光源の方向を向く
 Off(OUT_A+OUT_C);//止まる
 start shot;//shotのタスクを動かし始める
 Wait(500);//撃つまで待つ
 //撃つ
 PlaySound(SOUND_UP) ;  //音を鳴らす
 OnRev(OUT_A);//回り始める
 OnFwd(OUT_C);
 Wait(tmax_1-tmax_2);//初めに見つけた明るい光源の方向を向く
 Off(OUT_A+OUT_C);//撃つまで待つ
 //撃つ
 Wait(50);
 PlaySound(SOUND_FAST_UP) ;//音を鳴らす
 Wait(30);//待つ
 PlaySound(SOUND_LOW_BEEP) ; //音を鳴らす
 }
 
 task shot(){
 OnRev(OUT_B);//撃つ動作を始める
 Wait(SHOT_TIME);
 Off(OUT_B);
 Wait(20);
 OnRev(OUT_B);
 Wait(SHOT_TIME);
 Off(OUT_B);//撃つ動作終了
 }

**工夫した点 [#ma86b126]
-撃つための動作を別のタスクに分けて行い時間のロスを少なくした。
-一つの光源を何度も認識させないように一番明るいところを認識してから大幅にセンサーの値が小さくなってから次の光源を認識するようにした

**今後改善すべき点 [#d4716cab]
-プログラムをもっと綺麗に整理するべきだと思った。
-プログラムを作っている最中にこんがらがってしまう時が何度かあったので、しっかりと今どういうプログラムを作っているのかを考えながら作りたい。

*プログラムの作成(みのう) [#qc38e448]
**課題 [#p894b682]
-懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。

**作成したプログラム [#t44c767d]
 // 定数定義
 #define TURN_ONCE 430
 #define SHOT_TIME 1480
 #define THRESHOLD 45
 #define TURN_ONCE 430 // 1回転する時間
 #define SHOT_TIME 1480 // ホイールを発射し、次発射する準備までの時間
 #define THRESHOLD 45 // この値だけ暗くなったら回転方向を変える
 
 // 変数宣言
 int max_bright;
 int mb_count;
 int turn_direction;
 int shot_count;
 int max_bright; // 最大の明るさ
 int mb_count; // 最大の明るさの時間
 int turn_direction; // 回転方向
 int shot_count; // ホイールを投げた回数
 
 task main() {
 	SetSensor(SENSOR_1, SENSOR_TOUCH);
 	SetSensor(SENSOR_2, SENSOR_LIGHT);
 	SetSensor(SENSOR_3, SENSOR_TOUCH);
 
 	// 懐中電灯の方向を探す
 	max_bright = 0;
 	mb_count = 0;
 	ClearTimer(0);
 	while(FastTimer(0)<TURN_ONCE) {
 		OnFwd(OUT_A);
 		OnRev(OUT_C);
 		if(max_bright < SENSOR_2) {
 			max_bright = SENSOR_2;
 			mb_count = FastTimer(0);
 		}
 	}
 	Off(OUT_A+OUT_C);
 
 	// 懐中電灯の方向を向く
 	ClearTimer(0);
 	while(FastTimer(0)<TURN_ONCE-mb_count) {
 		OnRev(OUT_A);
 		OnFwd(OUT_C);
 	}
 	Off(OUT_A+OUT_C);
 
 	// 懐中電灯の方向を追いかける
 	SetSensorMode(SENSOR_2, SENSOR_MODE_RAW);
 	turn_direction = 0;
 	turn_direction = 0; // 始めは右回転
 	max_bright = 0;
 	shot_count = 0;
 	shot_count = 0; // ホイール発射回数リセット
 	ClearTimer(0);
 	while(shot_count <= 1) {
 		if(turn_direction == 0) {
 		if(turn_direction == 0) { // turn_directionが0のとき、右回転
 			OnFwd(OUT_A);
 			Float(OUT_C);
 			if(max_bright < SENSOR_2) {
 			if(max_bright < SENSOR_2) { // 明るくなったら最大値変更
 				max_bright = SENSOR_2;
 			} else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転
 				max_bright = SENSOR_2;
 				turn_direction = 1;
 				turn_direction = 1; // turn_directionを1にする
 				ClearTimer(0);
 			}
 		} else if(turn_direction == 1) {
 		} else if(turn_direction == 1) { // turn_directionが1のとき、左回転
 			Float(OUT_A);
 			OnFwd(OUT_C);
 			if(max_bright < SENSOR_2) {
 			if(max_bright < SENSOR_2) { // 明るくなったら最大値変更
 				max_bright = SENSOR_2;
 			} else if(max_bright-THRESHOLD > SENSOR_2) { // 暗くなったら回転方向逆転
 				max_bright = SENSOR_2;
 				turn_direction = 0;
 				turn_direction = 0; // turn_directionを0にする
 				ClearTimer(0);
 			}
 		}
 		if(FastTimer(0) > 500) { // 5秒以上一定以上の明るさの場合は停止し発射
 			Off(OUT_A+OUT_C);
 			start shot;
 			shot_count++;
 			Off(OUT_A+OUT_C); // 停止
 			start shot; // ホイール発射
 			shot_count++; // ホイール発射回数増加
 			Wait(500);
 			ClearTimer(0);
 			Wait(10);
 		}
 	}
 }
 
 task shot() { // 発射のタスク
 	OnRev(OUT_B);
 	Wait(SHOT_TIME);
 	Off(OUT_B);
 }
 

**工夫した点 [#vc92e1c0]
-2発目のホイールの発射に時間がかかるため別のタスクにし、メインのタスクに影響が出ないようにした

**今後改善すべき点 [#ka3a1c86]
-まだ懐中電灯を追いかける部分が怪しいので、ハードウェアの変更も含めて改善する必要がある

*反省・感想 [#ue4eeb2e]
-プログラムを修正していていくと自分でどこがどうなっているのか分からなくなってしまうことがある。なので、複雑であっても誰が見ても分かるようなプログラムを作りたいと思った。(新谷)
-ホイールを2発発射させるという構造を考えるのが意外に難しく時間がかかってしまった。そのため懐中電灯を追いかけるところのハードウェアとソフトウェアについて考える余裕がなかった。(みのう)

*コメントをどうぞ [#we62d096]
- ロボットと二人目のプログラム(変数の意味等)の説明をもう少し詳しくしてもらえれば大丈夫です。~
一人目のプログラムは自分なりにきちんと工夫していると思います。mainの13行目のtmax_2==0によって、減少の後に増加が2回あってもきちんと正確な方向を向けますし。例えば、ロボットの最初に向いた方向から30°と180に懐中電灯があった場合、懐中電灯が同じ明るさだとすると、30°〜105°:減少、105°〜180°:増加、180°〜285°:減少、285°〜360°:増加となります。-- [[FI]] &new{2010-07-31 (土) 09:00:32};

#comment



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