[[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; #comment