今回は、「チノ」と「KY王子」の2人で課題をやっていくことになった。
全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げるロボットを作る。懐中電灯は動かさない。
また、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。
モータ、光センサ、タッチセンサはそれぞれ2個までしか使ってはいけない。
素早く光を発見し、懐中電灯が動いているならそれにあわせて追いかけるようにする。さらに、続けてブロックを投げれるようにする。
今回の課題では、モータは2個しか使えない、ということは1つのモータで起動部分を作り、もう1つのモータでブロックを投げる部分を作らなければならない。
ブロックを投げる部分については、2つの方法を思いついた。モータの遠心力を利用して投げる方法と、タイヤ2つでブロックを挟み、タイヤの回転を利用して投げる方法である。
このどちらの方法が目標や自分たちに合っているのだろうか。
タイヤの回転を利用する方法よりも、比較的簡単にできると思う。ややこしいギヤを使う必要もなく、パーツも少なくてすみそうだ。また、ピッチングマシーンのようなものができれば、ブロックを続けて投げることも可能だろう。
しかし、ブロックを投げるために腕の部分が必要となり、その腕の振りの直径の大きさによってロボット本体の大きさもかえなくてはならない。
投げるブロックを2つのタイヤで挟み込み、タイヤをお互いに逆回転させ、その回転を利用してブロックを投げる、というより飛ばすという方法。こちらの方法でもブロックをタイヤに次々に送り込むことができれば、続けて投げることが可能である。
遠心力を利用する方法よりコンパクトに作ることができるはず。しかし、1つのモータで2つのタイヤを逆回転させなければならないので、ギヤの組み合わせ方が複雑になる。
残り一つしか、モータを使うことができない。1つのモータで2つのタイヤを同じ方向に動かすだけなら、簡単だが今回の課題では、1つのモータで2つのタイヤをお互いに逆回転させることができなくてはならない。
1つのモータで2つのタイヤを動かすのは難しいらしく、先生がヒントをくれた。ギアの中にというギアを3つ入れ、タイヤがお互いに逆回転する装置を作り、さらにストッパーを使い片方のタイヤの回転を止める方法を使うといいと教えてくれた。
ほかにも考えてはみたが、何も思いつかなかった。
今回の課題のメインは、光を感知して追いかけること。当然光センサーを使うことになる。では、どのようにして光センサーを使っていけばいいのか。
光センサーを1つしか使わないのならば、ロボットの前方に設置し、光を見失ったら頭を左右に振り光を探すようにする。この方法を使うと光を探す時間のタイムロスが光センサーを2つ使う場合よりも大きくなってしまう。
基本的に今回の課題を考えると、光センサーを1つしか使わないよりも、光センサーを2つ使う方が効果的である。どのように使うのが1番なのだろうか。
光センサーを左右に設置する
↓
光センサーを左右につける方法では、光が左右どちらに動いた場合、1つのセンサーは反応し、もう1つは反応しないから、光がどちらに動いたのかがわかり、素早く対応することができる。
光センサーを前後に設置する
↓
光センサーを前後につけることで、光源との距離をある程度、測ることができる。光源がストップすると後ろにつけたセンサーが反応し、止まるようになる。
今回作ったロボットの製作過程の記録。苦労した点、工夫した点など、写真を加えて説明している。
ベースはロボットの機動力を生み出す大切な部分。ロボットが前進するにも、後退するにも必ず必要な部分である。
今回の課題では、前述したように1つのモータで2つのタイヤを動かさなくてはならない。そこで、ヒントに載っていたのを参考にして作ってみた。
ヒントに載っていた方法を使うと左右の切り返しが多くなり、小回りの利くロボットがいいと考えた。前回の課題で初めてタイヤを使ってみたが、曲がり方も的確で変なズレはなかったので今回もタイヤを使うことにした。
やはり、1つのモータで2つのタイヤを動かすにはギヤをたくさん使わなければならない。しかもこの作り方だと、タイヤが回転する方向としない方向があり、とてもややこしく頭が混乱してしまった。
光センサーは、2つ使用し、ロボットの前方左右に設置する作戦で試すことにした。
前回も使用したからか、すぐにできた。
ブロックを投げる方法は、さんざん迷ったあげく、遠心力を利用した方法をとることになった。理由としては、ギヤがごちゃごちゃするとややこしいし、複雑になるとわかりづらくなるからである。ロボット本体は大きくなるが、遠心力を利用する作戦を試すことにした。
遠心力を最大限に生かすために、モータとブロックを持つ腕を直結させた。また、投げるブロックは1つではなく、何度も投げられるようにいくつもブロックを持てるようにした。その際、ブロックが落ちないような工夫をこらした。
遠心力を利用したブロックを投げる部分を採用したせいかロボット本体がでかくなってしまった。また、ベースにブロックを投げる部分などを合体させるときにも、コードをよけるような組み立てをした。
だが、本体が大きいせいで重みが増し、タイヤがうまく回らなくなってしまった。べ−スの前後をかえるなどしてみたが効果はでなかった。
1号機の重さを増やしているのはブロックを投げる部分だと考え、軽量化を図ることにした。また、片方に主さが偏るといけないので、ブロックを投げる部分は本体の後方に設置することにした。
今回も遠心力を利用した方法をとることにした、1号機のブロックを投げる部分は大きめのブロック主体だったが、改良版は軽そうなブロックでシンプルに作ってみた。さらに、改良版ではギヤを使ったが、ギヤも1つだけでモータの力を伝えられるようにした。
↓
1号機の動きが悪いのは、重み以外にもあるのではないかと思い調べたところ、タイヤを着ける位置を間違えている部分が発見された。改善前の状態ではタイヤが逆方向に回転してしまい、右にしか曲がることができなかった。タイヤの位置を変更することでちゃんと左右どちらにも曲がれるようにした。
↓
試作品1号機改良の最大の目的である軽量化は成功した。実際にプログラミングをダウンロードして走らせたところロボットの重みで、タイヤが回らなくなることはなくなった。
しかし、新たな問題が発生した。ブロックを投げる段階になって、実際に投げてみたところ勢いがなくて、ブロックが前に飛ばなかった。ギヤを使ったことでモータの力が今までより伝わらなかったようだ。
2号機はモータとブロックを投げる部分をギヤでつなげていた。やはり、モータとブロックを投げる部分を直接つなげることにした。
ブロックを投げる部分自体はすぐにできたが、本体にのせてみるととても不安定で、少しの振動でとれてしまいそうだった。そこでベースの邪魔にならないようにしっかりと補強した。
さらに、連射できるように改造した。
プログラミングもブロックを投げる部分も実際に走らせて、調整をして、今までの問題を解決できた。さらに、組み替えていく中で光センサーもしっかりと設置した。
問題点としては、光センサーがどちらから照らされているか判別しにくい、補助タイヤのノイズ、ベースのパワー不足が残った、それを解決すれば、完成である。
まず補助タイヤがこすれるたびにキーキー鳴っていたので地面との接地面が丸いタイヤと変更した。
↓
次に、タイヤのパワーを出すために、ギヤを少し大きくした。
光センサーがどちらから照らされているか判別しやすくするために、光センサーの間についたてを付け加えた。
幾度かの改造を終えてついに完成した。
今回の課題では、1人1つプログラミングを作らなくてはならない。A8Lは2人で3つのプログラミングを制作する。「KY王子」が1つ、「チノ」が2つ担当した。
#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((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) { //センサー1か3が受ける光が閾値より弱ければ実行 OnFwd(OUT_C); //時計回りに回転 Off(OUT_A); } Off(OUT_C); OnFwd(OUT_A); Wait(50); //両方とも受ける光が閾値より強くなったらブロックを投げる OnRev(OUT_A); Wait(50); Off(OUT_A); }
#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と3が受ける光が閾値より強ければ前進 OnRev(OUT_C); Wait(15); OnFwd(OUT_C); Wait(15); } 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)) { //光がなければ時計回りに回転 OnFwd(OUT_C); Off(OUT_A); } } Off(OUT_A+OUT_C); }
#define THRESHOLD 65 //閾値 #define RUN_TIME 25 //RUN_TIMEを2,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((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD) || (Timer(0) <= RUN_TIME)) {//光が閾値より弱くタイマーが2,5秒以下ならば実行 if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサー1と3が受ける光が閾値より強ければ前進 OnRev(OUT_C); Wait(15); OnFwd(OUT_C); Wait(15); } if ((SENSOR_1 > THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //センサ−3が受ける光が暗くなったら左折 ClearTimer(0); //タイマーをクリアする OnRev(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 > THRESHOLD)) { //センサ−1が受ける光が暗くなったら右折 ClearTimer(0); //タイマーをクリアする OnFwd(OUT_C); Off(OUT_A); } if ((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) { //光がなければ時計回りに回転 ClearTimer(0); //タイマーをクリアする OnFwd(OUT_C); Off(OUT_A); } } Off(OUT_C); OnRev(OUT_A); Wait(50); //前進を2,5秒以上続けたらブロックを投げる OnFwd(OUT_A); Wait(50); Off(OUT_A); }
今回のプログラミングではwhileをより効率的に使えるように努力した。また、モーターの出力を7にすることでスムーズに動けるようにした。最後のプログラミングではタイマーを使って懐中電灯が止まったかどうか判断するようにした。
今回の課題では本体を動かすモータが一つしか使えず、どのように光を追えばいいかロボットの製作、プログラミングともに苦労した。また、ブロックを投げるアーム部分も最初はうまくいかず何度も改良をして大変だった。この課題を通して学べたことをこれから行うロボコンに活かしていきたい。