[[2008b/MemberOnly/進行状況A]] 2008b/A7/課題3右 #hr CENTER:&size(25){光追跡ロボット}; #hr CENTER:製作者:タキさ Y田 目次 #contents *課題についての説明 [#d306895c] インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、 以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること) 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで 懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを 止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、 タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく 懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。 *製作したマシン [#e6da836a] マシン製作はほとんどY田が担当。タキさは光センサ位置等の調整くらいしかやってない。 下にある画像が完成したマシンです。 このマシンの製作行程は以下の通り。 ------- まずインストの「top secret」を参考にしてドライブベース部を作った。 このとき、モーターを回転させると、ストッパーがなければ両方のタイヤがそれぞれ逆方向に回転するが、このストッパーのおかげで後方に回転できないため、一方のタイヤだけが前進する。また、モーターを逆回転させれば、もう一方のタイヤだけが前進するようになっている。 COLOR(#808080):''ストッパー ギアの組み合わせ ドライブベース'' COLOR(#808080):&ref(2008b/A7/課題3右/stoper3.jpg,50%,);| COLOR(#808080):&ref(2008b/A7/課題3右/gia3.jpg,50%,);| COLOR(#808080):&ref(2008b/A7/課題3右/kiteibu3.jpg,50%,);| 次に、ブロックを投げるアームを製作 少し長いアームになったが、これは「苦労・工夫した点」に記述する。 COLOR(#808080):''ブロックを投げるアーム'' COLOR(#808080):&ref(2008b/A7/課題3右/aim_light3.jpg,50%,);| COLOR(#808080):&ref(2008b/A7/課題3右/arm_left3.jpg,50%,);| ドライブベースとアーム、RCX、光センサを組む。 そして光センサの位置等を調節して、下図のようになり、マシン完成。 COLOR(#808080):''マシン全体図'' COLOR(#808080):&ref(2008b/A7/課題3右/zentai_yoko3.jpg,50%,);| COLOR(#808080):&ref(2008b/A7/課題3右/zentai_ue3.jpg,50%,);| *モータ・センサに対応する端子 [#d352300d] モータ、センサについては以下の端子に接続してあります。 -出力側 A端子 → モータ:タイヤ(正回転:右回転,逆回転:左回転) B端子 → 使用せず C端子 → モータ:アーム(正回転:使用せず,逆回転:投げる) -入力側 1端子 → 光センサ(右) 2端子 → 使用せず 3端子 → 光センサ(左) *プログラムの紹介 [#n9e8de4f] Y田製作プログラム(課題1) 1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで 懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 task main(){ int s1, s3; //s1:センサ1の判定値、s3:センサ3の判定値 s1 = 0; s3 = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); //左回転 ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > s1)s1 = SENSOR_1; //センサ1のmax値を測定 if(SENSOR_3 > s3)s3 = SENSOR_3; //センサ3のmax値を測定 } s1 = s1 - 5; //センサ1の判定値を決定 s3 = s3 - 5; //センサ3の判定値を決定 while(1){ if((SENSOR_1 > 75) || (SENSOR_3 > 75)){ //75:おおよそ50cm離れてるときの値 Off(OUT_A); OnRev(OUT_C); //ブロックを投げる Wait(17); Off(OUT_C); break; } if(SENSOR_1 < s1 && SENSOR_3 >= s3){ //センサ3のみが判定値を超えていたら while(SENSOR_1 < s1)OnFwd(OUT_A); //センサ1が判定値を超えるまで右回転 } if(SENSOR_1 >= s1 && SENSOR_3 < s3){ //センサ1のみが判定値を超えていたら while(SENSOR_3 < s3)OnRev(OUT_A); //センサ3が判定値を超えるまで右回転 } } } ------- タキさ製作プログラム(課題2) 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを 止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。 /* 光追跡ロボット */ /* 定数を定義 */ #define SHI_J 75 //75:おおよそ50cm離れてるときの光センサ値 /* 前進関数 */ void move_fwd(void){ OnFwd(OUT_A); Wait(27); OnRev(OUT_A); Wait(20); Off(OUT_A); } /* メイン関数 */ task main(){ int rigth_max, left_max; //右センサ、左センサの懐中電灯判断値 rigth_max = 0; left_max = 0; SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_A,5); OnRev(OUT_A); ClearTimer(0); while(FastTimer(0) <= 500){ if(SENSOR_1 > rigth_max)rigth_max = SENSOR_1; //右センサのmax値を測定 if(SENSOR_3 > left_max)left_max = SENSOR_3; //左センサのmax値を測定 } ligth_max = rigth_max - 5; //右センサの判断値決定 left_max = left_max - 5; //左センサの判断値決定 while(1){ if((SENSOR_1 > SHI_J) || (SENSOR_3 > SHI_J)){ //懐中電灯まで50cmになったら Off(OUT_A); //停止 OnRev(OUT_C); //ブロックを投げる Wait(17); Off(OUT_C); break; //ループを抜ける } if(SENSOR_1 >= rigth_max && SENSOR_3 >= left_max){ //両センサ値とも判断値以上なら while((SENSOR_1 >= rigth_max) || (SENSOR_3 >= left_max))move_fwd(); //その間前進 } else if(SENSOR_1 < rigth_max && SENSOR_3 >= left_max){ //左センサ値だけ判断値以上なら while(SENSOR_1 < rigth_max)OnRev(OUT_A); //右センサ値が判断値以上になるまで左回転 } else if(SENSOR_1 >= rigth_max && SENSOR_3 < left_max){ //右センサ値だけ判断値以上なら while(SENSOR_3 < left_max)OnFwd(OUT_A); //左センサ値が判断値以上になるまで右回転 } else if(SENSOR_1 < rigth_max && SENSOR_3 < left_max){ //両センサ値とも判断値未満なら while((SENSOR_1 < rigth_max) || (SENSOR_3 < left_max))OnRev(OUT_A); //どちらかのセンサ値が判断値以上になるまで左回転 } } } *苦労・工夫した点 [#u55de425] 苦労した点 -マシン製作において、やはりドライブベースが一番苦労した。ギア数やギア比など、いままであまり考えてこなかったことだったので、苦労した。 -プログラム制作をしているとき、光センサの位置等を少し変えるだけで動作が変わってしまうので、まさに試行錯誤だった。 -懐中電灯の光を見つけるのはともかく、それをゆっくり動かしたとき、どうやって追いかけるかが難しかった。結局、そのまま光を追うことはできず、懐中電灯を動かしたらマシンをその場で回転させて光を感知するような動作になった。 工夫した点 -マシン製作にあたり、なるべく部品を少なくするよう心がけた。また、ブロックを美しく、そして的確に飛ばすよう工夫した結果、少し長くなったがこのようなアームができた。 -画像ではわかりにくいが、光センサの先にL字ブロックを付けたことにより、L字ブロックの穴からしか光が入らないため、付けないときに比べ、より的確に懐中電灯の光を捉えることができた。 -プログラムは動作の速さや無駄のなさも重要だが、今回は確実に懐中電灯から50cmの距離からそれに向かって投げるようにしたかったため、多少無駄な動作が生じてでも確実性のあるプログラムを目指した。その結果、今回制作したプログラムで実際に動作させてみると、途中1回転して光を追うような一見無駄が多いように見える動作が入ってしまうが、その後ほぼ確実に光を捉えるため、この点がプログラムで最も工夫した点といえる。 *皆さんのコメント [#g72ad519] よろしければコメントをどうぞ - テスト -- [[タキさ]] &new{2009-01-22 (木) 18:30:46}; #comment