Utsumi ちぃ
第一ぷろぐらむ(失敗 >△<,) ============================== #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言 SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言 SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言 while (true) { if (SENSOR_1 < THRESHOLD) { OnFwd(OUT_A); Off(OUT_C);/Aを動かしてCを止める } else { Off(OUT_A);Cを動かしてAを止める OnFwd(OUT_C); }{ if (SENSOR_2 < THRESHOLD) { OnFwd(OUT_C);/Cを動かしてAを止める Off(OUT_A); } else { Off(OUT_C);/Aを動かしてCを止める OnFwd(OUT_A); } } } }
失敗の理由は、マシンの動きが速すぎるからでした。黒線を認識してモーターが動く前に動いてしまうので認識しないまま直進してしまいました。
第二ぷろぐらむ ============================== #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言 SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言 SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言 OnFwd(OUT_A+OUT_C); while (true) { if (SENSOR_1 < 40) { Off(OUT_A); OnFwd(OUT_C); } if (SENSOR_2 < 40) { OnFwd(OUT_A); Off(OUT_C); } } }
上のプログラムからelseを消しより簡単にすることでラインからはみ出る問題を解決しました。
プログラム
============================== #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言 SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言 SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言 OnFwd(OUT_A+OUT_C); while (true) { if (SENSOR_3 == 1) { OnRev(OUT_A+OUT_C) ; Wait(50);/タッチセンサーが押されたら0.5秒後退する OnFwd(OUT_A) ; Wait(221);/その後2.21秒右回転 OnFwd(OUT_C); } else { if (SENSOR_1 < 40) { Off(OUT_A); OnFwd(OUT_C);/センサー1に黒線が入ると左回転 } if (SENSOR_2 < 40) { OnFwd(OUT_A); Off(OUT_C);/センサー2に黒線が入ると右回転 } } } }
プログラム
============================== #define THRESHOLD 40 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT);/センサー1をライトセンサーと宣言 SetSensor(SENSOR_2, SENSOR_LIGHT);/センサー2をライトセンサーと宣言 SetSensor(SENSOR_3, SENSOR_TOUCH);/センサー3をタッチセンサーと宣言 OnFwd(OUT_A+OUT_C); while (true) { if (SENSOR_3 == 1) { OnRev(OUT_A+OUT_C) ; Wait(50);0.5秒後退する Off(OUT_A+OUT_C); OnRev(OUT_C); Wait(150);/モーターCを1.5秒逆回転 OnFwd(OUT_A+OUT_C); Wait(150);/1.5秒進む Off(OUT_A); Wait(150);1.5秒左回転させる OnFwd(OUT_A); Wait(150); Off(OUT_A); Wait(150); OnFwd(OUT_A);/モーターAを動かし元のコースに戻る } else { if (SENSOR_1 < 40) { Off(OUT_A); OnFwd(OUT_C);センサー1に黒線が入ると左回転 } if (SENSOR_2 < 40) { OnFwd(OUT_A); Off(OUT_C);センサー2に黒線が入ると右回転 } } } }
パーツはなるべく少なくしてシンプルにしました。ライトセンサーは一つだと黒線を認識しないことがあったのでを二つ付けました。タッチセンサーとライトセンサーは共にタイヤより前に付けすぐに反応できるようにしました。
右に避ける際、いきなり避けてしまうとセンサー同士で衝突してしまう恐れがあったので、数秒後退するようプログラムしました。
どのようにタッチセンサーとライトセンサーを前に持ってくるかでまずつまずきました。試行錯誤の末どうにか持っては来れましたがいくつか問題も残りました。 小回りを利きやすくするため、タイヤは小さいサイズのものを使ってみましたが、スピードが速くなってしまいセンサーが反応しきれず失敗してしまいました。
ライトセンサーがどうしてもうまく反応してくれなかったのですが、上でも書いたようにelseを消し、センサーを二つにすることでうまくいきうました。反転の時間がなかなかあわず何度も時間調整を繰り返しました。が、うまくいきませんでした。
タッチセンサーの位置が高くなってしまい低いロボットと当たりずらくなってしまいまいした。まだ改良の余地があります。ロボットの横幅が広いので、動きが大きくなってしまいあまりスムーズに動きません。
右に避けたあとコースによっては戻らずそのまま直進してしまいます。
とても単純なプログラムになってしまったのが反省点です。また、ライトセンサーが一つでもうまくライントレースをしてくれるようなプログラムが作れればよかったです。