各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
1. 空き缶をコース上に戻して再びコースに戻って進む
2. 空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む
ただし、
•速さと正確さを追求すること
•コースを1周したら自動的に止まること
•交差点では一時停止すること
スズキ
Ta2(写真配置の都合上、ウインドウを横に広げて見ていただきたい)
simple is the best!
ただ、他の形が思いつかなかっただけですが…
しかし思っていた以上にカーブは急になっていて、ちょっと光センサの取り付け位置を変える必要がありました。
#define THRESHOLD 40 // 閾値 #define turn_time 170 // 180°回転する時間 #define go_time 90 //交差点から出る時間 #define away_time 90 //缶から遠ざかる時間 #define play_time 6000 //ロボットの動く時間 int n=0; //n=1:空き缶持っている task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); ClearTimer(0); //空き缶を次の交差点まで運ぶプログラム while(FastTimer(0)<play_time){ start follow_line; //ライントレースの開始 until(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD); //交差点まで(センサー1と3が黒になる場合まで) stop follow_line; //ライントレースの終了 Off(OUT_A+OUT_C); //2秒間停止 Wait(200); OnFwd(OUT_A+OUT_C); //交差点から出る Wait(go_time); if(n==1){ //もし空き缶を持っている なら OnFwd(OUT_A);OnRev(OUT_C); //空き缶を交差点に戻す Wait(turn_time); OnRev(OUT_A+OUT_C); //後ろに下がって空き缶に当たらないようにする Wait(away_time); OnFwd(OUT_A);OnRev(OUT_C); //進行方向へ回転 Wait(turn_time); OnRev(OUT_A+OUT_C); //ライン上に戻る Wait(away_time); Off(OUT_A+OUT_C); n=0; //作業が完了したためn=0にする } } } //ライントレースのプログラム task follow_line(){ while (true){ if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){ //センサー1が白、センサー3が黒の時 OnFwd(OUT_A);OnRev(OUT_C); //右に回転し軌道を修正 }else if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){ //センサー3が白、センサー1が黒の時 OnFwd(OUT_C);OnRev(OUT_A); //左に回転し軌道を修正 }else{ //両方白または、両方黒の時 OnFwd(OUT_A+OUT_C); //前進する } if(SENSOR_2==1){ //空き缶に当たったら n=1; //nを1にする } } }
#define light 40 //閾値 #define time 50 //待ち時間 #define RUN_TIME 8700 //走る時間 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(0); while(Timer(0) <= RUN_TIME) { start follow_line; if(SENSOR_2>1) //タッチセンサーが反応 { stop follow_line; //ライントレースのタスクを一旦停止 OnRev(OUT_A+OUT_C); Wait(time); OnFwd(OUT_A); OnRev(OUT_C); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(130); OnFwd(OUT_C); OnRev(OUT_A); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(280); OnFwd(OUT_C); OnRev(OUT_A); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); Wait(100); } //缶を避けてラインに戻る。 } } task follow_line() //ライントレースのプログラム { while(true){ if(SENSOR_1>light){ if(SENSOR_3>light){ OnFwd(OUT_A+OUT_C); } else{ OnFwd(OUT_A); OnRev(OUT_C); } } else{ if(SENSOR_3>light){ OnRev (OUT_A); OnFwd(OUT_C); } else{ Off(OUT_A+OUT_C); Wait(20); OnFwd(OUT_A+OUT_C); Wait(20); } } } }
缶を避けるためのタスクと、ライントレースのタスクを分けて作成した。
elseの使い方を間違っていたかもしれない。
音を鳴らしてみたい。
もっとシンプルに。
elseに嫌われた…。また、空き缶が軽すぎてタッチセンサーが反応しなくて困った。by Ta2
プログラムを考えるのが大変だった。タッチセンサーが反応しなかったためロボットを改造するのに苦労した。byスズキ
コメントをどうぞ