下のコースを実際に紙にペンで書き作成した。
黒の線に沿ってライントレースをさせた。
私はB地点からC地点までを担当した。 ◦B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点
説明書通りのシンプルな構造である。
#define THRESHOLD 45
#define SPEED_HIGH 35 //速スピード
#define SPEED_LOW 30 //遅スピード
#define turn_left OnFwd(OUT_C,SPEED_HIGH);Off(OUT_A); //左折
#define turn_left1 OnRev(OUT_A,SPEED_LOW);OnFwd(OUT_C,SPEED_LOW); //左旋回
#define turn_right Off(OUT_C);OnFwd(OUT_A,SPEED_HIGH); //右折
#define turn_right1 OnRev(OUT_C,SPEED_LOW);OnFwd(OUT_A,SPEED_LOW); //右旋回
#define STEP 1 //一回の判断で動く時間
#define nMax 140 //交差点判断
#define short_break Off(OUT_AC);Wait(1000); //1秒間停止
#define go_forward OnFwd(OUT_AC,SPEED_HIGH); //前進
sub crossing_right1() { SetSensorLight(S1); //センサー int nOnline=0; //続けて黒になった回数(カウンタ) long t0 = CurrenTick(); while (CurrenTick()-t0 <= 1000) { //1個目の交差点まで while (nOnline < nMax) { if (SENSOR_1 < THRESHOLD-10) { //左旋回、カウンターを増やす turn_left1; nOnline++; } else if (SENSOR_1 < THRESHOLD-7) { //左折 turn_left; nOnline=0; //カウンタをリセット } else if (SENSOR_1 < THRESHOLD+7) { //前進 go_forward; nOnline=0; } else if (SENSOR_1 < THRESHOLD+15) { //右旋回 turn_right1; nOnline=0; } else { //その他の場合は右折 turn_right; nOnline=0; } Wait(STEP); } } short_break; //1秒間の停止 PlaySound(SOUND_CLICK); //音が出る turn_right1; //右へ旋回する nOnline=0; //カウンタをリセット } sub crossing_go() { while(true) { //2個目の交差点まで while(nOnline < nMax) if (SENSOR_1 < THRESHOLD-10) { //左旋回、カウンターを増やす turn_left1; nOnline++; } else if (SENSOR_1 < THRESHOLD-7) { //左折 turn_left; nOnline=0; } else if (SENSOR_1 < THRESHOLD+7) { //前進 go_forward; nOnline=0; } else if (SENSOR_1 < THRESHOLD+15) { //右旋回 turn_right1; nOnline=0; } else { //その他の場合は右折 turn_right; nOnline=0; } nOnline=0; //カウンタをリセット } Wait(STEP); } short_break; //1秒間の停止 PlaySound(SOUND_CLICK); //音がなる go_forward; //前進 } sub_crossing2() { repeat(3){ //三回繰り返す while (true) { //3〜5個目の交差点 while (nOnline < nMax) { if (SENSOR_1 < THRESHOLD-10) { //左旋回、カウンターを増やす turn_left1; nOnline++; } else if (SENSOR_1 < THRESHOLD-7) { //左折 turn_left; nOnline=0; } else if (SENSOR_1 < THRESHOLD+7) { //前進 go_forward; nOnline=0; } else if (SENSOR_1 < THRESHOLD+15) { //右旋回 turn_right1; nOnline=0; } else { //その他の場合は右折 turn_right; nOnline=0; } Wait(STEP); } } short_break; //1秒間の停止 PlaySound(SOUND_CLICK); //音が出る turn_right1; //右へ旋回する nOnline=0; //カウンタをリセット } sub crossing_stop(){ turn_left; //Cの中に止まる Wait(400); //0.4秒 go_forward; //前進 Wait(1400); //1.4秒 Off(OUT_AC); //モーターを停止 } task main() { crossing_right1//第一交差点まで crossing_go(); //第二、三交差点まで crossing_right2(); //第四、五、六交差点まで crossing_stop(); //B地点の中 }
サブルーチンを使うとなぜかエラーがおきてしまい、何度か改善を試みたができなかった。次回は使えるようにしていきたい。交差点をカウンタで数えることによって判断させたが、nMaxの数をいろいろ変えながら試行錯誤して止まることできた。またスピードを使い分け、うまくカーブが曲がれた。
while(true)の{}の中に書かれた命令は永遠に繰り返す。そのためループを抜け出すためにbreak文を利用しなければならなかった。また今回の場合はwhile (nOnline < nMax)があるため、ある条件を超えなければ命令が続けられているし、repeatによって繰り返すことができていたため必要でなかったことに気づいた。勘違いして覚えて、うまくいかないところがあったため、反省して次の課題に取り組みたい!