課題については2019a/Mission2を参照。
私はAを出発しMでシュートをする方のプログラミングを試みた。
アームでボールを包み込むように運び、最後はアームを開くようにモーターを動かすことで蹴り出すようにした。
コースが狭いのでなるべく小型になるようにした。センサーの近くにアームをつけると影になってしまい、光の当たり方でロボットの動きが大きく変わってしまうので前方にセンサー、後方にアームと前後に分けて付けることにした。
AからDまでは線の左側をトレース
光センサーを使って線の境界をトレースするために、光センサーで値の検出を行った。下の画像は左の境界を表している。
センサーが示す値が、
〜33の時 左回転 → 左モーター後退 右モーター前進
34、35の時 → 左モーター停止 右モーター前進
36〜39の時 前進 → 左モーター前進 右モーター前進
40、41の時 → 左モーター前進 右モーター停止
42〜の時 右回転 → 左モーター前進 右モーター後退
右側の境界をトレースする場合は、モーターの動きを反転させる。
交差点の判断はファストタイマーを使い、黒の線上にいる時間で判断することにした。
黒の上にセンサーが来たときのセンサーの動きである。絵のように交差の場合、黒の上にセンサーがある時間が長い。この時間で交差点を判断する。
Gのような丸い交差点では通常の交差点より黒の上にセンサーがある時間が短い。しかし、丸い交差点に時間を合わせてしまうと、通常のトレースに影響が出てしまうことがあるので、グローバル変数を用いて時間を変えられるようにした。直角の交差点では0.22から0.24秒、丸い交差点では0.18秒で今回は設定した。
はじめに、defineを用い、右折を定義した。
#define t_r OnFwd(OUT_A);OnRev(OUT_C);Wait(60);Off(OUT_AC);ClearTimer(0);//90度 右折
直角の交差点と丸みのある交差点でのファストタイマーの時間を変えるためのグローバル変数を定義する。
int s; //グローバル変数
線の左右の境界をトレースする2種類のサブルーチンと停止後の直進のサブルーチンを定義する。
sub follow_line_left() //線の左側のトレース { while(FastTimer(0)<s) { if(SENSOR_2>42){OnFwd(OUT_A);OnRev(OUT_C);ClearTimer(0);} else if(SENSOR_2>40){OnFwd(OUT_A);ClearTimer(0);} else if(SENSOR_2>36){OnFwd(OUT_AC);ClearTimer(0);} else if(SENSOR_2>34){OnFwd(OUT_C);ClearTimer(0);} else{OnFwd(OUT_C);OnRev(OUT_A);} } } sub follow_line_right() //線の右側のトレース { while(FastTimer(0)<s) { if(SENSOR_2>42){OnFwd(OUT_C);OnRev(OUT_A);ClearTimer(0);} else if(SENSOR_2>40){OnFwd(OUT_C);ClearTimer(0);} else if(SENSOR_2>36){OnFwd(OUT_AC);ClearTimer(0);} else if(SENSOR_2>34){OnFwd(OUT_A);ClearTimer(0);} else{OnFwd(OUT_A);OnRev(OUT_C);} } } sub cross_line() //交差点での停止後の直進 { Off(OUT_AC);Wait(100); OnFwd(OUT_AC);Wait(20); ClearTimer(0); }
A~D
task main() { s=22; SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); follow_line_left(); Off(OUT_AC);Wait(100); OnFwd(OUT_A);OnRev(OUT_C);Wait(40); OnFwd(OUT_AC);Wait(20); ClearTimer(0);
D~G
s=24; follow_line_right(); Off(OUT_AC);Wait(50); OnFwd(OUT_AC);Wait(30); t_r follow_line_right(); Off(OUT_AC);Wait(50); OnFwd(OUT_AC);Wait(30); t_r OnRev(OUT_AC);Wait(30);Off(OUT_AC); s=20; follow_line_right(); Off(OUT_AC); Wait(100);
G~K
t_r s=18; //丸みのある交差点のため他より短めに設定している follow_line_right(); cross_line(); follow_line_right(); cross_line(); follow_line_right(); Off(OUT_AC); OnFwd(OUT_A);OnRev(OUT_C);Wait(50); OnRev(OUT_AC);Wait(20); follow_line_right(); Off(OUT_AC);
K~L
OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_AC); OnRev(OUT_AC);Wait(100);Off(OUT_AC); OnRev(OUT_B);Wait(10);Off(OUT_B);
L~M
s=23; ClearTimer(0); follow_line_right(); cross_line(); follow_line_right(); cross_line(); follow_line_left(); Off(OUT_AC);
M(シューーーーーーーーーーーーーーーーーーーーーーート!!!!!!!!)
OnFwd(OUT_C);OnRev(OUT_A);Wait(50); Off(OUT_AC);Wait(80); OnFwd(OUT_B);Wait(10); Off(OUT_ABC); }
フィールドが狭いこともあり機体を回転させるとセンサーが次の交差に乗ってしまったりして、その調整が大変だった。動きの悪さが目立つプログラムであり、課題が多く残る結果となった。