■課題:
黒いラインをセンサーで感知し、そのライン上を進む。
■詳細:
大きな紙に画像のようなコースを描き、その上をロボットが走行する。 モーターによりタイヤを動かすのは課題1と同様で、前面にセンサーのみを取り付けるというシンプルな作りとなっている。
一応、僕が担当になったのは『B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点』であったが、結局最後までこのレベルまで到達出来なかった。
■定義
#define THRESHOLD 42 #define BLACK 25 #define GLAY_B 38 #define GLAY_W 46 #define WHITE 51 #define GO_FWD OnFwd(OUT_AB,50); #define TURN_L OnFwd(OUT_A,50);Off(OUT_B); #define TURN_R OnFwd(OUT_B,50);Off(OUT_A); #define CIRCLE_L OnFwd(OUT_A,50);OnRev(OUT_B,50) #define CIRCLE_R OnFwd(OUT_B,50);OnRev(OUT_A,50)
■ライントレース
以下後半部分はサブルーチン未挿入。今回はこのサブルーチンをどう作って組み込むのかが最後まで分からなかった。
task main() { SetSensorLight(S4); int nOnline=0; while(nOnline < 200) { // 続けて黒が200未満 if (SENSOR_4 < BLACK) { // 線上なら TURN_L; // 左へ nOnline++; // カウンタ増加 } else { // 上の条件に合わない場合 if (SENSOR_4 > WHITE) { // 線上でないなら TURN_R; // 右へ } else if (SENSOR_4 > GLAY_W) { // グレー白なら CIRCLE_R; // 右旋回 } else if (SENSOR_4 < GLAY_B) { // グレー黒なら CIRCLE_L; // 左旋回 } nOnline=0; // カウンタリセット } Wait(1); } }
上の状態では交差点に来た時点で止まってしまう…。
上の段階には最終日の2週間前の時点で出来ていたものの、そこから全く進展させることが出来なかった。正直言って大失敗である。流石に嘘を書くわけにはいかないので、「今回の出来高としては以上の通りである」としか言えない…。
そもそもカウンターの意味や、「{」を用いた複数の条件の設定が理解できなかった。可能であればまだ改良を続けたい。
■次回への反省
授業内で課題に着手する前に一通り予習しておこうと思う。このまま行くと単位もらえない気がするぞ…。
課題3をやったことでライントレースに関する理解を深められた。 ロボットは解体してしまったので確かめる事は出来ないが、プログラムだけはまとめておく。
■定義
#define BLACK 34 #define WHITE 70 #define LEFT OnFwd(OUT_B,60);OnRev(OUT_C,36); #define RIGHT OnFwd(OUT_C,60);OnRev(OUT_B,36); #define RIGHT2 OnFwd(OUT_C,60);OnRev(OUT_B,20);Wait(500); #define GO OnFwd(OUT_B,50);OnFwd(OUT_C,30);Wait(500); #define GO2 OnFwd(OUT_BC,60);Wait(300); #define nMAX 230 #define STEP 1 #define short_break Off(OUT_BC);Wait(1000);
■サブルーチン
sub normal() { SetSensorLight(S2); int nOnline=0; // 「『nOnline』を使います」という宣言 while (nOnline < nMAX){ // 黒が230回未満連続する場合 if (SENSOR_2 < BLACK){ // 真っ黒の時 RIGHT; // 右折 nOnline++; // カウンタ増やす }else // それ以外の場合 if (SENSOR_2 < WHITE){ // 白〜黒に位置してる時 LEFT; // 左折 nOnline=0; // カウンタを0に } Wait(STEP); // 一瞬停止 } short_break; // 一時停止 nOnline=0; // カウンタリセット }
ライン上を見分けて交差点で停止するまでが以上の通りである。 カウンターで230回数えたら交差点と認識するようにした。
■タスクメイン
task main() { normal(); // B→R RIGHT2; normal(); // R→Q GO; GO2; normal(); // Q→Q GO; GO2; normal(); // Q→P RIGHT2; normal(); // P→S RIGHT2; normal(); // S→C }
交差点に達して停止した時には、交差点から若干左へずれている。 なので「GO」で右へ進ませ、「GO2」で交差点を渡りきらせている。
以上である。 もう少し早く理解すべき内容であり、時すでに遅しなところではあるが、NXCに転送が出来る状態にまでは仕上がっているのでその点は評価をしていただきたく思う。