・川澄
主にHP・プログラム担当
・ru-(広瀬)
ロボット制作担当。プログラムもちょっと
・滝沢クリステル
ロボット制作担当
プロトタイプ、光センサーは中央に二つ、タッチセンサーは両側に一つずつ、本体に配線できるのは三つ、タッチセンサーは左右どちらにぶつかっても同じ命令しか加えないので同じ場所に配線することにした。
横からの衝撃に反応が疎く、カーブでぶつかっても相手のロボット押しのけるまで突き進み続けた。
進化形(クワガタ型)、先端の角(?)を加えることによって横からの衝撃にも反応するようになった。これでカーブで衝突してもよけられるようになった。
今回は意味のあるオプションです。(笑)
これが裏側から見た図。この光センサーの幅が命
この幅が狭すぎると誤作動を起こしてしまい、広すぎるとコースを回るスピードがかなり落ちてしまう。
これがコース、修正液のあとがあるのはコースがすごく簡単すぎて修正したため。ロボットを作りコースを走らせてみたら、左上のS字カーブに手こずった。
まずはライントレースだけをするプログラムを作ってみた。
task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサ−1がライトセンサーであると宣言 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサ−3がライトセンサーであると宣言 while(true) { OnFwd(OUT_A+OUT_C); //何もセンサーに反応がないときは直進 if(SENSOR_1<40) //左の光センサーが黒い線を踏んだら { OnFwd(OUT_C); //黒い線から外れるまで左に曲がり続ける OnRev(OUT_A); until(SENSOR_1>40); } if(SENSOR_3<40) //右の光センサーが黒い線を踏んだら { OnFwd(OUT_A); //黒い線から外れるまで右に曲がり続ける OnRev(OUT_C); until(SENSOR_3>40); } } }
#define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_A+OUT_C); #define TURN_LEFT OnRev(OUT_A);OnFwd(OUT_C);Wait(70);Off(OUT_A+OUT_C); SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2がタッチセンサーであると宣言 if(SENSOR_2==1) //タッチセンサーが反応したとき { OnRev(OUT_A+OUT_C); //0.5秒後退 Wait(50); TURN_RIGHT; //0.5秒左に旋回 OnFwd(OUT_A+OUT_C); //1秒直進 Wait(100); TURN_LEFT; //0.7秒右に旋回
このプログラムで成功したように見えた。しかし、画用紙の外にはみ出したときにロボットが不可解な動きになってしまって立ち止まってしまった。そこで、画用紙の外に出たら復帰するプログラムを追加
if((SENSOR_1<40)&&(SENSOR_3<40)) //二つの光センサーが両方とも黒に反応した場合 { OnRev(OUT_A+OUT_C); //5秒後退 Wait(500);
このプログラムで、もし画用紙の外に行っても後退してコースに戻ることに成功。
ただし、このプログラムは画用紙の外が黒またはそれに近い色だった場合にのみ有効。
それでこれにライントレースのプログラムを書き加えた完成形のプログラムがこれ↓
#define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_A+OUT_C); #define TURN_LEFT OnRev(OUT_A);OnFwd(OUT_C);Wait(70);Off(OUT_A+OUT_C); task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); while(true) { OnFwd(OUT_A+OUT_C); if((SENSOR_1<40)&&(SENSOR_3>40)) { OnFwd(OUT_C); OnRev(OUT_A); until(SENSOR_1>40); } if((SENSOR_3<40)&&(SENSOR_1>40)) { OnFwd(OUT_A); OnRev(OUT_C); until(SENSOR_3>40); } if(SENSOR_2==1) { OnRev(OUT_A+OUT_C); Wait(50); TURN_RIGHT; OnFwd(OUT_A+OUT_C); Wait(70); TURN_LEFT; OnFwd(OUT_A+OUT_C); Wait(70); } if((SENSOR_1<40)&&(SENSOR_3<40)) { OnRev(OUT_A+OUT_C); Wait(300); } } }
#define turn_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(185); SetSensor(SENSOR_2,SENSOR_TOUCH); if(SENSOR_2==1) { //タッチセンサーが反応した場合 OnRev(OUT_A+OUT_C); //0.8秒後退 Wait(80); turn_RIGHT //逆向きになるまで回転
しかしこれだけだとコースアウトしてしまう可能性が高い。
そこで元のコースに戻るようにプログラムを追加
OnRev(OUT_A+OUT_C); //1秒後退 Wait(100); } } }
これにライントレースするプログラムを加え完成!
で、完成形がこれ↓
#define turn_RIGHT OnFwd(OUT_A);OnRev(OUT_C);Wait(185); task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); while (true) { OnFwd(OUT_A+OUT_C); if (SENSOR_1 < 40) { OnFwd(OUT_C); OnRev(OUT_A); until (SENSOR_1>40);} if(SENSOR_3<40) { OnFwd(OUT_A); OnRev(OUT_C); until(SENSOR_3>40); } if(SENSOR_2==1) { OnRev(OUT_A+OUT_C); Wait(80); turn_RIGHT OnRev(OUT_A+OUT_C); Wait(100); } } }
・なかなか横からの衝撃に反応してくれなかった点。
・クワガタ型にしたときに、重心が前に行き過ぎて、その調整に手こずった。
・スピードを速くすることがなかなかできなかった。
・if文で条件が重複して動かなくなってしまい、それを修正することに苦労した。
・右によけるプログラムがなかなか相手のロボットをよけてくれなかった点。
・センサーの幅をできるだけ狭くすることでコースを回るスピードをできるだけ速くした点
・タッチセンサーの死角を無くすためにクワガタ型に改造した。サイドバンパーで横の物を、牙バンパーで前の物を、そして下バンパーで小さい物を感知し、行動する。
・右走するプログラムで画用紙からはみ出ても復帰するようにした点
・逆走するプログラムでコースアウトを防ぐためにコースに戻るプログラムを追加した点
・プログラム作りに没頭しすぎてロボット作りがおろそかになってしまった点
・画用紙はつなぎ合わせたときの出っ張りが生じるので模造紙にしとけばよかった
•プログラムが複雑になって、班員に手取り足取り教えてもらった。自分でできるようにならないと....。足手まといになってしまう。以上今回の愚痴です。
•ロボット自体はとてもいいものが完成しました。しかしプログラムに関して、反転した時、稀にですが線のないところまで走ってしまい、暴走することがあるので反転した時に頭を振って線を探すプログラムを追加しとけばよっかたです。反省してます。