[[2013b/Member]] * 課題 [#c25c8819] 今回の課題は、図の決められたコースをライントレースしながら、コース中に設置された空き缶をどかして、最終的に入った線から出ていくというものだ。 #ref(./DCIM0213.JPG,640x480,図) * ロボットの説明 [#daa68f1b] 初め、タイヤは4つ付いていたが、2つのほうが格段に交差点を渡りやすいことがわかり、2つにした。腕はそれぞれ大型のビーム2本で構成されたシンプルなものである。しかし、それだけだとロボットが回転して缶を運んでいる間に、缶がロボットの腕をすべって飛び出してしまうことがわかり、それを防止するために先端につめを付けた。 #ref(./1386250023549.jpg,640x480,図1) * プログラム [#z4ba5336] #define THERESHOLD 46 // しきい値 #define HIESTPOWER 7 // 缶を運ぶ力 #define HIPOWER 2 #define LOWPOWER 0 #define set_power_HEST SetPower(OUT_AC,HIESTPOWER); #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); // 左旋回 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); // 左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); // 右折 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 右旋回 #define STEP 1 // 1回の判断で動作させる時間 #define nMAX 35 // 通常のカーブとして許容できる最大時間 #define short_break Off(OUT_AC); Wait(100); // 小休止 #define CROSS_TIME 20 // 交差点通過にかかる時間 /* 交差点を渡る */ #define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; #define go_forward1 OnFwd(OUT_AC); Wait(50); #define u-turn1 set_power_HEST; OnRev(OUT_A); OnFwd(OUT_C); Wait(150); #define u-turn2 set_power_HEST; OnRev(OUT_C); OnFwd(OUT_A); Wait(150); #define go_back OnRev(OUT_AC); Wait(50); sub line_trace() { if (SENSOR_2 < THERESHOLD -3) { turn_right1; } else { if (SENSOR_2 < THERESHOLD -1) { turn_right0; } else if (SENSOR_2 < THERESHOLD +1) { go_forward; } else if (SENSOR_2 < THERESHOLD +3) { turn_left0; } else { turn_left1; } Wait(STEP) } } task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(1); / タイマーをリセット ClearTimer(1); // タイマーをリセット While (FastTimer(1) <= 1000) { / 10秒間は line_trace(); / ライントレース if (SENSOR_1 >= 48) { / ただしセンサーが空き缶を感知すれば go_forward1; / 前進 u-turn1; / 右旋回で空き缶を移動 go_back; / 空き缶を置いて後退 u-turn2; / 左旋回で進行方向に戻る While (FastTimer(1) <= 1000) { // 10秒間は line_trace(); // ライントレース if (SENSOR_1 >= 48) { // ただしセンサーが空き缶を感知すれば go_forward1; // 前進 u-turn1; // 右旋回で空き缶を移動 go_back; // 空き缶を置いて後退 u-turn2; // 左旋回で進行方向に戻る } } ClearTimer(0); / タイマーをリセット ClearTimer(1); / タイマーをリセット ClearTimer(0); // タイマーをリセット ClearTimer(1); // タイマーをリセット While (FastTimer(1) <= 2800) { / 28秒間は While (FastTimer(1) <= 2800) { // 28秒間は /* 黒を続けてnMAX/100秒繰り返さない間、通常のライントレースをする */ WHILE (FastTimer(0) < nMAX) { if (SENSOR_2 < THERESHOLD -3) { turn_right1; } else { if (SENSOR_2 < THERESHOLD -1) { turn_right0; } else if (SENSOR_2 < THERESHOLD +1) { go_forward; } else if (SENSOR_2 < THERESHOLD +3) { turn_left0; } else { turn_left1; } ClearTimer(0); // 黒を続けてnMAX/100秒繰り返さない時間を測るタイマをリセット } Wait(STEP) } /* 黒を続けてnMAX/100秒繰り返した場合 */ short_break; // 小休憩 turn_left1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る ClearTimer(0); // 黒を続けてnMAX/100秒繰り返さない時間を測るタイマをリセット } ClearTimer(0); // タイマをリセット ClearTimer(1); // タイマをリセット While (true) { /* 交差点を感知しないようにして、出口から出ていけるようにライントレース */ line_trace(); } } * 苦労した点 [#tb525a24] ライントレースができるようになるまでも苦労したが、一番苦労したのは缶をどけることである。缶をどけられるようにタッチセンサーを付けたのはいいのだが、缶があまりにも軽くて、タッチセンサーがまったく反応しない!そこで考えたのが光センサーを使うことだ。物体がセンサーに近づけば当然、センサーが感知する光は暗くなる。そこで、ある光センサーが感知するある一定の数値を超えると、ロボットが回転して物体をどけるようにしたのである。 #ref(./1386250018828.jpg,640x480,図2) これなら移動させる物体が重かろうと軽かろうと関係ない。 * 反省 [#h8a8afce] 物体をどけることはできるようになったが、厳密に言うと元の場所まで戻せていない。また、今の段階では、腕はあの程度の構造でも用が足りるが、最終的には閉じたり開いたりする腕が作れなければ、多様な状況に対応できない。