[[2008b/MemberOnly/進行状況A]] *課題3 [#n25afbc9] 懐中電灯に向かってブロックを投げるロボットの作成。 <条件> 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 **目次 [#k32fd1df] #contents *本体について [#k703f88c] ディファレンシャルギアを使ってモーター一つでタイヤの前輪2個を動くようにした。 ギアが小さいと動かないので、ギアを大きくして動くようにした。 左右のギアの個数をかえてタイヤの回転を左右逆方向にし、 ストッパーを左右にそれぞれつけて、左右交互に動くようにすることで前進できるようにした。 #ref(2008b/A3/課題3左/hontai kadai3.JPG,34.0,全体図) ↑全体図。 #ref(2008b/A3/課題3左/gia1.JPG,26.4,ギア1) ↑ギア部分、上から。 #ref(2008b/A3/課題3左/gia2.JPG,32.8,ギア2) ↑ギア部分、ななめ。 *ブロックを投げる部分について [#oa947cc8] 黄色のブロックの白のホイールを載せ、後ろからはじくことでホイールを飛ばす。 #ref(2008b/A3/課題3左/nage.JPG,36.6,投げ) *プログラム [#ab82adfe] **1つ目のプログラム [#t1400816] 1人目 (by A) #define THRESHOLD 60 //闘値を設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3は光センサー SetPower(OUT_A+OUT_B,7); //モーター出力を7に設定 while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) { OnFwd(OUT_B); //センサー1と3が光を感知していないとき Off(OUT_A); //左回転で光を探す } repeat(3){ OnFwd(OUT_B); Wait(70); //左回転と右回転を交互に OnRev(OUT_A); Wait(40); //3回繰り返す } Off(OUT_B); //停止 OnFwd(OUT_A); Wait(30); //ホイールを投げる Off(OUT_A); } 2人目(byみなみ) #define THRESHOLD 60 //闘値を設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3は光センサー SetPower(OUT_A+OUT_B,7); //モーター出力を7に設定 while((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) { OnRev(OUT_B); //センサー1と3が光を感知していないとき Off(OUT_A); //右回転で光を探す } repeat(5){ OnFwd(OUT_B); Wait(100); //左回転と右回転を交互に OnRev(OUT_A); Wait(60); //5回繰り返す } Off(OUT_B); //停止 OnFwd(OUT_A); Wait(30); //ホイールを投げる OnRev(OUT_A); Wait(30); Off(OUT_A); } **2つ目のプログラム [#z6f92fe1] 1人目 (by A) #define THRESHOLD 60 //闘値を設定 int n; //関数nを設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3は光センサー SetPower(OUT_A+OUT_B,7); //モーターのパワーを7に設定 n=0; //nの初期値を0にする while(n<=5){ //nが5以下のとき実行 if(SENSOR_1>THRESHOLD){ //センサー1が光を感知 if(SENSOR_3>THRESHOLD){ //センサー3も光を感知 OnFwd(OUT_B); Wait(70); //左回転と右回転を OnRev(OUT_B); Wait(40); //繰り返して前進 n=n+1; //nに1加える } else{ //センサー3は光を感知していない OnFwd(OUT_B); //左回転で光を追う } } else{ //センサー1が光を感知していない if(SENSOR_3>THRESHOLD){ //センサー3は光を感知 OnRev(OUT_B); //右回転で光を追う } else{ //センサー3も光を感知していない OnRev(OUT_B); //右回転で光を探す } } } Off(OUT_B); Wait(30); //一時停止 OnFwd(OUT_A); Wait(30); //ホイールを投げる Off(OUT_A); } 2人目(byみなみ) #define THRESHOLD 60 //闘値を設定 int n; //関数nを設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1は光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3は光センサー SetPower(OUT_A+OUT_B,7); //モーターのパワーを7に設定 n=0; //nの初期値を0にする while(n<=3){ //nが3以下のとき実行 if(SENSOR_1>THRESHOLD){ //センサー1が光を感知 if(SENSOR_3>THRESHOLD){ //センサー3も光を感知 OnFwd(OUT_B); Wait(100); //左回転と右回転を OnRev(OUT_B); Wait(60); //繰り返して前進 n=n+1; //nに1加える } else{ //センサー3は光を感知していない OnFwd(OUT_B); //左回転で光を追う n=0; //nを0にリセット } } else{ //センサー1が光を感知していない if(SENSOR_3>THRESHOLD){ //センサー3は光を感知 OnRev(OUT_B); //右回転で光を追う n=0; //nを0にリセット } else{ //センサー3も光を感知していない OnRev(OUT_B); //右回転で光を探す } } } Off(OUT_B); Wait(200); //一時停止 OnFwd(OUT_A); Wait(30); //ホイールを投げる OnRev(OUT_A); Wait(30); Off(OUT_A); } *工夫した点、苦労した点 [#leeae411] 初めはまっすぐ前進するように本体を組み立てたが、右折か左折のどちらかしかできないということが不便だったので、左右交互に動かすことでジグザグに進むように本体を組み立てた。 次にジグザグに動かすように組み立てたものを動かそうとすると、痙攣したようになってしまい、なかなか前進しなくて苦労した。 そこでギアの組み合わせを変えたりギアを大きくし、パワーを大きくすることで動くようにした。 *感想 [#j4740830] 今回の課題はなかなか思ったように動かなくて大変でした。 ギアの組み合わせを変えるときにはブロックの横穴となかなか合わず、ギアの組み合わせを何通りも試してギアが滑らかに動くようにしました。 課題1で他にできることとしては、その場で一周し、光センサーで光を感知して止まり、タッチセンサーで50cmの位置まで進み、ホイールを投げるというものもできるし、タッチセンサーで触ってからバックして投げるなど、50cmをはかる方法はちゃんとあることがわかりました。光センサーだけに頼るのではなく、センサーを組み合わせることで他のプログラムも考えれるなと思いました。 課題2では、変数nが3になると止まったとみなしていましたが、一定の時間ロボットがどちら向きにも動かなかい状態になったときに光の動きが止まったとみなすこともできるので、そういったことも試せたらよかったと思います。 *コメント [#ua04d649] コメントをお願いします。 - ソースが見やすくて良いです。 -- [[なかむら]] &new{2009-02-06 (金) 11:22:33}; #comment() 書くべきことは書けていると思います。プログラムも色々頑張って工夫していますが、よりよいものを目指してみましょう。~ 例えば、課題1で50cmの所まで近づいたかは光の強さや50cm先に取り付けたタッチセンサ等で認識できると思います。課題2では真正面にある程度継続していたら、止まったと見なしていますが、もっと適切な方法もあるかもしれません。いろいろ組み合わせたり、着眼点を変えたりなどして考えてみてください。~ FI 例えば、課題1で50cmの所まで近づいたかは光の強さや50cm先に取り付けたタッチセンサ等で認識できると思います。課題2では真正面にある程度継続していたら、止まったと見なしていますが、もっと適切な方法もあるかもしれません。いろいろ組み合わせたり、着眼点を変えたりなどして考えてみてください。 FI