2018a/Member
目次
今回の課題は上図の矢印をトレースするロボットを作ることである。
ロボットを製作する段階でいくつかの工夫を施した。
ライントレースを行う際に必要なプログラムを以下のように定義した。
#define kuro 36//線上 #define haiiro 42//境界 #define siro 48//白の部分 #define spd 2 #define turn_l OnFwd(OUT_B,spd);OnRev(OUT_C,spd);//その場左回転 #define turn_r OnFwd(OUT_C,spd);OnRev(OUT_B,spd);//その場右回転 #define sasetu OnFwd(OUT_B,spd);OnRev(OUT_C,10);//左折 #define usetu OnRev(OUT_B,10);OnFwd(OUT_C,spd);//右折 #define tyoku OnFwd(OUT_BC,spd);//直進 #define STEP 1//一回の判定で進む時間
ラインの左側をトレースするプログラムを以下のように組んだ
task main () { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); }
ラインの右側をトレースするプログラムを以下のように組んだ。
task main() { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); }
A〜Cのルートではラインの左側をトレースするプログラムを採用した。
Cで停止後は軌道の修正を行った。
sub AC() { SetSensorLight(S3); int i=0; while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); Wait(1000);//Cまで終了 turn_r; Wait(150); tyoku; Wait(1000); i=0;//カウンタリセット
このルートも左側をトレースした。
sub CD()
{ while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); Wait(1000); tyoku; Wait(100); turn_l; Wait(1100); i=0;//カウンタリセット Off(OUT_BC); while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } Off(OUT_BC); i=0;//カウンタリセット Wait(1000);//空き缶前 tyoku; Wait(200); OnRev(OUT_A,spd); Wait(500); Off(OUT_A); OnRev(OUT_BC,spd); Wait(500); turn_l; Wait(1300);
ここも左側をトレースした。ただし途中Eの部分で交差点と認識してしまうところがある。そのため交差点と認識したあと起動を修正し、少しの直進を加えることで突破した。
sub DF() while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット tyoku; Wait(300);//E終了 while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//F終了
ここも左側をトレースした。
sub FI() turn_l; Wait(1500); while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//H終了 Wait(1000); turn_r; Wait(1500); while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Off(OUT_BC);//I終了 Wait(1000);
左側トレースではJに到達したか認識することができない。そのためここではラインの右側をトレースした。LとKの突破は先のEと同じ方式をとった。
sub IJ() while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//L終了 i=0;//カウンタリセット tyoku; Wait(300); while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//K終了 i=0;//カウンタリセット tyoku; Wait(300); while(i<500){ if(SENSOR_3<kuro) { usetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { sasetu; i=0; } Wait(STEP); } Off(OUT_BC);//J到達 i=0;//カウンタリセット Wait(1000); tyoku; Wait(200); turn_l; Wait(1300); OnFwd(OUT_A,spd); Wait(500); Off(OUT_A); OnRev(OUT_BC,spd); Wait(800);
空き缶を置いた後はゴールに向かう。ここでは左側のトレースを採用する。
sub JA() turn_r; Wait(2000);//Bに向かう while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } i=0;//カウンタリセット Wait(1000); turn_l; Wait(1100);//Aに向かう while(i<500){ if(SENSOR_3<kuro) { sasetu; i++; } else if(SENSOR_3<haiiro) { tyoku; i=0; } else { usetu; i=0; } Wait(STEP); } tyoku; Wait(500); Off(OUT_BC);//A到達 }
完成したプログラムは以下のようになった。
task main() { AC(); CD(); DF(); FI(); IJ(); JA(); }
今回はトレースするプログラムを作るのに時間がかかった。サブルーチンを用いたり、関数を用いたりと、今回は前回課題に比べ大きく成長することができたと思う。
今回は交差点の認識には黒が続いた回数をカウントする方式をとった。
機会があれば次はタイマーを用いたプログラムを使ってみたい。