インストの「top secret」を参考にして、白いホイールを投げるロボットを作成し、以下の動きをするようにプログラムを作成せよ。 (重複しないように一人一つ以上のプログラムを作成すること)
1. 全方向から懐中電灯の方向を探しだし、懐中電灯の手前50cmまで進んで懐中電灯を狙ってブロックを投げる。懐中電灯は動かさない。 2. 懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいて懐中電灯を狙ってブロックを投げる。
懐中電灯の代わりに携帯のライトなどを利用してもよい。モータ、光センサ、タッチセンサはそれぞれ2個まで使用可。ただし、平面的な方向だけでなく懐中電灯の高さまで含めた方向を探す場合にはモータを3個使用してもよい。
使用できるモータの数が2個という制限があるので、そのうち1つはブロックを投げる機構に使用するとして、残ったもう一つでいかにしてロボットの駆動を行うかという点がポイントとなる。よってこの課題ではディファレンシャルギアを用いることが必須であると思われたので、1度はそれを用いてロボットを組み立てたものの、その後の相方の提案によって、ディファレンシャルギアを用いらない独自の機構をもったロボットの製作を目指し、ロボットを再び組み直すこととなった。
下の写真はロボットの全体図。
そして次の写真は、ギアの部分。
3枚目の写真も同じくギア部。
最後の写真は写真は,ブロックを投げる機構。かなりシンプルな構造。
#define THRESHOLD 50 //閾値1を50に設定 #define THROW 70 //閾値2を70に設定 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1が光センサであると宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3が光センサであると宣言 while(true){ if ((SENSOR_1 < THRESHOLD) || (SENSOR_3 < THRESHOLD)) //センサ1と3のどちらかが閾値1より弱ければ光を探す { OnFwd(OUT_A);} if (((SENSOR_1 < THROW) && (SENSOR_1 > THRESHOLD)) && ((SENSOR_3 < THROW) && (SENSOR_3 > THRESHOLD))) { Off(OUT_A); Wait(10); OnFwd(OUT_A); Wait(10); OnRev(OUT_A); Wait(10); OnFwd(OUT_A); Wait(10); OnRev(OUT_A); Wait(10); } //センサ1と3両方が閾値1と2の間なら前進(右折と左折を交互に繰り返す) if ((SENSOR_1 > THROW) || (SENSOR_3 > THROW)) { Off(OUT_A); Wait(10); OnFwd(OUT_C); Wait(30); Off(OUT_C); } //センサのうち片方が閾値2を越えたらブロックを投げる 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); }
動きがとてもぎこちないものとなってしまったので、やはりディファレンシャルギアを用いるべきだったと思う。また、プログラムを考えるのもなかなか難しく、多くの課題を残す結果となってしまった。
コメントをどうぞ