2008b

課題3:懐中電灯に向かってブロックを投げるロボット

課題内容

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

ロボットの作成

ロボット本体について

  • モーターひとつで動作する構造

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

F1000012.JPG

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

F1000010.JPG

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

F1000009.JPG

プログラムについて

  • 基本的な動作
//前進
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);
}


  • 課題を実現するための動作
//白いホイールを投げる
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);
	}
}


  • 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);	
    }


  • 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);	
    }

まとめ

苦労した点・工夫した点

関数を使うことで、わかりやすいプログラムにすることができたと思う。

コメント

何かコメントがありましたらお願いします。

  • 白いホイールを投げる構造の解説があると有難いです -- なかむら? 2009-02-06 (金) 11:24:04

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


添付ファイル: fileF1000010.JPG 230件 [詳細] fileF1000009.JPG 206件 [詳細] fileF1000011.JPG 103件 [詳細] fileF1000012.JPG 205件 [詳細] fileF1000014.JPG 107件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-06 (金) 11:24:04 (3850d)