[[2009a/MemberOnly/進行状況A]] *目次 [#gdedb413] #contents *課題3 [#y287a39a] &size(16){''懐中電灯に向かってブロックを投げるロボットを作ること。''}; インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) 1.全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる。 方向を定めたのち、懐中電灯の30cm以内に近づかない範囲で必要な距離を移動してもよい。 懐中電灯は動かさないが、いろいろな距離や方向にある懐中電灯に対応できるロボットにすること。 2.懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、 懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて 懐中電灯を狙ってブロックを投げる。 3.懐中電灯を動かしたとき懐中電灯に向かって進み、 見失った時には再び全方向から懐中電灯を探しだす。 7秒以上追尾できたら懐中電灯に向かってブロックを投げる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。 モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。 ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。 *ロボットについて [#bfd876d9] **ロボットの構造 [#de1fb826] ***『全体』 [#ee1f2c73] #ref(2009a/A7/課題3左/コピー.jpg,120%) ***&size(16){''『アーム部分』''}; [#s622958e] #ref(2009a/A7/課題3左/CIMG0628.JPG,30%) 今回のアームは、遠心力をつかってブロックを投げるタイプを採用した。投げる長さの調整が少し難しかった。 ***&size(16){''『内部構造 〜ディファレンシャル ギア〜』''}; [#lcc34d17] #ref(2009a/A7/課題3左/CIMG0625.JPG,30%) 少ないパーツで多くの部分を動かすためギアが複雑になったが、きれいに収まった。 ***&size(16){''『タイヤ 〜ギア部〜』''}; [#o4b91f61] #ref(2009a/A7/課題3左/CIMG0626.JPG,30%) タイヤ装着後↓ #ref(2009a/A7/課題3左/CIMG0623.JPG,20%) **プログラム [#vadc7b19] ***とさ犬のプログラム [#o987aba0] 動かないライトを探し出しブロックを投げる #define THRESHOLD 60 //閾値を設定 task main() { SetSensor( SENSOR_1,SENSOR_LIGHT ); //センサー1が光ライトであることを定義 SetSensor( SENSOR_3,SENSOR_LIGHT ); //センサー3が光ライトであることを定義 while( true ){ if ( SENSOR_1 > THRESHOLD ){ if( SENSOR_3 > THRESHOLD ){ //両方のセンサーが光を感知したらブロックを投げる Off(OUT_C); Wait(50); OnFwd(OUT_A); Wait(100); Off(OUT_A); }else{ //センサ−1(左)が光を感知したら左に曲がる OnFwd(OUT_C);} }else{ if ( SENSOR_3 > THRESHOLD ){ //センサ−3(右)が光を感知したら右に曲がる OnRev(OUT_C); }else{ //光を感知しなければ右に回り続ける OnFwd(OUT_C);} } } ***Fe2+のプログラム [#e0530b7a] #define T 60 //閾値Aを60と定義 #define T2 90 //閾値Bを90と定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーと定義 while(true){ if ((SENSOR_1 < T) || (SENSOR_3 < T)) {OnFwd(OUT_A);} //センサーのどちらかが閾値A以下なら回転し光を見つける。 if (((SENSOR_1 < T2) && (SENSOR_1 > T)) || ((SENSOR_3 < T2) && (SENSOR_3 > T))) {Off(OUT_A); Wait(10); OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } //センサーのどちらかが閾値A、Bの間なら光に向かって進む。 if ((SENSOR_1 > T2) || (SENSOR_3 > T2)) {Off(OUT_A); Wait(10); SetPower(OUT_C,7); OnFwd(OUT_C); Wait(19); Off(OUT_C); } //センサーのどちらかが閾値Bを越えたらホイールを投げる。 } Off(OUT_A+OUT_C); //停止 } *感想 [#zf6e8832] **とさ犬 [#qbf9aca1] 課題2の応用に頼ったところが多くあった。なので、新しい発見はあまりなかったけれど、このプログラミングをほぼ理解できたと思う。 **Fe2+ [#o543a3f5] 前回はプログラミングに時間がかかったのに対し、今回はプログラミングが割とはやくた。しかし逆にロボットは、ディファレンシャルギアを使ったり、ロボットの面で工夫しなければならないことが、たくさんあり、その部分を改良するのに、特に時間がかかった。しかし今回の知識は、ロボコンに活かせる知識がたくさんあったのでぜひつぎは、つかってみたい。 *コメント [#v65fe7a1] コメントをどうぞ - 一つ目のプログラムに関して言えば、2つ目と4つ目のifの命令内容が一緒なのでまとめたほうがいいかもしれません。二つ目に関しては、懐中電灯は左右にも動くので二つ光センサがあることを生かしてください。具体的には、右の光の方が強かったら右の方に回転し、逆だったら逆で -- [[FI]] &new{2009-08-05 (水) 09:13:26}; - とさ犬さんのプログラムは、「懐中電灯のある方向」ではなく、「探し始めてから一番最初にある明るさに到達したところ」に向かって投げるプログラムなので、懐中電灯の種類などを変えたら上手くいかなくなるかもしれません。Fe2+さんのプログラムは課題のどれなのか明記してください。また、2人とも、while(true)に対して、投げた後にループを抜けるようにしたほうが良いと思います。 -- [[こさか]] &new{2009-08-09 (日) 23:04:27}; #comment CENTER:本日の訪問者&counter(today); CENTER:昨日の訪問者&counter(yesterday); CENTER:今日までの訪問者&counter(all);