クーロン茶、たいよう、おかじ
紙に黒ペンで線を引いて、その上をひたすらまわるロボットの作成
★製作者★ おかじ
これ↑が一応ロボットの原型?です。課題の発表時にはこの姿で走らせました。
しかし、こんな何の特徴もないロボットじゃつまらない!閲覧者の皆さん、そう思いませんか!?(いや、別に)
そこで、ロボット製作のエキスパート、おかじさんが素晴らしいロボットを製作してくれました。それがこれ↓
一応足もあります☆この足で重たい体を支えてます。
この鼻。。。ここだけの話やけど上下運動します!!電子辞書を持ち上げるくらいのパワーがあります(マジで)
<ロボットについて>
おかじさんによると、本当はこれ、ぞうさんじゃなくてカブトムシのつもりだったらしいです(^o^;でも、最終完成体はぞうでもカブトムシでもなくて、サソリロボットになったんですが...
ちなみに、この上下する鼻を製作するのに余ってたギアーを10個も使ったとの話(^^;
ここからはまじめにいきます。
まず、ライトセンサーとタッチセンサーの両方のプログラムを1度に考えるのは難しいと思ったので、はじめはライントレースをするためのプログラムのみを考えてみることにしました。タッチセンサーのプログラムは後ほど考えることに。
ライントレースのみのプログラムです。<製作者> クーロン茶 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1がライトセンサーであると宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−2がライトセンサーであると宣言 OnFwd(OUT_A+OUT_C); while (true) { if(SENSOR_1 < 40) { //左側のライトセンサーが黒線に触れると OnFwd(OUT_C); //右側のタイヤだけを回転 Off(OUT_A); } if(SENSOR_3 < 40) { //右側のライトセンサーが黒線に触れると Off(OUT_C); //右側のタイヤだけを回転 OnFwd(OUT_A); } } }
次に、上のプログラムに2種類のタッチセンサーのプログラムを追加することにしました。
まずは右によけるプログラム。ただ右によけるだけじゃ他方のロボットに衝突してしまう恐れがあるので、はじめに右によってよけるという案を思い浮かべました。
このプログラムを完成させるのに何かヒントはないかと考えたところ、以前の課題で四角形のプログラムを製作したのを思い出しました。それがこれです↓
四角形を描くプログラム task main() { OnFwd(OUT_A+OUT_C);//前進します。 Wait(200); OnFwd(OUT_A);//90度回転し、 Wait(100); OnRev(OUT_C); Wait(100); OnFwd(OUT_A+OUT_C);//また前進します。 Wait(200); OnFwd(OUT_A);//90度回転。 Wait(100); OnRev(OUT_C); Wait(100); OnFwd(OUT_A+OUT_C);//前進。 Wait(200); OnFwd(OUT_A);//90度回転。 Wait(100); OnRev(OUT_C); Wait(100); OnFwd(OUT_A+OUT_C);//前進。 Wait(350); Off(OUT_A+OUT_C);//ストップします。 }
このプログラムを今回の課題に応用すればいいんじゃないかと思い、早速実行!そしてできたのが下のプログラムです↓
右によけて追い越すプログラムです。☆製作者☆ クーロン茶&たいよう task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1がライトセンサーであると宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2がタッチセンサーであると宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3がライトセンサーであると宣言 OnFwd(OUT_A+OUT_C); while (true) { if(SENSOR_1 < 40) { //左側のライトセンサーが黒線に触れると OnFwd(OUT_C); //右側のタイヤだけを回転 Off(OUT_A); } if(SENSOR_3 < 40) { //右側のライトセンサーが黒線に触れると Off(OUT_C); //右側のタイヤだけを回転 OnFwd(OUT_A); } if(SENSOR_2 == 1) { //タッチセンサーが入ると OnRev(OUT_A+OUT_C); //いったんバックして Wait(50); OnFwd(OUT_A); //右によけて追い越して Wait(83); OnFwd(OUT_C); Wait(160); OnRev(OUT_A); Wait(83); OnFwd(OUT_A); Wait(160); OnRev(OUT_A); Wait(87); OnFwd(OUT_A); //またラインとレースを開始します } } }
そして、次は180転換するプログラムのほうです。こちらは前のプログラムの引用などはありませんが、衝突した後、その場で回転せずに、少し後退してから回転するようにプログラムを組んであります。
180度反転して逆走し始めるプログラムです。☆製作者☆ クーロン茶&おかじ task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); センサ−1がライトセンサーであると宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); センサ−2がタッチセンサーであると宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); センサ−3がライトセンサーであると宣言 OnFwd(OUT_A+OUT_C); while (true) { if(SENSOR_1 < 40) { //左側のライトセンサーが黒線に触れると OnFwd(OUT_C); //右側のタイヤだけを回転 Off(OUT_A); } if(SENSOR_3 < 40) { //右側のライトセンサーが黒線に触れると Off(OUT_C); //右側のタイヤだけを回転 OnFwd(OUT_A); } if(SENSOR_2 == 1) { //タッチセンサーが入ると OnRev(OUT_A+OUT_C); //180度反転し Wait(50); OnFwd(OUT_A); //逆走し始めます Wait(165); OnFwd(OUT_C); } } }
★ロボットと制作過程☆
1、はじめはマニュアル通りに台車を作っていました。しかし、それだときついカーブを曲がる時にどうしても回転半径が大きくなってしまい、大きくコースアウトするということに気がつきました。そこで、カーブでも小回りがきくように、左右のタイヤ幅をできるだけ狭くしました。これにより、少々のきついカーブでもラインから脱線しにくくなりました。
2、ぶつかったら180度方向転換するプロゴラムについて。ロボットがぶつかったその場で回転すると他方のロボットと再度衝突してしまう可能性があります。それを防ぐため、ぶつかったら少し後ろに下がり、その後で方向転換を行うようにしました。
3、ぶつかったら右によけるプログラムについて。このプログラムはかなり手こずりましたが、以前製作した四角形のプログラムを応用した点がこのプログラムにおける最も工夫した点です。なぜそうしたかというと、右によけていく時、左には他方のロボットがいるわけですから、左側に他方のロボットが通るスペースを確保しなければなりません。そのため、四角形のプログラムを適用したのです。
1、180度反転して逆走し始めるプログラムは、反転にかかる時間さえ測れば後はわりとすぐできましたが、右によけて追い越す方は追い越した後にコースに戻るようにプログラムを考えるのに手こずりました。
2、ぶつかった後右によけるプログラムについて。1つのロボットだけで実験したときには、うまく走り、ちゃんとコースに戻ってくるのですが、いざロボット2台で走らせてみると、相方のロボットと動きがなかなか合わず、何度も衝突しました。相方との協力が要るプログラムでした。
1、定義を使わなかったこと。difineの定義をもっとうまく使ってプログラミングすれば、もう少しすっきりしたプログラムになったと思います。次回から積極的に使っていこうと思います。
2、鼻。
3、課題発表のときにB7右の班のクワガタ?ロボットと対戦させて、先生、TAの方に御迷惑をかけたこと。すいませんでしたm(__)m
おまけ:角(鼻)の動くプログラム、たどるくんの完全体の画像はおかじの個人ページに貼ってあります。