懐中電灯に向かってホイールを投げるロボットを作成
1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。
2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。
今回の課題にはモータの使用できる個数に2個という制限がある。ホイールを投げるのにモータを一つ使用するので本体の動力部にはモータが一つしか使えない。そこで、ディファレンシャルギアを使用した。
これを使うことにより動力部のモーターは1個で動かせるようになり、もう一つのモーターをアームに回すことができる。
どのようにアームを作れば最も強くホイールを投げられるかを考えた結果、モーターにアームを直結すれば強くなるのではないかと思い直接つけることにした。 最初はモータに直接黄色のパーツをつけて投げる方法にした。ただアームの上にホイールをのせるだけなので不安定だったが投げることができた。
しかしこれでは遠心力が弱く懐中電灯まで全く届いていないのでアームを変更することにした。
前のアームは短すぎたため遠心力があまり働かず距離が出なかった。そこでアームを長くしてみると以前に比べて距離が出るようになった。しかし、あまりアームが長すぎると重さで回転力が失われてい舞うためこの長さに落ち着いた。
左右への動きを制限しないようにタイヤはキャスター付きの三輪にすることにした。
光センサーは2つ前方に取り付け、その下にキャスターを取り付けることでロボを安定させた。
形としてはなかなかシンプルに完成できた。基本的には単純な機構で作り上げることができた。
#define THRESHOLD 60 //閾値Aを60と定義 #define NAGERU 88 //閾値Bを88と定義 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサーを光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサーを光センサーと定義 while(true){ if ((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) {OnFwd(OUT_A);} //センサーのどちらかが閾値A以下なら回転し光を見つける。 if (((SENSOR_1 < NAGERU) && (SENSOR_1 > THRESHOLD)) || ((SENSOR_3 < NAGERU) && (SENSOR_3 > THRESHOLD))) {Off(OUT_A); Wait(10); OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } //センサーのどちらかが閾値A、Bの間なら光に向かって進む。 if ((SENSOR_1 > NAGERU) || (SENSOR_3 > NAGERU)) {Off(OUT_A); Wait(10); SetPower(OUT_C,7); OnFwd(OUT_C); Wait(19); Off(OUT_C); } //センサーのどちらかが閾値Bを越えたらホイールを投げる。 } Off(OUT_A+OUT_C); //停止 }
課題2
#define THRESHOLD 55 //閾値Aを55に。 #define THROW 80 //閾値Bを80に。 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサーは光センサー。 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサーは光センサー。 while(true){ if ((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) //センサーのどちらかが閾値A以下なら光を探す。 {OnFwd(OUT_A);} if (((SENSOR_1 < THROW) && (SENSOR_1 > THRESHOLD)) && ((SENSOR_3 < NAGERU) && (SENSOR_3 > THRESHOLD))) {Off(OUT_A); Wait(10); OnFwd(OUT_A); Wait(20); OnRev(OUT_A); Wait(20); } //センサーが両方とも閾値A,B間なら前進。 if ((SENSOR_1 > THROW) || (SENSOR_3 > THROW)) {Off(OUT_A); Wait(10); OnFwd(OUT_C); Wait(10); Off(OUT_C); } //センサーのどちらかが閾値Bを越えたらホイールを投げる。 if ((SENSOR_1 < THRESHOLD)&& ((SENSOR_3 < THROW) && (SENSOR_3 > THRESHOLD))) {OnFwd(OUT_A); } //センサー1が光から遠い場合右に曲がる。 if ((SENSOR_3 < THRESHOLD)&& ((SENSOR_1 < THROW) && (SENSOR_1 > THRESHOLD))) {OnRev(OUT_A); } //センサー3が光から遠い場合左に曲がる。 } Off(OUT_A+OUT_C); //停止 }
今回は単純に&&と||を使用したプログラムで作ってみた。少し不安はあったけど思ったよりもうまくいったのでよかった。しかし、なぜか最後のOFFに反応しなくてロボットがホイールを投げた後もずっと動き続けていたのでそこも直せるとよかった。
ロボットのほうはなかなかホイールを投げた時の飛距離が伸びずいろいろと工夫してみたけど最終的にあと少し届かなかったのが悔しかった。