[[2007a/MemberOnly/進行状況A]] #counter #contents *メンバーの紹介 [#z782c5b1] 今回のメンバーは「ZWEI」「クロ」「カズ」です *今回の課題 [#o20c9c88] 懐中電灯に向かってブロックを投げるロボットを作成する。 1 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。 2 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進む。 3 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 ただし、モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。懐中電灯の代わりに携帯のライトなどを利用し てもよい。 **☆今回の課題のポイント☆ [#y21e3f0d] &size(25){〔モーター数の制限!!〕}; モーターを2つしか使ってはいけないので、ロボットの構造を工夫しなければなりません。ブロックを投げる作業にモーターが1つ必要なので、1つのモーターだけで左右に動くことのできるロボットを作る必要があります。 ------------------------------------- &size(25){〔光源の探し方!!〕}; 今回は3種類の課題を、&size(20){1つのロボット};でクリアしなければなりません。そして、この3種類の課題すべてに通じていることは、光源の位置を把握する必要があるということです。&size(20){「どのようにすれば光源を見つける事ができるか?」};と考えた結果次のような事を思いつきました。 &size(20){《センサーの取り付け方》}; センサーを左右に平行に並べる。 &size(20){《プログラム》}; 左右のセンサーの値を比べて、光の強い方向に動くロボット・プログラムを作る。 &size(20){《結論》}; &size(22){左右の光センサーの値を比べたとき、より(光の)数値が大きかったセンサーの方向に光源があると推測できる。また、センサーの値がともに等しくて、かつ、光が一定値よりも大きなとき、ロボットの正面に光源があると判断することができる。}; *ロボットの説明 [#q678207e] **制作の過程 [#p052e2e2] ***土台の作成 [#x8fd32f1] 土台はタイヤ3つで支えました。↓ &ref(./SA350025.JPG); モーター、ギアはこのようになっています。↓ &ref(./SA350026.JPG); トップシークレットに載っていたものを参考に作りました。進行方向に対して逆に回転すると、ストッパーがギアの動きを止めます &ref(./SA350037.JPG); 上が、ギアとストッパーの拡大図です。ストッパーは二段構えとなっております。最初は1つしか付けていませんでしたが、より確実に逆回転を防ぐため、そして、ストッパーがはずれないようにするために2つにしました。 ***ブロックを投げる部分の作成 [#s90b73fa] いつもどこかに、ユニークな構造を作るA8Rです。今回のロボット制作の90%以上の時間をここに使いました。できあがったのがコチラ &ref(./SA350034.JPG); 上の写真では、わからないかもしれませんが、&color(#FF0000){ピッチングマシン};のような構造となっております。「ZWEI」の努力の結晶です。 -------------------------------- &size(22){ブロックを投げ飛ばす一連の動作}; &ref(./SA350028.JPG); 1 ギアが回転します。同時にタイヤが回り始めます -------------------------------- 2 ギアについている黒のパーツに注目してください。ギアの回転に伴い、この黒いパーツが投入台を押し上げ、ブロックの投入台の角度がきつくなっていきます。 &ref(./SA350029.JPG); 3 ある一定の角度まで投入台の角度が傾くとブロックが転がり、発射口の中へ入ります --------------------------------- &ref(./SA350030.JPG); 4 ブロックは落下によって加速し、また、タイヤの回転により、さらに加速して、発射口から飛び出します!! ----------------------------------------------------- &size(25){おまけ (内部の構造)}; &ref(./shoot.gif); ↑ ブロックが投入された後の、ロボット内部での動きです。 (見えやすくなるように、壁を取り除いたバージョンです) --------------------------------------- ***光センサー [#b89ddf74] 光センサーは平行に設置しました。 &ref(./SA350035.JPG); 他の班のアドバイスで、光センサーと光センサーの間に「しきり」を作りました。そのことにより、左右のセンサーがより正確に反応し、精度が格段とあがりました。 (もし「しきり」がなければ、ライトの光が強いとき、たとえ光源が右にあろうと、左にあろうと左右の光センサーの値がほとんど同じになってしまいます。それを防ぐのが「しきり」で、センサーに対して反対方向からの、角度のある光を遮ります) ***走行テスト [#dc3c6b94] ブロックを投げる部分がとても大きく、重かったのでロボットが動かないというアクシデントが発生!!今回の課題のモーター数量制限がこんなところに効いてしまいました。モーター1個では馬力が足りないようです。これまでの三時間にもわたる努力が、水の泡になると僕は思いました。 &size(25){しかし「&color(#FF0000){ZWEI};」はあきらめなかった。}; ☆まず、新しい電池に取り替えてみた &size(20){しかし、ロボットは動かず}; ☆次に、モーターの出力をあげるべくギア比の調整、タイヤのサイズの変更を行った。 &size(20){しかし、ロボットは動かず}; ☆上の作戦をあきらめ、次にタイヤのゴムを取り除き、摩擦を減らしてみることにした。~ また、ロボットの重心の位置を前から後ろに変えてみた &size(25){この作戦が見事成功!!ブロックを投げる部分を作り直さずにすみました。}; **完成したロボット [#wdae3797] &ref(./SA350033.JPG); 大変大きなロボットができあがりました。完成当初は動きすらしなかったロボットでしたが、たくさんの改良をくわえ、すべての課題をこなすロボットにしあがりました。 *プログラム [#j39b6f63] **「クロ」のプログラム [#nc7d6e86] 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げるプログラム task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2をタッチセンサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーと定義 while(true) {Off(OUT_B); while(SENSOR_3>SENSOR_1) //センサ−3がセンサ−1より大きい時 {OnFwd(OUT_A);Wait(10);} //右折 while(SENSOR_3<SENSOR_1) //センサ−1がセンサ−3より大きい時 {OnRev(OUT_A);Wait(10);} //左折 if((SENSOR_1>80)&&(SENSOR_3>80)) //センサ−1もセンサ−3も80より大きい { while(SENSOR_3>SENSOR_1) //センサ−3がセンサ−1より大きい時 {OnFwd(OUT_A);Wait(10);} //右折 while(SENSOR_3<SENSOR_1) //センサ−1がセンサ−3より大きい時 {OnRev(OUT_A);Wait(10);} //左折 if((-5<SENSOR_1)&&(SENSOR_1-SENSOR_3<5)) //光源が正面にあるとき {Off(OUT_B);Off(OUT_A); OnFwd(OUT_B);Wait(200); //ブロックを投げる Off(OUT_B);}Wait(100000); } } } **「ZWEI」のプログラム [#h8604498] 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進むプログラム #define LI 60 //光の閾値を定義 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3を光センサーと定義 while (true) { if ((SENSOR_1 < LI) && (SENSOR_3 < LI)) { }else{ //光源が動いたとき while(SENSOR_1 > SENSOR_3) //光源が左にあるとき { OnRev(OUT_A); //左折する } while(SENSOR_3 > SENSOR_1) //光源が右にあるとき { OnFwd(OUT_A); //右折する } } } } **「カズ」のプログラム [#r1a4840d] 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げるプログラム #define LI 73 //光の閾値を定義 int left_p; //変数を用意 int right_p; //変数を用意 int r_l; //変数を用意 int time_p; //変数を用意 #define gosa 5 //誤差の範囲を定義 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1を光センサーと定義 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3を光センサーと定義 while (true) { left_p = SENSOR_1; //変数に光センサー1の値を代入 right_p = SENSOR_3; //変数に光センサー3の値を代入 r_l = right_p - left_p; //光センサー1・3の光の強さの差を求める if ((SENSOR_1 > LI) && (SENSOR_3 > LI)) //光源が目の前にあるとき { Off(OUT_A);Off(OUT_B); //モーターABともに停止させる if ((Timer(3) > 20) && (Timer(3) < 60)) //停止してから2秒〜6秒のとき { OnFwd(OUT_B); //モーターを回転させて、ブロックを投げる } }else{ //光源が目の前にはないとき ClearTimer(3); //タイマー3をリセット Off(OUT_B); //モーターBをとめる if (r_l > gosa) //光源が右がわにあるとき { OnFwd(OUT_A); //右折する } if (r_l < -gosa) //光源が左にあるとき { OnRev(OUT_A); //左折する } if ((r_l <= gosa) && (r_l >= -gosa)) //光源が見つけられないとき { if (Timer(1) % 40 < 20) { OnFwd(OUT_A); //2秒間右折 }else{ OnRev(OUT_A); //2秒間左折 } } } } } *制作を終えて [#m690cf3a] **苦労した点 [#m416bf0f] ・3人の予定をあわせてロボットを製作するのが大変だった。 ・ブロックをなげる部分の作成・微調整に苦労した。しかし、これも独特かつ、より遠くに飛ばすことのできるロボットを作成しようとした結果なのでよかったと思う。 **工夫した点 [#d714e4c2] ・モーターの負担を減らすために、ロボット前方に偏っていた重心を移動させた事 ・センサーとセンサーの間に「しきり」を作ったこと **感想 [#u05f5f25] (クロ)今回私は、1のプログラムを担当しました。センサ−1とセンサ−3の光の誤差が少ない時に投げさせるプログラミングを作るのが大変だったが、ifとwhileを上手く使うことができたと思う。この課題で学んだことをロボコンで活かすことが出来たら良いと思う。 (カズ)今回は、ホームページとプログラム3を担当しました。今回のプログラムでは『%』の命令文(割り算の余りを求める命令文)をつかってみました。また1つ新しいことを実践できたのでよかったと思います。3人の予定があう日が少なく、ぎりぎりでの完成でしたが、満足のいくロボット・プログラムが作ることができてよかったです。 (ZWEI)ロボット本体の製作を主に行った。どうブロックを飛ばすのかに特に工夫を重ねた。しかしそのおかげで本体重量が増してしまい全く動かなかったロボットをどう動くようにするかに最も苦労した。以前と同じよう剛性も重視させたが、最後の方ではパーツ不足で思うように行かせることが大変だった。最終的には満足のいく本体が完成できた。プログラムに関しては非常に単純で特に苦労することはなかった。 *コメントをお願いします [#ffccdcc1] -ギアが回転して、傾斜がきつくなって・・・どういう風に投げる動作を行うのでしょう? なんとなくわかりますが、なんとなくしかわからないので、もう少し詳しい解説があるといいですね。 -- [[まいける(TA)]] &new{2007-07-05 (木) 00:50:49}; -同じく、投げる動作についてはもう少し説明があるとよいとおもいます。 -- [[ヒロヤ]] &new{2007-07-05 (木) 09:30:38}; -ページを修正しました -- [[A8R]] &new{2007-07-06 (金) 20:33:28}; #comment