2013b/Member/massa/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[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); // タイマーをリセット
While (FastTimer(1) <= 1000) { // 10秒間は
line_trace(); // ライントレース
if (SENSOR_1 >= 48) { // ただしセンサーが空き缶を感知すれば
go_forward1; // 前進
u-turn1; // 右旋回で空き缶を移動
go_back; // 空き缶を置いて後退
u-turn2; // 左旋回で進行方向に戻る
}
}
ClearTimer(0); // タイマーをリセット
ClearTimer(1); // タイマーをリセット
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]
物体をどけることはできるようになったが、厳密に言うと元の場所まで戻せていない。また、今の段階では、腕はあの程度の構造でも用が足りるが、最終的には閉じたり開いたりする腕が作れなければ、多様な状況に対応できない。
終了行:
[[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); // タイマーをリセット
While (FastTimer(1) <= 1000) { // 10秒間は
line_trace(); // ライントレース
if (SENSOR_1 >= 48) { // ただしセンサーが空き缶を感知すれば
go_forward1; // 前進
u-turn1; // 右旋回で空き缶を移動
go_back; // 空き缶を置いて後退
u-turn2; // 左旋回で進行方向に戻る
}
}
ClearTimer(0); // タイマーをリセット
ClearTimer(1); // タイマーをリセット
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]
物体をどけることはできるようになったが、厳密に言うと元の場所まで戻せていない。また、今の段階では、腕はあの程度の構造でも用が足りるが、最終的には閉じたり開いたりする腕が作れなければ、多様な状況に対応できない。
ページ名: