僕の担当したルートは右折するルートであった。 全体として道が枝分かれしているところを認識して音を鳴らしたり一時停止したりしなければならないので、右側に枝分かれがあると右側、左側にあると左側を通らなければならなかった。
ルートTの円を回れるようにするために車体の横幅(タイヤとタイヤの距離)を短くした。動きをスムーズにそして急カーブを曲がれるようにするため、後ろにはタイヤを付けず、摩擦の少ないパーツを付けた。
色について定義する。
#define white 50 //白色
#define white_gray 48 //白灰色
#define gray 40 //灰色
#define black_gray 37 //黒灰色
#define black 35 //黒色
簡単な動きについて定義する。
#define go_forward OnFwd(OUT_AC); //直進する
#define turn_left0 Off(OUT_A);OnFwd(OUT_C); //左旋回する
#define turn_left1 OnRev(OUT_A);OnFwd(OUT_C); //左回転する
#define turn_right0 Off(OUT_C);OnFwd(OUT_A); //右旋回する
#define turn_right1 OnRev(OUT_C);OnFwd(OUT_A); //右回転する
これは黒線の右側を辿り、交差点や直角に右に曲がるようなところを認識するプログラムである。
sub walk_right() { ClearTimer(0); while(FastTimer(0)<15) if(SENSOR_2>white_gray){ turn_left1; ClearTimer(0); } else if(SENSOR_2>gray){ turn_left0; ClearTimer(0); } else if(SENSOR_2>black_gray){ go_forward; ClearTimer(0); } else if(SENSOR_2>black){ turn_right0; ClearTimer(0); } else{ turn_right1; } Off(OUT_AC); }
これは黒線の左側を辿り、交差点や直角に左に曲がるようなところを認識するプログラムである。
sub walk_left() { ClearTimer(0); while(FastTimer(0)<15) if(SENSOR_2>white_gray){ turn_right1; ClearTimer(0); } else if(SENSOR_2>gray){ turn_right0; ClearTimer(0); } else if(SENSOR_2>black_gray){ go_forward; ClearTimer(0); } else if(SENSOR_2>black){ turn_left0; ClearTimer(0); } else{ turn_left1; } Off(OUT_AC); }
task main() { SetSensor(SENSOR_2,SENSOR_LIGHT);
地点A
walk_right(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(30); Off(OUT_AC);
地点E
walk_left(); PlaySound(SOUND_DOWN); Wait(100); OnFwd(OUT_C); Wait(150); Off(OUT_AC);
地点P
walk_left(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点Q
walk_left(); Off(OUT_AC); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点R
walk_right(); PlaySound(SOUND_DOWN); Wait(100); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点T
walk_right(); PlaySound(SOUND_DOWN); Wait(100); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点T
walk_right(); PlaySound(SOUND_UP); OnFwd(OUT_A); Wait(280); Off(OUT_AC);
地点H 二個目の内側の半円周が曲がりきれないので一度認識させてから2.7秒右旋回させるようにした。
ClearTimer(0); while(FastTimer(0)<30) if(SENSOR_2>white_gray){ turn_left1; ClearTimer(0); } else if(SENSOR_2>gray){ turn_left0; ClearTimer(0); } else if(SENSOR_2>black_gray){ go_forward; ClearTimer(0); } else if(SENSOR_2>black){ turn_right0; ClearTimer(0); } else{ turn_right1; } Off(OUT_AC); OnFwd(OUT_A); Wait(270); walk_right(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(30); Off(OUT_AC);
地点G
walk_left(); PlaySound(SOUND_DOWN); Wait(100); OnFwd(OUT_C); Wait(150); Off(OUT_AC);
地点S
walk_left(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点P
walk_left(); PlaySound(SOUND_UP); OnFwd(OUT_AC); Wait(50); Off(OUT_AC);
地点Q
walk_right(); PlaySound(SOUND_UP); OnFwd(OUT_A); Wait(280); Off(OUT_AC);
地点F
walk_right(); PlaySound(SOUND_DOWN); }
地点A
前回の課題と同様、電池の残量によって走る距離などが変わってしまうので、一括してプログラム内の時間tを変更できようなプログラムを組みたいと思った。一個ずつ数値を調整するのはなにか違うような気がした。