各チームで作成したコースを1周するロボットを製作せよ。
交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する)
ただし、
NQC本体を取り外した写真
ほとんど本に載っていた基本ベースを元に作ってある。
光センサを外した写真
交差部分3つのシンプルなコース
ロボットが感知しやすいように、交差する部分を直角になるようにした。
#define THRESHOLD 47 // 閾値 #define TURN_TIME 222 // 半回転する時間 #define GO_TIME 100 #define BACK_TIME 100 #define LIMIT 5000 task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); ClearTimer(0); while(FastTimer(0)<LIMIT){ //タイマーのセット start follow_line; //ライントレースの開始 until(SENSOR_2==1); //タッチセンサが1になるまで stop follow_line; //ライントレース終了 OnFwd(OUT_A+OUT_C); //缶を移動したときに場所がずれないように前進 Wait(160); OnFwd(OUT_A); //缶の移動 OnRev(OUT_C); Wait(TURN_TIME); OnRev(OUT_A+OUT_C); //缶をアームからはずす Wait(BACK_TIME); OnFwd(OUT_A);OnRev(OUT_C); //進行方向に戻る Wait(TURN_TIME); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); //ラインの上に戻る Wait(100);} } task follow_line(){ while (true){ if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD)){ //センサー1だけ黒 OnFwd(OUT_C);OnRev(OUT_A); //左回転 }else if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //センサー3だけ黒 OnFwd(OUT_A);OnRev(OUT_C); //右回転 }else if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)){ //両方黒なら1秒止まって、0.5秒間前進して渡り切きる Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); Wait(50); }else{ OnFwd(OUT_A+OUT_C); //両方白なら前進 } } }
最初、交差する部分を渡り切るまでに何度も止まってしまったので、交差点に行ったら前進するようにした。
閾値を黒い線を半分だけまたいだ時の値にして、無駄な動きを減らした。
#define THRESHOLD 47 //閾値(ラインから少しずれてる時) #define THRESHOLD_B 40 //閾値2(ラインから大きくずれてる時) #define TURN_TIME 222 //半回転する時間 #define GO_TIME 100 //交差点から抜け出す時間 #define BACK_TIME 100 //缶から遠ざかる時間 #define LIMIT 6000 //プログラムの稼働時間 int x=0; //x=1→空き缶持ってる,x=0持っていない task main(){ SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); ClearTimer(0); while(FastTimer(0)<LIMIT){ start follow_line; //ライントレースの開始 until(SENSOR_1<THRESHOLD&&SENSOR_3<THRESHOLD); //交差点まで stop follow_line; //ライントレース終了 Off(OUT_A+OUT_C); //交差点で1秒停止 Wait(100); OnFwd(OUT_A+OUT_C); //交差点から出る Wait(GO_TIME); if(x==1){ //もし缶を持っているなら move(); //缶を移動 } } music(); //終わったら音楽を鳴らす } task follow_line(){ //ライントレースタスク while (true){ if(SENSOR_1<THRESHOLD&&SENSOR_3>THRESHOLD){ //センサ1だけ黒 if(SENSOR_1<THRESHOLD_B){ //ラインから大きくずれてる時 OnFwd(OUT_C);OnRev(OUT_A); //左回転 }else{ //ラインから少しずれてる時 OnFwd(OUT_C);Float(OUT_A); //左に曲がる } Wait(3); }else if(SENSOR_1>THRESHOLD&&SENSOR_3<THRESHOLD){ //センサ3だけ黒 if(SENSOR_3<THRESHOLD_B){ //ラインから OnFwd(OUT_A);OnRev(OUT_C); //右回転 }else{ //ラインから少しずれてる時 OnFwd(OUT_A);Float(OUT_C); //右に曲がる } Wait(3); }else{ //両方白もしくは両方黒 OnFwd(OUT_A+OUT_C); Wait(3); //前進 } if(SENSOR_2==1){ //空き缶に当たったらxを1にする x=1; } } } sub move(){ OnFwd(OUT_A);OnRev(OUT_C); //缶を交差点に戻す Wait(TURN_TIME); OnRev(OUT_A+OUT_C); //後退して缶を巻き込まないようにする Wait(BACK_TIME); OnFwd(OUT_A);OnRev(OUT_C); //進行方向へ回転 Wait(TURN_TIME); OnRev(OUT_A+OUT_C); //ラインの上に移動 Wait(BACK_TIME); Off(OUT_A+OUT_C); x=0; //作業を終了したのでxを0にする } sub music(){ //某RPGのレベルアップ音 PlayTone(1175,10); Wait(15); PlayTone(1175,10); Wait(15); PlayTone(1175,10); Wait(15); PlayTone(1175,10); Wait(30); PlayTone(1047,10); Wait(30); PlayTone(1319,20); Wait(30); PlayTone(1175,44); }
タスクを2つとサブルーチンを使い、メインタスクを1番前に持ってきたことで見やすくすっきりとしたプログラムになったと思う。
音楽を鳴らせるようにした
閾値を2段階に設定して、少し曲がっただけならFwdとFloat、かなり曲がるときはFwdとRevの組み合わせにし、その後にWait(3)を入れて効率よく進めるようにした。
タッチセンサがうまく押せなくて、パーツをつけて調整したら逆に常に押してしまうようになったり調整が難しかった。今回のは考えるのが大変でした。
音楽が意外とうまくいった。前回よりもロボット本体の製作が難しくて最初は思った通りに行かず、授業外に集まるなど大変だった。
コメントやアドバイスをお願いします