[[2016a/Member]] 目次 #contents *はじめに [#u3a169c9] 課題は光センサを利用して黒い線にそって動くロボットを作成する。経路はA地点 → P直進 → Q直進 → Q直進 → R左折 → B地点ことである。 http://s019.radikal.ru/i644/1608/d3/a982daba6d01.png *ロボット [#fb0ade47] 前回の人の顔を描くロボットをベースにし、ライントレースロボットを作る。 前回のロボット http://s008.radikal.ru/i304/1606/ac/d01def6c9bf9.jpg 今回のロボットの図 http://s019.radikal.ru/i620/1608/bb/34c093f2ad29.jpg http://s018.radikal.ru/i520/1608/2d/41a9e1efc0d0.jpg *ロボットの動作・プログラミングの説明 [#b353d003] **定義やサブルーチン等 [#i9551285] #define BLACK 37 #define WHITE 42 #define GREY 39 #define turn_right Off(OUT_A); OnFwd(OUT_C); #define turn_left Off(OUT_C); OnFwd(OUT_A); #define nMAX 215 #define pMAX 670 #define qMAX 150 #define STEP 1 #define shortbreak Off(OUT_AC); Wait(100); OnFwd(OUT_AC); int S=0; //交差点 int nOnline=0; //0、1、3番の交差点に使う int q=0; //4番目の交差点に使う ***サブルーチン [#o48d9efa] ClearTimeを最初から使ってみたが、途中にプログラムが分からなくなり、交差点を認識するために、真っ黒になったら左に曲がり、カウンターを+1回ことにした。ボールねじを基にするモーターのおかげで細かい動きができ、いつも左・右ではなく、なるべく真っ直ぐに動くことができた。nOnlineがMAX (215)になったらストップし、音を鳴らし、交差点の数を覚える。Sは交差点の数えである。 sub line_follow() { SetSensor(SENSOR_3, SENSOR_LIGHT); while (S<=1) { while (nOnline < nMAX) { if (SENSOR_3 < BLACK) { turn_left; nOnline++; } else if (SENSOR_3 < GREY) { OnFwd(OUT_AC); } else if (SENSOR_3 > GREY) { turn_right; nOnline=0; } Wait(STEP); } nOnline=0; shortbreak; PlaySound(SOUND_DOUBLE_BEEP); S++; } } Q直進のところにずっと左に曲がるのでnMAX(215)が足りなくなり、2番目の交差点から新しいカウンターを付けることにした。pMAXを670にし、ぴったり3番目の交差点まで動くことができた。 sub crossing_left1() { int p=0; SetSensor(SENSOR_3, SENSOR_LIGHT); while (S==2) { while (p < pMAX) { if (SENSOR_3 < BLACK) { turn_left; p++; } else if (SENSOR_3 < GREY) { OnFwd(OUT_AC); } else if (SENSOR_3 > GREY) { turn_right; } Wait(STEP); } p=0; shortbreak; PlaySound(SOUND_DOUBLE_BEEP); S++; } } 3番目の交差点からプログラムは0と1番目の交差点と同じである。 sub line_follow1() { SetSensor(SENSOR_3, SENSOR_LIGHT); while (S==3) { while (nOnline < nMAX) { if (SENSOR_3 < BLACK) { turn_left; nOnline++; } else if (SENSOR_3 < GREY) { OnFwd(OUT_AC); } else if (SENSOR_3 > GREY) { turn_right; nOnline=0; } Wait(STEP); } nOnline=0; shortbreak; PlaySound(SOUND_DOUBLE_BEEP); S++; } } 交差点は4番目になると普通に左に曲がり、交差点はこれから必要がないのでリセットする。 sub crossing_left() { while (S==4){ OnRev(OUT_C); OnFwd(OUT_A); Wait(150); S=0; } } 左に曲がったら少しだけライントレースに戻り、B地点まで真っ直ぐ行き、音を鳴らす。 sub saigo() { SetSensor(SENSOR_3, SENSOR_LIGHT); while (q < qMAX) { if (SENSOR_3 < BLACK) { turn_left; q++; } else if (SENSOR_3 < GREY) { OnFwd(OUT_AC); q++; } else if (SENSOR_3 > GREY) { turn_right; } Wait(STEP); } if (q>=qMAX) { OnFwd(OUT_AC); Wait(500); Off(OUT_AC); PlaySound(SOUND_DOUBLE_BEEP); } } ***メイン [#s17ee29e] 結果的に2分22秒で完走した。 task main() { line_follow(); // A地点 → P直進 → Q crossing_left1(); // Q → Q line_follow1(); // Q直進 → R crossing_left(); // R左折 saigo(); // R → B地点 } *反省・感想 [#oe0269cb] 前回の課題よりもとても難しく苦労したが、最後までできた時、ほっとした。交差点を認識するプログラムが分かりにくく、最初に直感でプログラムを書いたが、書けば書くほど分かるようになった。しかし、分からない点がまだ残っている。