[[2008b]]

#contents
*課題3:懐中電灯に向かってブロックを投げるロボット [#r9e61532]
**課題内容 [#td63ea4a]
インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。&Br;
(重複しないように一人一つ以上のプログラムを作成すること)

*ロボットの作成 [#u971828f]
**&size(16){ロボット本体について}; [#gb4ca32d]
-モーターひとつで動作する構造

直進のみ可能で、後退時に反時計回りに動きます。

&ref(F1000012.JPG);&br;

-白いホイールを投げる機能

&ref(F1000010.JPG);&br;

モーターで棒が回転し、ストッパーで止められてホイールが飛びます。

&ref(F1000009.JPG);&br;



**&size(16){プログラムについて}; [#i9f5510f]
-基本的な動作

 //前進
 void go_straight(int t,int w){ 
 	OnFwd(OUT_A);
 	Wait(t);
 	Off(OUT_A);
 	Wait(w);
 }

 //回転
 void turn_right(int t,int w){
 	OnRev(OUT_A);
 	Wait(t);
 	Off(OUT_A);
 	Wait(w);
 }

&Br;
-課題を実現するための動作

 //白いホイールを投げる
 void nage1(){
 	OnFwd(OUT_B);
 	Wait(30);
 	Off(OUT_B);
 }


 //懐中電灯の光を探す
 void SeekLight(int j){
 	while((SENSOR_3<j)||(SENSOR_1<j)){
 		turn_right(10,40);
 	}
 }

&Br;
-1.全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
 task main(){
 	#define THRESHOLD1 40//50cm手前位置判断用定数
 	#define THRESHOLD2 30//光源方向判断用定数
 
 	SetSensor(SENSOR_1,SENSOR_LIGHT);//右側センサー
 	SetSensor(SENSOR_3,SENSOR_LIGHT);//左側センサー
 
 	while(1){		
 		if((SENSOR_3>THRESHOLD2)&&(SENSOR_1>THRESHOLD2)){//光源方向を向いているかを判定
 			if((SENSOR_3>THRESHOLD1)||(SENSOR_1>THRESHOLD1)){//光源との距離を判定
 				Off(OUT_A+OUT_B);
 				SeekLight(THRESHOLD2);
 				Wait(30);
 				nage1();
 				break;
 			}else{
 				go_straight(10,30);
 			}	
 		}else{
 			SeekLight(THRESHOLD2);
 		}
 	}
 	Off(OUT_A+OUT_B);	
 }

&Br;
-2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
 task main(){
 	#define THRESHOLD1 40//50cm手前位置判断用定数
 	#define THRESHOLD2 30//光源方向判断用定数
 
 	//前回の光源情報記憶用変数
 	int light_right_old;
 	int light_left_old;
 
 	SetSensor(SENSOR_1,SENSOR_LIGHT);//右側センサー
 	SetSensor(SENSOR_3,SENSOR_LIGHT);//左側センサー
 	
 
 	while(1){//光源が動くまで待機
 		light_right_old=SENSOR_1;
 		light_left_old=SENSOR_3;
 		Wait(40);
 		if(((light_right_old+5<SENSOR_1)||(light_right_old-5>SENSOR_1))
		||((light_left_old+5<SENSOR_3)||(light_left_old-5>SENSOR_3))){
 			break;
 		}
 	}
 	while(1){//光源方向を向く
 		SeekLight(THRESHOLD2);
 		light_right_old=SENSOR_1;
 		light_left_old=SENSOR_3;
 		Wait(40);
 		if(((light_right_old+5>SENSOR_1)&&(light_right_old-5<SENSOR_1))
		&&((light_left_old+5>SENSOR_3)&&(light_left_old-5<SENSOR_3))){
 			break;
 		}
 	}
 	while(1){//光源の50cm手前まで移動
 		if((SENSOR_3>THRESHOLD1)||(SENSOR_1>THRESHOLD1)){
 			Off(OUT_A+OUT_B);
 			SeekLight(THRESHOLD2);
 			Wait(30);
 			nage1();
 			break;
 		}else{
 			go_straight(10,30);
 		}
 	}
 	
 	Off(OUT_A+OUT_B);	
 }
*まとめ [#ua067378]
**苦労した点・工夫した点[#hfa33386]
関数を使うことで、わかりやすいプログラムにすることができたと思う。&Br;




*コメント [#rcfab3a8]
何かコメントがありましたらお願いします。&Br;
&Br;
-  白いホイールを投げる構造の解説があると有難いです -- [[なかむら]] &new{2009-02-06 (金) 11:24:04};

#comment
プログラムは簡潔ですばらしいと思います。あとはロボットの説明を充実させてください。  FI

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