目次
1転がす(ライントレース)
2最短距離で運ぶ(自由走行)
ロボットを作成せよ。ただし、1の場合はテニスボールの置いてある場所から直接転がし、 2の場合はその場所から最短距離で運ぶこと。ボールを探す際にはラインに沿っても沿わなくてもよい。
今回の課題のライントレースはセンサー1個で行うため、ライン上の時はライン外の白の部分を探させ、ラインから外れたらラインを探させた。そのためマシンはジグザグに進んでライントレースするようになった。
#define THRETHOLD 40 //ライントレースの閾値 40 #define SPIN 500 //一回転する時間 task main() { repeat(3){ //3回繰り返す SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサーに SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーに(ランタンを探す) SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサーに(ライントレース) int l_max=0; //l_maxを定義(初期値0) int t_max=0; //t_maxを定義(初期値0) while(true){ start follow_line; //follow_lineのタスク(ライントレース)を開始 until (SENSOR_1==1); //ボールがセンサーに当たったら stop follow_line; //follow_lineのタスクを一旦停止 OnFwd(OUT_B); //アームを閉じてボールを固定 Wait(10); ClearTimer(0); while(FastTimer(0)<=SPIN) { OnFwd(OUT_A); OnRev(OUT_C); //回転開始 if(SENSOR_2>l_max) //ランタンの位置(光の最大値)を探す {l_max=SENSOR_2; //最大値をl_maxと定義 t_max=FastTimer(0);} //ランタンを見つけた時間(FastTimer(0)<=SPINの経過時間)をt_maxと定義 } OnFwd(OUT_C); OnRev(OUT_A); Wait(SPIN-t_max); //ランタンの向きへ方向転換 Off(OUT_A+OUT_C); Wait(50); OnRev(OUT_B); Wait(20); //アームを開き、ボールを蹴り出す準備 Off(OUT_B); Wait(50); OnFwd(OUT_A+OUT_C); Wait(50); //キック!! Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C); Wait(50); //元の位置に戻る OnFwd(OUT_A); OnRev(OUT_C); Wait(SPIN-t_max); //元の向きに戻る } //while文の先頭に戻って再びライントレースを開始 } //repeat範囲 Off(OUT_A+OUT_C); //三回繰り返したら終了 } task follow_line() //follow_lineのタスク(ライントレース) { while(true){ if(SENSOR_3<THRETHOLD) //センサーがライン上(黒)のとき {OnFwd(OUT_A); Off(OUT_C);} //右に曲がる if(SENSOR_3>THRETHOLD) //センサーがライン外(白)のとき {OnFwd(OUT_C); Off(OUT_A);} //左に曲がる } }
#define arm_down OnFwd(OUT_B);Wait(20);Off(OUT_B); //アームを下ろす #define arm_up OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを上げる #define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(110);Off(OUT_A+OUT_C); //右曲り #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(110);Off(OUT_A+OUT_C); //左曲がり task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1はタッチセンサー SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2はタッチセンサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3はタッチセンサー int l_max=0; //光の最大値を記憶させる変数を定義 int t_max=0; //ランタンを認識した時間を定義 repeat(4) //4回繰り返す { start ziguzagu; //ジグザグにすすむ until(SENSOR_1 == 1); //タッチセンサーが押されるまで実行する stop ziguzagu; //進むのをやめる start carry_boll; //ランタンを探し、ボールを運び、最初にもどる until(SENSOR_2 < 40); //光センサーが認識するまで実行 stop carry_boll; //運ぶのをやめる } } task ziguzagu() //ジグザグにすすむプログラム { while(true) { go_straight(350); turn_right; go_straight(80); turn_right; go_straight(350); turn_left; go_straight(80); turn_left;; } } task carry_boll() //ボールを運ぶプログラム { int l_max=0; //光の最大値を記憶させる変数を定義 int t_max=0; //ランタンを認識した時間を定義 arm_down; ClearTimer(0); //タイマー0をリセット while(FastTimer(0)<=450) //4.5秒間繰り返し { OnFwd(OUT_A); OnRev(OUT_C); if(SENSOR_2>l_max) //センサー2が最大値を感知したとき l_max=SENSOR_2; //l_maxを最大値とする t_max=FastTimer(0); //t_maxを記憶 } OnFwd(OUT_C); OnRev(OUT_A); Wait(450-t_max); //t_maxの時間回転 } OnFwd(OUT_A+OUT_C); until(SENSOR_3 < 40); arm_up; OnRev(OUT_A+OUT_C); until(SENSOR_3 < 40); OnFwd(OUT_A); OnRev(OUT_C); Wait(450-t_max); }