2016a/Member 目次
今回の課題は、下図を制作し、経路を黒い線にそって動くロボットを制作することだ。
私は、A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点、を経路とするものを作った。
(2016年前期/課題2より)
これが、機体の全体像。
前回のものより、小回りがききやすいよう機体を小さくした。
光センサーをタイヤと近くすることで、センサーの左右のふれを小さくした。
前輪を取り、代わりに球面を帯びたパーツをつけ、滑らかに動くようにした。
以下がサブルーチンを作る上での基本的な定義である。
#define BLACK 42 //これ以下は黒 #define WHITE 50 //これ以上は白 #define RIGHT_S OnFwd(OUT_A);OnRev(OUT_C); //右旋回 #define RIGHT_K OnFwd(OUT_A);Off(OUT_C); //右回転 #define LEFT_S OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define LEFT_K OnFwd(OUT_C);Off(OUT_A); //左回転 #define go_fwd(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); //t秒間前進 #define STEP 1
黒の線上をたどっていくプログラム。交差点で一時停止し、音が鳴るようになっている。
交差点を判断するためにはタイマーを使い、黒が0.5秒以上続いた時、交差点と判断するようにした。
また、線の左側をたどるようになっており、黒では右に、白では左に回転するようになっている。
その他では直進する。
sub line_trace() { ClearTimer(0); while(FastTimer(0) < 50) { if (SENSOR_2 < BLACK) { RIGHT_S; } else if (SENSOR_2 < BLACK ) { RIGHT_K; } else if (SENSOR_2 > WHITE ) { LEFT_S; ClearTimer(0); } else if (SENSOR_2 >= WHITE ) { LEFT_K; ClearTimer(0); } else { OnFwd(OUT_AC); ClearTimer(0); } Wait(STEP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); }
上のプログラムで黒の時、右回転するため、交差点で右に傾いた状態で止まる。
機体を正常な傾きに戻すことと、交差点を通過することを目的としている。
sub turn_left_i() { while (FastTimer(0) < 142) { LEFT_K; } ClearTimer(0); }
上のプログラムと使用用途は一緒だが、最後の直角を左回転するため判断の時間を長くしている。
sub turn_left_ii() { while (FastTimer(0) < 252) { LEFT_S; } ClearTimer(0); }
task main() { SetSensor (SENSOR_2, SENSOR_LIGHT); go_fwd(110); line_trace(); // AからPへ turn_left_i(); // Pを通過 line_trace(); // PからQへ turn_left_i(); // Qを通過 line_trace(); // 一周回ってQへ turn_left_i(); // Qを通過 line_trace(); // QからRへ turn_left_ii(); // Rを左折 go_fwd(110); line_trace(); }
ゴールにたどりつくこともあったが、たどりつかないことも多かった。
交差点で止まった後の、通過するところでうまくいかないことが多かった。
もっと時間調節を慎重にやらなければいけなかったと思う。
また、サブルーチンやタイマーに対する理解が遅かったために、作業が遅れてしまったことも
達成しきれなかった要因だったと思う。サブルーチンを使うことですっきりとしたプログラムを
書くことができることがわかった。次回の課題では、今回のことを生かして、
課題を達成できるよう頑張りたい。