[[2007a/MemberOnly/進行状況A]] #counter #hr CENTER:&size(25){[[課題3>2007a/練習問題#kadai3]]: 懐中電灯に向かってブロックを投げるロボット }; #hr //CENTER:&size(25){[[''課題3:懐中電灯に向かってブロックを投げるロボット'' >2007a/練習問題#kadai3]] CENTER:&color(orange,){ぎょうざ};&&color(lightgreen,){たけぽん}; --目次 #contents *このロボットを製作するにあたってのポイント☆ [#gdf2212e] -全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 -懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。 -懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる LEFT:の3つを注意して作る。 *ロボットについて [#g4e69b20] |>|>|CENTER:''光を追いかけるロボット''| |&ref(2007a/A6/課題3左/ロボット 018.JPG,100%);|>| &br;・4輪車&br; &br;・1つのモーターで左右どちらのタイヤも動かせる&br; &br;・光センサーの地面に対する角度を変えることができる&br; &br;・分解することが容易にできる&br;| |CENTER:&ref(2007a/A6/課題3左/001.JPG,55%); | &ref(2007a/A6/課題3左/003.JPG,50%); | &ref(2007a/A6/課題3左/002.JPG,50%);| この上の写真、よく見ていただければわかるのですが、なんと&COLOR(orange){光センサーの角度が変えられます!!!}; **さらに詳しく! [#w8e5956f] |>|&size(20){1つのモーターで左右どちらのタイヤも動かせる仕組み};&br;OnFwd(OUT_B)にすると左のタイヤが動き、右のタイヤが止まって右に曲がり、OnRev(OUT_B)とすると右のタイヤが動き、左のタイヤが止まり左に曲がる。左右に交互に曲がることにより前に進むことが出来る。&br; ||BGCOLOR(red):&ref(2007a/A6/課題3左/ロボット 014.JPG,70%);| 今回は、モーターが2つあるうちの1つは、ブロックを投げるために使わざるを得なかった。そのため、上記のような仕組みが必要となった。 |>|LEFT:BGCOLOR(blue):&ref(2007a/A6/課題3左/ロボット 008.JPG,70%);||ブロックを投げるための仕組み(拡大版)| これらの機能が重なりあうことによって、このロボットは初めて、光に向かって進み更には、その光源に向かってブロックを投げることができるのである。 *プログラム [#x75f8c70] **試作プログラム [#p2165b52] このプログラムは試作段階であり、%%%&color(yellow,){''光''};を追うのみ%%%である。 #define turn_left OnFwd(OUT_B);//右に曲がる #define turn_right OnRev(OUT_B);//左に曲がる task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1は光センサー(以下光1とする) SetSensor(SENSOR_3,SENSOR_LIGHT);//センサ−3は光センサー (以下光3) while(true){ if(SENSOR_1>=40&&SENSOR_3>=40&&SENSOR_1<SENSOR_3){ turn_right ;//光1と光3が40以下で光3の光の方が強いとき右に曲がる } if(SENSOR_1>=40&&SENSOR_3>=40&&SENSOR_1>SENSOR_3){ turn_left ;//光1と光3が40以下で光1の光の方が強いとき左に曲がる } if(SENSOR_1<40&&SENSOR_3>=40){ turn_left ;//光1が40以下で光3が40以上のとき左に曲がる } if(SENSOR_1>=40&&SENSOR_3<40){ turn_right ;//光3が40以下で光1が40以上のとき右に曲がる } if(SENSOR_1<40&&SENSOR_3<40&&SENSOR_1<SENSOR_3){ turn_right ;//光1と光3が40以上で光3の光の方が強いとき右に曲がる } if(SENSOR_1<40&&SENSOR_3<40&&SENSOR_1>SENSOR_3){ turn_left ;//光1と光3が40以上で光1の光の方が強いとき左に曲がる } }} **完成プログラム [#c701a3f1] このプログラムは、前回のプログラムに更に手を加えて、 LEFT:なんと%%%光に向かって走るうえにその光に向かって&color(red,){ブロックを投げる};ことができる%%%のである。 #define turn_left OnFwd(OUT_B);//右に曲がる #define turn_right OnRev(OUT_B);//左に曲がる #define shot OnFwd(OUT_A);Wait(15);Off(OUT_A);//投げる task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1は光センサー(以下光1とする) SetSensor(SENSOR_2,SENSOR_TOUCH);//センサ−2はタッチセンサー(以下タッチ2) SetSensor(SENSOR_3,SENSOR_LIGHT);//センサ−3は光センサー (以下光3) while(true){ if(SENSOR_1>=40&&SENSOR_3>=40&&SENSOR_1<SENSOR_3){ turn_right ;//光1と光3が40以下で光3の光の方が強いとき右に曲がる } if(SENSOR_1>=40&&SENSOR_3>=40&&SENSOR_1>SENSOR_3){ turn_left ;//光1と光3が40以下で光1の光の方が強いとき左に曲がる } if(SENSOR_1<40&&SENSOR_3>=40){ turn_left ;//光1が40以下で光3が40以上のとき左に曲がる } if(SENSOR_1>=40&&SENSOR_3<40){ turn_right ;//光3が40以下で光1が40以上のとき右に曲がる } if(SENSOR_1<40&&SENSOR_3<40&&SENSOR_1<SENSOR_3){ turn_right ;//光1と光3が40以上で光3の光の方が強いとき右に曲がる } if(SENSOR_1<40&&SENSOR_3<40&&SENSOR_1>SENSOR_3){ turn_left ;//光1と光3が40以上で光1の光の方が強いとき左に曲がる } if(SENSOR_1>=60&&SENSOR_3>=60){ shot;//光1と光3がともに60を超えたとき投げる } if(SENSOR_2 == 1) // タッチ2に当たると止まる { Off(OUT_B); } }} *工夫,苦労したところ [#n25f7f8d] -光センサーを前のほうに二つ付けることにより光をより追いやすくしたこと。 -タッチセンサを前方に付けることにより、もし機械が何かの障害物にあたっても止まれるようにした。 -光を見失ったと判断させるところ。部屋自体が明るいので、光センサーの値が低すぎても高すぎてもダメだったので、調整するのが難しかった。 *反省&感想 [#d1c774b1] -何から何まで時間が足りなかった、というのが正直な感想。次回はロボコンということで、今までの数えきれない程の反省点、がどこまで生かせるのか?わからないが、今自分にできる最大限のことをしたいと思う。 *先生,TAの方々のコメント [#q0a968f8] &color(blue,){些細なことでも、何かお気付きになられましたら、コメントの方お願いしますm(_ _)m}; -モーター1つでマシンの移動をやりくりするのが、この課題のポイントの一つですから、さらにさらに詳しい解説がほしいところです。 -- [[まいける(TA)]] &new{2007-07-05 (木) 00:44:55}; -字の色を変えるなど、見やすさに注意しているのはよいと思います。 -- [[ヒロヤ]] &new{2007-07-05 (木) 09:22:40}; #comment