黒く塗られたラインをトレースし、交差点では指定されたコースを辿ってまたスタート地点まで戻るというもの。自分は一人目の「直進→左折→直進→右折→右折」のコースを担当した。
今回のロボットはマインドストームの説明書に載っていたものをそのまま使用した。
配布された資料に掲載されていたものを基本として、微調整や交差点での行動判断を追加した。
#define TH 50 #define SP_H 50 #define SP_L 25 #define OnRL(spR,spL) OnFwd(OUT_B,spR);OnFwd(OUT_C,spL); #define go_forward OnRL(SP_H,SP_H); #define turn_L1 OnRL(SP_L,-SP_L); //左旋回 #define turn_L0 OnRL(SP_L,0); //左折 #define turn_R0 OnRL(0,SP_L); //右折 #define turn_R1 OnRL(-SP_L,SP_L); //右旋回 #define STEP 1 //一回の判断で動作させる時間 #define nMAX 250 //通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC);Wait(1000) //小休止 #define CROSS_TIME 200 //交差点通過にかかる時間 #define cross_line OnRL(SP_L,SP_L);Wait(CROSS_TIME);short_break;
nMAXは250に調整した。
task main() { SetSensorLight(S1); //光センサーの設定 int nOnline=0; //連続で黒になった回数のカウンタ int cross=1; //交差点の回数のカウンタ
最初に光センサーの設定と、カーブと交差点を識別するためのカウンタ、何回目の交差点か数えるためのカウンタを設定した。
while(true){ while(nOnline<nMAX){ if(SENSOR_1<TH-15){ turn_L1; nOnline++; //カウンタを増やす }else{ if(SENSOR_1<TH-7){ turn_L0; }else if(SENSOR_1<TH+7){ go_forward; }else if(SENSOR_1<TH+15){ turn_R0; }else{ turn_R1; } nOnline=0; } Wait(STEP); }
if(cross==1){ //直進 short_break; //小休止 turn_R1;Wait(nMAX*STEP); //進行方向修正 cross_line; //交差点を渡る nOnline=0; //カウンタをリセット cross++; else if(cross==2){ //左折 short_break; turn_R1;Wait(nMAX*STEP); turn_L0;Wait(400); nOnline=0; cross++; else if(cross==3){ //直進 short_break; turn_R1;Wait(nMAX*STEP); cross_line; nOnline=0; cross++; else if(cross==4){ //右折 short_break; turn_R1;Wait(nMAX*STEP); turn_R0;Wait(300); nOnline=0; cross++; else if(cross==5){ //右折 short_break; turn_R1;Wait(nMAX*STEP); turn_R0;Wait(300); nOnline=0; } }
何回目の交差点かで条件分けし、各回に対応した命令を出している。交差点を渡った段階で交差点カウンタに1を足し、次の交差点では次の命令に進むようにした。
前回の課題が不本意な結果に終わっていただけに、課題が成功しただけでも達成感があった。ただカーブや交差点で脱線するなど成功率は100%ではなかった。
今回はロボットは説明書通りの基本形を使用し、プログラムも資料通りのものに少し手を加えただけでもある程度出来上がったので、正直妥協してしまったかと思う。ロボット・プログラムともにもう少し工夫・改良を加えればもっと成功率が上がったかもしれない。
例えば他の受講生のページを見てみると、光センサーをより床に近づくように設置したり、部屋の明暗の影響を受けないようにしたり等、様々なものがあった。そのような小さな工夫で精度は違ってくると思うので、今後は参考にしていきたい。