[[2007a/MemberOnly/進行状況A]] #contents *概略 [#nd06a4f1] **今回の課題 [#la79c24f] 全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げるロボットを作る。懐中電灯は動かさない。 また、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。 **今回の条件 [#r2cdec04] モータ、光センサ、タッチセンサはそれぞれ2個までしか使ってはいけない。 **今回の目標 [#y8ecd4a8] 素早く光を発見し、懐中電灯が動いているならそれにあわせて追いかけるようにする。さらに、続けてブロックを投げれるようにする。 *作戦 [#v7ceb6b0] 今回の課題では、モータは2個しか使えない、ということは1つのモータで起動部分を作り、もう1つのモータでブロックを投げる部分を作らなければならない。 **ブロックを投げるには [#z9d4f20e] ブロックを投げる部分については、2つの方法を思いついた。モータの遠心力を利用して投げる方法と、タイヤ2つでブロックを挟み、タイヤの回転を利用して投げる方法である。 このどちらの方法が目標や自分たちに合っているのだろうか。 ***モータの遠心力で投げる方法 [#t888dd98] タイヤの回転を利用する方法よりも、比較的簡単にできると思う。ややこしいギヤを使う必要もなく、パーツも少なくてすみそうだ。また、ピッチングマシーンのようなものができれば、ブロックを続けて投げることも可能だろう。 しかし、ブロックを投げるために腕の部分が必要となり、その腕の振りの直径の大きさによってロボット本体の大きさもかえなくてはならない。 ***タイヤの回転を利用して投げる方法 [#z765aa22] 投げるブロックを2つのタイヤで挟み込み、タイヤをお互いに逆回転させ、その回転を利用してブロックを投げる、というより飛ばすという方法。こちらの方法でもブロックをタイヤに次々に送り込むことができれば、続けて投げることが可能である。 遠心力を利用する方法よりコンパクトに作ることができるはず。しかし、1つのモータで2つのタイヤを逆回転させなければならないので、ギヤの組み合わせ方が複雑になる。 **モータ1つで2つのタイヤを動かすには [#g01cbade] 残り一つしか、モータを使うことができない。1つのモータで2つのタイヤを同じ方向に動かすだけなら、簡単だが今回の課題では、1つのモータで2つのタイヤをお互いに逆回転させることができなくてはならない。 ***ヒントに載っていた方法 [#ec9e7517] 1つのモータで2つのタイヤを動かすのは難しいらしく、先生がヒントをくれた。というギアの中にというギアを3つ入れ、タイヤに動きを与えるギアの片方の回転を止める方法を使うといいと教えてくれた。 ほかにも考えてはみたが、何も思いつかなかった。 **光を追うには [#h7ef7301] 今回の課題のメインは、光を感知して追いかけること。当然光センサーを使うことになる。では、どのようにして光センサーを使っていけばいいのか。 ***光センサー1つで行う方法 [#kae5e647] 光センサーを1つしか使わないのならば、ロボットの前方に設置し、光を見失ったら頭を左右に振り光を探すようにする。この方法を使うと光を探す時間のタイムロスが光センサーを2つ使う場合よりも大きくなってしまう。 ***光センサーを2つ使う方法 [#b22b1d09] 基本的に今回の課題を考えると、光センサーを1つしか使わないよりも、光センサーを2つ使う方が効果的である。どのように使うのが1番なのだろうか。 光センサーを左右に設置する ↓ 光センサーを左右につける方法では、光が左右どちらに動いた場合、1つのセンサーは反応し、もう1つは反応しないから、光がどちらに動いたのかがわかり、素早く対応することができる。 光センサーを前後に設置する ↓ 光センサーを前後につけることで、光源との距離をある程度、測ることができる。光源がストップすると後ろにつけたセンサーが反応し、止まるようになる。 *製作過程 [#i71625ad] 今回作ったロボットの製作過程の記録。苦労した点、工夫した点など、写真を加えて説明している。 **ベースの製作 [#u63e8ff3] ベースはロボットの機動力を生み出す大切な部分。ロボットが前進するにも、後退するにも必ず必要な部分である。 今回の課題では、前述したように1つのモータで2つのタイヤを動かさなくてはならない。そこで、ヒントに載っていたのを参考にして作ってみた。 ラチェットを使うと左右の切り返しが多くなり、小回りの利くロボットがいいと考えた。前回の課題で初めてタイヤを使ってみたが、曲がり方も的確で変なズレはなかったので今回もタイヤを使うことにした。 やはり、1つのモータで2つのタイヤを動かすにはギヤをたくさん使わなければならない。しかもこの作り方だと、タイヤが回転する方向としない方向があり、とてもややこしく頭が混乱してしまった。 **プログラミング [#ec69d54c] 今回の課題では、1人1つプログラミングを作らなくてはならない。A8Lは2人なので2つのプログラミングを制作した。 ***懐中電灯が動かない場合 [#q8c4621b] #define THRESHOLD 65 //閾値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに定義する SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに定義する SetPower(OUT_A+OUT_C,7); //AとCのモーターの出力を7にする while(true) { if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサー1と2が受ける光が閾値より強ければブロックを投げる Off(OUT_C); OnRev(OUT_A); Wait(18); OnFwd(OUT_A); Wait(18); } else { OnRev(OUT_C); //そうでなければ反時計回りに回転 Off(OUT_A); } } Off(OUT_A+OUT_C); } ***懐中電灯をゆっくり動かす場合 [#cb553c3b] #define THRESHOLD 65 //閾値 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに定義する SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに定義する SetPower(OUT_A+OUT_C,7); //AとCのモーターの出力を7にする while(true) { if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサー1と2が受ける光が閾値より強ければ前進 OnRev(OUT_C); Wait(30); OnFwd(OUT_C); Wait(30); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //センサ−3が受ける光が暗くなったら左折 OnRev(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサ−1が受ける光が暗くなったら右折 OnFwd(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //光がなければ反時計回りに回転 OnRev(OUT_C); Off(OUT_A); } } Off(OUT_A+OUT_C); } ***懐中電灯を追いかけ懐中電灯の動きが止まればブロックを投げる場合 [#n49bb603] #define THRESHOLD 65 //閾値 #define RUN_TIME 50 //RUN_TIMEを5秒に定義する task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1を光センサーに定義する SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3を光センサーに定義する SetPower(OUT_A+OUT_C,7); //AとCのモーターの出力を7にする ClearTimer(0); //タイマーをクリアする while(true) { if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD) && (Timer(0) <= RUN_TIME)) { //センサー1と2が受ける光が閾値より強くタイマーが5秒以下ならば前進 OnRev(OUT_C); Wait(30); OnFwd(OUT_C); Wait(30); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD) && (Timer(0) > RUN_TIME)) { //5秒以上懐中電灯を追っていればブロックを一回投げる repeat(1){ OnFwd(OUT_A); Wait(18); OnRev(OUT_A); Wait(18); } ClearTimer(0); //タイマーをクリアする Off(OUT_A); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { ClearTimer(0); OnRev(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { ClearTimer(0); OnFwd(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { ClearTimer(0); OnRev(OUT_C); Off(OUT_A); } } Off(OUT_A+OUT_C); }