目次
このロボットの雛形は、マインドストームの四輪駆動型ロボットです
・黒線を太くすることで、センサーの感度を実質的に引き上げました。
・また、前輪と後輪を入れ替えることで機動力を得ます。
・両端にある光センサーの幅を狭くすることで、左右にぶれることを少なくしました。
これが我が『ザ宅配』が行く道です。
・光センサーを利用してライントレースのプログラムを書く。
・タッチセンサーを利用した牛乳パックの回避。牛乳パックを運ぶためのプログラムを作る。
・完成。
#define THRESHOLD 40 #define RUN_TIME 1800
まずは基本のライントレースを。
task main() {
SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); ClearTimer(0);
while(Timer(0)<=RUN_TIME){
if(SENSOR_1>THRESHOLD){ if(SENSOR_3>THRESHOLD){ OnFwd(OUT_A+OUT_C); } else{ OnFwd(OUT_A); Off(OUT_C); } } else{ if(SENSOR_3>THRESHOLD){ OnFwd(OUT_C); Off(OUT_A); } }
センサーが反応すると・・ if (SENSOR_2 == 1)
{ OnRev(OUT_A+OUT_C); いったん後退。 Wait(50); Off(OUT_A+OUT_C);
OnRev(OUT_B); アームを下します。 Wait(50); Off(OUT_B);
OnFwd(OUT_A+OUT_C); 定位置まで進んだら・・ Wait(220); Off(OUT_A+OUT_C); OnFwd(OUT_A); 180度旋回し、 OnRev(OUT_C); Wait(150); Off(OUT_A+OUT_C); OnFwd(OUT_B); アームを揚げ、牛乳パックをパージ。 Wait(50); Off(OUT_B); OnRev(OUT_A); OnFwd(OUT_C); Wait(100); Off(OUT_A+OUT_C); 180度のある位置まで旋回したら、 OnRev(OUT_A); ラインをサーチするためにその場で旋回。 OnFwd(OUT_C); until ((SENSOR_1 <= THRESHOLD) || (SENSOR_3 <= THRESHOLD)); Off(OUT_A+OUT_C);
} } }
牛乳パックを避けて線に沿って走るプログラム #define THRESHOLD 40 void turn_left() 左に曲がることを定義する {
OnRev(OUT_A); OnFwd(OUT_C); Wait(100);
} void turn_right() 右に曲がることを定義する {
OnRev(OUT_C); OnFwd(OUT_A); Wait(90);
} int tomaru; タッチセンサーに当たったら止まるこ とを定義する task main() {
SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); tomaru=0; while(tomaru<3){ 3回タッチセンサーが反応したら止まるよ
うに定義します
if(SENSOR_1>THRESHOLD){ 左の光センサーが白紙上 if(SENSOR_3>THRESHOLD){ 右の光センサーが白紙上の時 OnFwd(OUT_A+OUT_C); 直進 } else{ 右の光センサーが黒線上の時 OnFwd(OUT_A); 右に曲がる Off(OUT_C); } } else{ 左の光センサーが黒線上 if(SENSOR_3>THRESHOLD){ 右の光センサーが白線上の時 OnFwd(OUT_C); 左に曲がる Off(OUT_A); } } if (SENSOR_2 == 1) タッチセンサーが反応する時 { OnRev(OUT_A+OUT_C); バックする Wait(50); turn_left(); 牛乳パックを避けるため左に曲がる OnFwd(OUT_A); 直進する Wait(130); turn_right(); 牛乳パックを避けるため右に曲がる OnFwd(OUT_C); 直進する Wait(320); turn_right(); 牛乳パックを避けるため右に曲がる OnFwd(OUT_C); 直進する Wait(130); turn_left(); 牛乳パックを避けるため左に曲がる OnRev(OUT_A+OUT_C); 線に戻るようにするためバックする Wait(80); tomaru=tomaru+1; } } Off(OUT_A+OUT_C);
}
家に持って帰ったのは今回が初めてでした。牛乳パックをホールドするアームの設計は、かなり考えた末に現在のような形になりました。 また、周回を記録するプログラミングは、変数を記録するプログラムがまだわからなかったので断念し、タイマーを利用することになりました。
今回、NQCを自分のパソコンでも使えるようになったので、今後の課題はもっと楽になると思います。
発表中の電源落ちにより、大変不本意な結果になってしまいました。電池を交換することによる挙動の変化を防ぐためにあえて電池を交換しなかったのですが、よりによってテスト中に落ちてしまいました。
次回からは、常に電圧を一定に保てるように努力しようと思います。
また、高電圧タイプのプログラムに更新してありますのでよろしくお願いします。
今回は本当に苦労しました。工夫したところは上記にもありますが、光センサーの幅を狭くしてどの角度から牛乳パックに当たっても正面で当たるようにしたところです。プログラミングに関しては牛乳パックを避けるにあたって、移動距離を最小限に収めたところです。プログラミングの最後のバックする動作は交差後の黒線がすぐに曲がっているため、バックして黒線上に光センサーがくるようにしたところです。 はじめは、1周が60秒だったので、タイマーをセットして、60秒後に止まるようにしたのですが、多少の誤差が進むと同時に生じてきてしまうのでタッチセンサーのふれた回数を使ってロボットを止まるように工夫しました。