もぇくぇ
ゼンチン
各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1. 空き缶をコース上に戻して再びコースに戻って進む 2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む 3. 奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む
ただし、
比較的シンプルな構造の中に、
光センサーが二つ
タッチセンサーが一つ
アームが一つ
という今回の課題をクリアするのに十分な装備を備えた機体。
おそらく使った部品の数、という点では最も少ない部類に分類されるかと思います。
それでも普通にライントレースをする分には十分。
光センサーを二つ用いることにより、
1。両方の光センサーが「白」を感知しているとき
→直進を続ける
2。片方の光センサーが「黒」(コースのライン)を感知しているとき
→黒を感知したセンサーの方に方向転換
3.両方の光センサーが「黒」を感知しているとき
3.両方の光センサーが「黒」を感知しているとき
→交差点に達したことを意味するので、一時停止したのち、直進
以上3つの動作パターンをスムーズに行えるようになりました。
普段はアームは上げられており、タッチセンサーに反応があるとアームが降りて
このように缶をホールドします。
すこしアームの範囲が狭く、缶を入れるために
多少位置の微調整が必要だったところは反省点でした。
また、写真を見ていただければ分かると思いますが、タッチセンサーに反応があった後に
すぐにアームを下ろすと、アームの長さの関係でうまく缶をホールドできません。
これは、缶を挟む前にマシンを少しバックさせることで対処しました。
写真の青い丸が光センサー、赤い丸がタッチセンサーです。
光センサーはマシン全面、さらにお互いの距離を近めに配置し、進行時のズレをなるべく回避するようにしました。
タッチセンサーにはバンパーを装着し、缶に当たったときに安定して作動するよう配慮。
最初はどのようにマシンを組んだものかと悩みましたが、
去年の人たちのページやマシンの説明書を参考にしつつ、課題をクリアするのには何が必要なのかを考えていきました。
最終的にはかなりコンパクトにまとまったので満足です。
図の通り、交差点付近が綺麗な直線になっていないため
うっかりすると光センサーの誤作動を招く、諸刃の剣。
素人にはお薦め出来ない。
いや、本当に苦労したんです…
普通の交差点だったらいらぬ苦労はしなくてすんだのに…
こんなコースにしたのは誰だ!?
…あ、俺たちでした…
#define H 40 //左光センサーの閾値 #define F 50 //右光センサーの閾値 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT);//端子1に光センサーを接続 SetSensor(SENSOR_3, SENSOR_LIGHT);//端子3に光センサーを接続 SetSensor(SENSOR_2, SENSOR_TOUCH);//端子2にタッチセンサーを接続 int cross=0; //交差点を通過した回数 while(cross<6)//コースの巡回プログラム {if ((SENSOR_1 > H)&&(SENSOR_3 > F))//両方の光センサーが白を感知しているとき {OnFwd(OUT_A+OUT_C);Wait(5);}// if ((SENSOR_1 > H)&&(SENSOR_3 < F))//端子3の光センサーが黒を感知しているとき {OnFwd(OUT_A);OnRev(OUT_C);Wait(3); } if ((SENSOR_1 < H)&&(SENSOR_3 > F))//端子1の光センサーが黒を感知しているとき {OnRev(OUT_A);OnFwd(OUT_C);Wait(3);} if ((SENSOR_1 < H)&&(SENSOR_3 < F))//交差点を感知したとき {Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C);Wait(20); cross++;}//交差点を横断した回数を増加 if (SENSOR_2==1)//タッチセンサーに空き缶がぶつかったとき {OnRev(OUT_A+OUT_C);Wait(40);//一度後退します OnFwd(OUT_A);OnRev(OUT_C);Wait(10);//位置の微調整 Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B);Wait(10);//アームを下ろします Off(OUT_B); Wait(100); OnRev(OUT_A);OnFwd(OUT_C);Wait(270);//回れ右 Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_B);Wait(17);//アームを上げます Wait(100); OnFwd(OUT_A);OnRev(OUT_C);Wait(330);}}//回れ左 Off(OUT_A+OUT_C); }
光センサーの感度が異なるため、閾値を右と左でそれぞれ変えました。
最初は両方40で統一していたのですが、うまく反応しないので初めは
「この光センサー壊れてるんじゃ?」
と思ったりもしましたが、何とか原因が発見できてよかったです。
いまいちコース上での動作が安定しないので、もう少しコース巡回のプログラムを
改善していきたいと思います。
#define L 40 #define R 50 #define go OnFwd(OUT_A+OUT_C); //進む #define back OnRev(OUT_A+OUT_C); //戻る #define turn_r OnFwd(OUT_C);OnRev(OUT_A); //右に回る #define turn_l OnFwd(OUT_A);OnRev(OUT_C); //左に回る #define teisi Off(OUT_A+OUT_C); //止まる #define turn OnFwd(OUT_A);OnRev(OUT_C);wait(300) //右に回るtime free #define arm_down OnFwd(OUT_B);Wait(8);Off(OUT_B); //アームを下ろす #define arm_up OnRev(OUT_B);Wait(8);Off(OUT_B); //アームを上げる task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); int flag=0; //交差点を通った数 while(flag<6) //6回通るまで if(SENSOR_1>L) {if(SENSOR_3>R){go;}//センサーが両方白なら直進 else {turn_r;}//右が黒なら右折 } else{ if (SENSOR_3>R){turn_l;} //左が黒なら左折 else{teisi;wait(50);flag++;go;} //両方黒ならflagを1足して直進。 } if(SENSOR_2==1) //空き缶にぶつかったら運搬プログラム開始 {teisi;Wait(10);arm_down;turn;arm_up;turn; //空き缶を後ろに置く } } } } teisi; //6回交差点を通ったら、元の位置まで進んで終了!!
if文を多く使うことで光センサについてのプログラムをまとめることができました。
センサの反応度が左右によって違うので、それに対応させてプログラムを作りました。
サブルーチンを使ったことで逆にプラグラムが長くなってしまったので、次回以降はプログラムの全体を考えてから作るべきだと思いました。
if文を使いすぎて{}が増えてしまい分かりずらくなってしまいました。
かなりプログラミングが複雑になり、難易度が急上昇しました。
また、コースがアレであったので交差点を横断する際には
コースを無視してあさっての方向に走ってしまったり
ふてぶてしくもショートカットをしようとしたり
一切の弁明の効かぬループ地獄へ突入したりしたので苦労しました。
しかし、とりあえずもできて何よりです。
今回の課題では、光センサとタッチセンサの二種類のセンサを同時に使わなければいけなかったので大変でした。
交差点を無視したり、空き缶にぶつかっても反応しなかったりと、
なかなかうまくいきませんでしたが、どうにか完成できたのでよかったです。
コメントをお願いします。