黄色いホイールを2個以上連射するロボットを作成し、以下の動きをするようにプログラムを作成する。ただし1は懐中電灯を2個使用し、ロボットの動作中は懐中電灯を動かさないがいろいろな距離や方向にある懐中電灯に対応できるロボットにする。2は懐中電灯を1個使用し懐中電灯をゆっくり動かす。
1、全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げる。
2、懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
正面からマシンを見た図。
これだと少し分かりづらいので、横から見た図を次に示します。
そして、これがマシンを横から見た様子です。
弾は、ハンマーをモーターで動かし、直撃させることで発射する方式を取っています。
図の赤い線が、ハンマーの動く奇跡、
図の紫の線が、弾が飛んでいく方向をそれぞれ表しています。
さて、懐中電灯の光を追うセンサーですが、今回は左右どちらの位置に光があっても反応できるように、2つ光センサーがついています。
図の、青い視覚で囲まれた部分に光センサーが装着されています。
また、それぞれ中央部に黒いブロックを装着しました。
図の、黒い丸の部分です。
この黒いブロックをつけることで光センサーの認識範囲が重複しないようにしました。
図で示したほうがわかりやすと思うので、以下に参考図を貼りつけます。
黄色く塗りつぶしてあるところが光センサーの範囲です。
このように左右のセンサーの範囲を完璧に分けることで
1.両方が光を感知しているとき
2.片方が光を感知しているとき
3.どちらも光を感知していないとき
の3パターンのときに、それぞれに対応するプログラムを割り当てれば良い、と考えたからです。
また、弾の発射台ですが、今回の発射台は少し特殊な作りになっています。
このように、レゴブロック表面の丸い突起物の間に、ブロックを挟み込むようにして作られています。
普通に組み立てるだけでは、どうしてもうまくいかなかったのでこのような形となりました。
(具体的には、弾にうまくフィットする発射台が作れなかったところが大きかったのです)
今回は、マシンを作るところから苦労しました。
やはり、マシンの取扱説明書に書いてあるようなものでは課題をクリアできない…
ということから始まり、弾の発射はどうするのか、光センサーはどう配置するべきか、という問題を一つ一つ考えていきました。
そして、過去の人のページなどを参考にしつつも自分たちなりに考えたものがこのマシンということになります。
時間的な制約もありましたので急ピッチで作りましたが、今考えるともう少し改良できたような気もします…
しかし、マシンを作らないとプログラムの制作も進まないので、その辺りは仕方がなかったかな、とも思います。
#define H 600 //左光センサーの閾値 #define F 600 //右光センサーの閾値 #define fire OnFwd(OUT_B);Wait(15);OnRev(OUT_B);Wait(15);Off(OUT_B); //ホイールを打つ動作 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT);//端子1に光センサーを接続 SetSensor(SENSOR_3, SENSOR_LIGHT);//端子3に光センサーを接続 int shot=0;//ホイールを打った回数 while(shot<3)//ホイールを打った回数が3未満の時 {if ((SENSOR_1 > H)&&(SENSOR_3 > F))//両方のセンサーが光を感知したとき {fire;//ホイールを発射! OnFwd(OUT_A);OnRev(OUT_C);Wait(45);//回れ左 shot++;}//打った回数を1増やす if ((SENSOR_1 > H)&&(SENSOR_3 < F))//センサー1が光を感知したとき {OnFwd(OUT_A);OnRev(OUT_C);Wait(5);}//回れ左を続けます if ((SENSOR_1 < H)&&(SENSOR_3 < F))//両方のセンサーが光を感知していないとき {OnFwd(OUT_A);OnRev(OUT_C);Wait(5);}}//回れ左を続けます Off(OUT_A+OUT_C);//投げ終えたら停止 }
二つの光センサーの感度が異なるので、閾値は最初は別々に設定していましたが、
懐中電灯の光は思ったよりもはるかに強力で、結局同じ値に落ち着きました。
ホイールを打つときの動作は、
モーター回転 → ハンマーがホイールを打ち出す → モーター逆回転でハンマーを元の位置に戻す
というプロセスを踏んでいます。
初めはもう少し複雑なプログラムになるかと思っていたのですが、ホイールを打ち出す機構が
思っていたよりもシンプルに出来上がったので、プログラムもシンプルになりました。
利点があれば欠点もあるわけで…
このホイール打ち出し機構はシンプルにできたのはいいのですが、
半面安定性が今ひとつでよく飛ぶときもあれば、飛距離が伸びないこともあったのが問題でした。
打ち出す動作はモーター一つで行っているので、プログラムの書き換えでは対処しにくかったのが反省点でした。
もう少しマシンの方を改良すべきでしたか…
whileやifなど、今まで書いてきたプログラムを使った総集編!
…とまでは行かなくとも、いつも通りプログラムを書くのは苦労しました。
ほか、ホイール発射機構をもう一度作り直す手間を惜しんだせいで挙動が安定しないのは言わずもがな。