[[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() { int light_max=0; //光センサーの最大値を0とする SetSensor( SENSOR_1,SENSOR_LIGHT ); //センサー1が光ライトであることを定義 SetSensor( SENSOR_3,SENSOR_LIGHT ); //センサー3が光ライトであることを定義 while( true ){ if ( SENSOR_1 > THRESHOLD ){ //センサー1が光を感知したら左に回る OnFwd(OUT_C); }else{ if ( SENSOR_3 > THRESHOLD ){ //センサー3が光を感知したら左に回る OnRev(OUT_C); }else{ //光を感知しなければ右に回り続ける OnFwd(OUT_C);} if ( SENSOR_1 > light_max ){ //センサー1が定義した閾値より大きくなったら少し前進してブロックを投げる Off(OUT_C); Wait(50); OnRev(OUT_C);Wait(20); OnFwd(OUT_C);Wait(20); Off(OUT_C); OnFwd(OUT_A); Wait(100); Off(OUT_C); break; Off(OUT_C+OUT_A); } } } ***Fe2+のプログラム [#e0530b7a] 動く光に向かってブロックを投げる(課題3の2) #define t 50 //閾値を定義 #define t2 60 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//センサー1,3をライトセンサーにセット SetSensor(SENSOR_3,SENSOR_LIGHT); while (true) {//センサー1,3が定義した閾値より大きいとき前進// if((SENSOR_1> t)&&(SENSOR_3> t)){ OnRev(OUT_C);Wait(20); OnFwd(OUT_C);Wait(20); }//センサー1が定義した閾値より大きく、センサー3が定義した閾値より小さいとき左に// if ((SENSOR_1>t)&&(SENSOR_3<t)){ OnRev(OUT_C); }//センサー1が定義した閾値より小さく、センサー3が大きいとき右に// if((SENSOR_1< t)&&(SENSOR_3> t)){ OnFwd(OUT_C); }//センサー1,3が定義した閾値より大きくなったらブロックを投げて止まる// if((SENSOR_1> t2)&&(SENSOR_3> t2)){ Off(OUT_C); Wait(13); OnFwd(OUT_A); Wait(15); OnRev(OUT_A); Wait(5); Off(OUT_A); break; Off(OUT_A+OUT_C); } if((SENSOR_1<t)&&(SENSOR_3<t)){//センサー1,3が定義した閾値より小さいとき右に OnRev(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}; - 授業中に説明された課題をもう一度よく読んで、プログラムを改良してください。~ 1つ目の課題ではこさかさんの言うとおりですし、2つ目は右の方がが明るいときも左の方が明るいときも同じ動きをするのでは追跡できないと思います。また、例えばセンサ1が55でセンサ3が95のときロボットはどう動きますか?ifの場合分けをもう一度考えてください。 -- [[FI]] &new{2009-08-12 (水) 18:28:20}; - 一つ目のプログラムに関して言うと、light_maxの値が変化せず0のままなので、すぐに後半部分に入ってしまいます。おそらく、前半のどこかに何かlight_maxを入れる予定だったのだと思いますが、もう一度確認してみてください。二つ目では両方が50以下のとき、どうするのでしょうか?ifを使うときは場合分けにもれがないか気をつけてください -- [[FI]] &new{2009-08-31 (月) 17:06:42}; #comment CENTER:本日の訪問者&counter(today); CENTER:昨日の訪問者&counter(yesterday); CENTER:今日までの訪問者&counter(all);