[[2010a]] *課題 [#s5cc957b] 黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成せよ。&br;ただし1,3は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにすること。&br;2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。 (重複しないように一人一つ以上のプログラムを作成すること。2人のチームは1と2、3人のチームは1〜3) 1. 全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。 3. 全方向から2つの懐中電灯の方向を探しだし、40cmの距離に近づいて懐中電灯を狙ってホイールを投げ、懐中電灯に当てる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。 **ロボット [#pa121e8b] **ANDOのプログラム [#sc80e0b2] ***初めの失敗したプログラム [#lea692f6] #define T 400//初めの旋回時間 int m;//光の最大値 int t;//光までの時間 int n;//m-20; sub find()//光の最大値を決めるサブルーチン { m=0; t=0; n=0; ClearTimer(0); while(FastTimer(0)<T)//一周して光の域値を決める { if(SENSOR_1>m)//光が最大値より大きければ { m=SENSOR_1;//光の値を代入 n=m-20; if(n<50){n=50;} t=FastTimer(0);//時間を計る } OnFwd(OUT_A);OnRev(OUT_C);//旋回 } Off(OUT_A+OUT_C); OnRev(OUT_A);OnFwd(OUT_C);Wait(T-t);Off(OUT_A+OUT_C);//光まで逆に旋回 ClearTimer(1); } task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); find(); while(FastTimer(1)<300)//光が止まって三秒たつまで追いかける { if((SENSOR_1>n)&&(SENSOR_3>n)){OnFwd(OUT_A+OUT_C);} else if((SENSOR_1>n)&&(SENSOR_3<n)){ClearTimer(1);OnFwd(OUT_C);Float(OUT_A);} else if((SENSOR_1<n)&&(SENSOR_3>n)){ClearTimer(1);OnFwd(OUT_A);Float(OUT_C);} else{find();}//光が見つからない時は探す } if(SENSOR_1>m){while(SENSOR_1>m){OnRev(OUT_A+OUT_C);}}//センサーの値が一周して決めた最大値より大きければ後退 else{while(SENSOR_1<=m){OnFwd(OUT_A+OUT_C);}}//それ以外は最大値まで前進 Off(OUT_A+OUT_C); OnRev(OUT_B);Wait(30);Float(OUT_B);OnFwd(OUT_B);Wait(200);Off(OUT_B);//ホイールを射出する } ***問題点 [#re291212] 先生の助言を参考にどんな懐中電灯にも対応しようと思って、一周して光の域値を決定しようと考えた。&br; しかし、最初の光の最大値を決める所がどうしてもうまくいかず、ぐるぐると回り続けるだけのプログラムになった。&br; どうやら、光センサーの感度が悪い(?)みたいで少し懐中電灯を真正面から相当(30cmよりもずっと)近づけないと部屋の明かりとあまり差が出ないとviewモードで分かった。&br;また光センサーの値にだいぶブレがあるため、瞬間的な値になってしまっていたのかもしれない。&br; 改善方法はあると思うけれど、結局部屋の明かりではぎりぎり届かない値を設定した方が簡単だと思い、次のように変えた。 ***最終的なプログラム [#a2716cc5] #define n 50//光の域値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(1); while(FastTimer(1)<200)//2秒前方に光を浴びる→懐中電灯が止まったと判定 { if((SENSOR_1>n)&&(SENSOR_3>n)){OnFwd(OUT_A+OUT_C);} else if((SENSOR_1>n)&&(SENSOR_3<n)){ClearTimer(1);OnFwd(OUT_C);Float(OUT_A);} else if((SENSOR_1<n)&&(SENSOR_3>n)){ClearTimer(1);OnFwd(OUT_A);Float(OUT_C);} else{while((SENSOR_1<n)||(SENSOR_3<n)){ClearTimer(1);OnRev(OUT_A);OnFwd(OUT_C);}}//光が見つからない時は探す } if(SENSOR_1>(n)){while(SENSOR_1>(n)){OnRev(OUT_A+OUT_C);}} else{while(SENSOR_1<=(n)){OnFwd(OUT_A+OUT_C);}} Off(OUT_A+OUT_C); SetPower(OUT_B,7);OnFwd(OUT_B);Wait(500);Off(OUT_B);//ホイールを射出する } ***工夫したところ [#zd81ce58] 最初から光の域値をviewモードをみて部屋の明かりではぎりぎり届かない値に変えてしまった。こうすることで感度の悪いセンサーでも一応追うことができた。 割とシンプルになってよかった。 ***反省点 [#xb5dfe2d] 30cm以上は近づけないと追ってくれない。はっきりいって致命的だけど、脳がストーミングしすぎた。いか漁に使うような強力なライトをつかえばいけるかもしれない。 **UMEのプログラム [#e00ea379] #define THRESHOLD 50 //閾値 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //せんさー3光センサー SetPower(OUT_B,7); //セットパワーを最大の7にする OnFwd(OUT_A); OnRev(OUT_C); //右回転 両センサーが強い光を感知したとき while(true){ if((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD)){ Off(OUT_A+OUT_C); //止まる Wait(50); OnFwd(OUT_B); //ホイールを発射 Wait(20); Off(OUT_B); } センサー3がセンサー1より強い光を感知したとき if(SENSOR_3>SENSOR_1){ OnRev(OUT_A); OnFwd(OUT_C);//左回転 } センサー3が強い光を感知したとき if(SENSOR_3>THRESHOLD){ OnRev(OUT_A); OnFwd(OUT_C);//左回転 } **問題点、工夫した所 [#f772ab2b] ・ANDO とても簡単なプログラムになった。確かに最後はシンプルになったが、それに至るまでにかなりの時間がかかった。時にはせっかく組んだプログラムも初めから見直すことも必要だと感じた。&br;ロボットは時間がないせいかごちゃごちゃと思いつくがままに組み合わせたようなものなので、なんだがまとまりがなくなった。でも連射がかっこよくてよかった。 ・UME 今回はホイールの発射に苦労しました。 うまく飛ばず、セットパワーを強くしたところ飛距離を伸ばすことができました。 シンプルなプログラムになってよかった。 **コメント [#fb40bf6a] コメントをどうぞ!