2005/C5/課題3右
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*センサ−1個モータ−1個で動くプログラム [#ibaefd3e]
int o=35; //光センサー境界値
task main ()
{
SetSensor (SENSOR_2, SENSOR_LIGHT);
ClearTimer (0);
while (Timer (0) < 1200) //時間制限
{
while (SENSOR_2>o) //白
{
OnRev (OUT_B); //右へ
}
while (SENSOR_2<=o) //黒
{
OnFwd (OUT_B); //左へ
}
}
Off (OUT_B);
}
#ref(20051213190151.jpg)
感想 モーター1つで右にも左にも動かすのを作るのは大変だった。初め作ったときギア比低すぎて動かず、ギア比を上げなんとか動くようになった。ギア比はとても重要なことが分かった。
このプログラムは白と黒の境界線上を走るようになっている。
&br;
*センサ−2個モータ−2個で動くプログラム (縦2個タイプ) [#ibaefd3e]
int c=45; //センサー感度
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT);
SetSensor (SENSOR_2, SENSOR_LIGHT);
ClearTimer (0);
while (Timer (0) < 600) //駆動時間
{
while (SENSOR_1<=c && SENSOR_2<=c) //線上
{
OnFwd (OUT_A+OUT_C);
}
if (SENSOR_1>c && SENSOR_2<c) //はみ出し
{
OnFwd (OUT_C); //左へ
OnRev (OUT_A);
until (SENSOR_2 >= c); //右へ
OnFwd (OUT_A);
OnRev (OUT_C);
until (SENSOR_1 <= c && SENSOR_2 <= c); //線上に戻った
OnFwd (OUT_A);
OnRev (OUT_C);
Wait(5);
OnRev (OUT_A+OUT_C);
Wait(5);
Off (OUT_A+OUT_C);
if (SENSOR_1 > c && SENSOR_2 > c)
{
OnFwd (OUT_A+OUT_C);
until (SENSOR_1 <= c && SENSOR_2 <= c);
}
}
while (SENSOR_1<=c && SENSOR_2>c)
{
OnFwd (OUT_A+OUT_C);
}
}
Off (OUT_A+OUT_C);
}
解説
ロボット前方に二個のセンサーを搭載した。
先生も紹介した普通のやり方だが、うちの班のラインは細めのため横に二個搭載しても意味をなさない。(線を太くすればそれでよいのだが。)&br;
そこで、私はロボット前方に“縦に”二個搭載してみた。&br;
前のセンサーのみまたは両方のセンサーが線上にあるときは直進し、前のセンサーのみ線からはみ出したら左に曲がる。&br;
後ろのセンサーも線からはみ出した場合、曲がる方向が間違っているか、線を通り越しているので両方のセンサーが線上に戻るまで右に曲がる。&br;
これだけだと線の端に居るのでまたすぐはみ出してしまう。それを防ぐため、さらに少しだけ右に進み、後退するようにした。&br;
後は制限時間まで同じ動作を繰り返す。
&br;&br;
現在の問題点は、線が細い急カーブでは進路変更の部分が無限ループして動けなくなってしまうことが分かっている。時間制限を設けてループに入ってしまったら別の回避行動をとるようにすればいいだろう。
*センサ−2個モータ−2個で動くプログラム (挟み込みタイプ) [#ibaefd3e]
int c=40; //光センサー境界値
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT);
SetSensor (SENSOR_3, SENSOR_LIGHT);
while (true)
{
while (SENSOR_1<c && SENSOR_3<c) //両方のセンサーが黒
{
OnFwd (OUT_AC); //直進
}
while (SENSOR_1<c && SENSOR_3>=c) //左側のセンサーが黒、右側が白
{
OnFwd (OUT_C); //左折
OnRev (OUT_A);
}
while (SENSOR_1>=c && SENSOR_3<c) //左側のセンサーが白、右側が黒
{
OnFwd (OUT_A); //右折
OnRev (OUT_C);
}
OnFwd (OUT_AC); //両方のセンサーが白、直進
}
}
上記のプログラム同様2個のセンサーを搭載したタイプだが、こちらは黒い線の両側を挟み込み、両方のセンサーが白ならば直進するようになっている。&br;
while (SENSOR_1<c && SENSOR_3<c) //両方のセンサーが黒
{
OnFwd (OUT_AC); //直進
}
この部分は一本道では記述しておく必要はないが、黒い線が交差している場所でも直進するようにしてある。
ここの記述をかえることにより交差点での右左折が可能になる。&br;
センサーの幅をラインの幅ギリギリにしておけばほぼ間違えなくトレースできる。
*センサ−1個モータ−2個で動くプログラム (ジグザグタイプ) [#ibaefd3e]
int c=40; //光センサー境界値
task main ()
{
while (true)
{
while (SENSOR_2>=c) //センサーが白のとき
{
OnFwd (OUT_A); //右折
Off(OUT_C);
}
OnFwd (OUT_C); //センサーが黒のとき・左へ曲がる
Off (OUT_A);
}
}
これはセンサ−1個でラインの左側の白と黒との境界線を走るプログラムです。センサーを1つしか使えず、それほどスピードが必要でないときはこのプログラムがいいでしょう。
*コメント [#w38d9f1c]
#comment
終了行:
*センサ−1個モータ−1個で動くプログラム [#ibaefd3e]
int o=35; //光センサー境界値
task main ()
{
SetSensor (SENSOR_2, SENSOR_LIGHT);
ClearTimer (0);
while (Timer (0) < 1200) //時間制限
{
while (SENSOR_2>o) //白
{
OnRev (OUT_B); //右へ
}
while (SENSOR_2<=o) //黒
{
OnFwd (OUT_B); //左へ
}
}
Off (OUT_B);
}
#ref(20051213190151.jpg)
感想 モーター1つで右にも左にも動かすのを作るのは大変だった。初め作ったときギア比低すぎて動かず、ギア比を上げなんとか動くようになった。ギア比はとても重要なことが分かった。
このプログラムは白と黒の境界線上を走るようになっている。
&br;
*センサ−2個モータ−2個で動くプログラム (縦2個タイプ) [#ibaefd3e]
int c=45; //センサー感度
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT);
SetSensor (SENSOR_2, SENSOR_LIGHT);
ClearTimer (0);
while (Timer (0) < 600) //駆動時間
{
while (SENSOR_1<=c && SENSOR_2<=c) //線上
{
OnFwd (OUT_A+OUT_C);
}
if (SENSOR_1>c && SENSOR_2<c) //はみ出し
{
OnFwd (OUT_C); //左へ
OnRev (OUT_A);
until (SENSOR_2 >= c); //右へ
OnFwd (OUT_A);
OnRev (OUT_C);
until (SENSOR_1 <= c && SENSOR_2 <= c); //線上に戻った
OnFwd (OUT_A);
OnRev (OUT_C);
Wait(5);
OnRev (OUT_A+OUT_C);
Wait(5);
Off (OUT_A+OUT_C);
if (SENSOR_1 > c && SENSOR_2 > c)
{
OnFwd (OUT_A+OUT_C);
until (SENSOR_1 <= c && SENSOR_2 <= c);
}
}
while (SENSOR_1<=c && SENSOR_2>c)
{
OnFwd (OUT_A+OUT_C);
}
}
Off (OUT_A+OUT_C);
}
解説
ロボット前方に二個のセンサーを搭載した。
先生も紹介した普通のやり方だが、うちの班のラインは細めのため横に二個搭載しても意味をなさない。(線を太くすればそれでよいのだが。)&br;
そこで、私はロボット前方に“縦に”二個搭載してみた。&br;
前のセンサーのみまたは両方のセンサーが線上にあるときは直進し、前のセンサーのみ線からはみ出したら左に曲がる。&br;
後ろのセンサーも線からはみ出した場合、曲がる方向が間違っているか、線を通り越しているので両方のセンサーが線上に戻るまで右に曲がる。&br;
これだけだと線の端に居るのでまたすぐはみ出してしまう。それを防ぐため、さらに少しだけ右に進み、後退するようにした。&br;
後は制限時間まで同じ動作を繰り返す。
&br;&br;
現在の問題点は、線が細い急カーブでは進路変更の部分が無限ループして動けなくなってしまうことが分かっている。時間制限を設けてループに入ってしまったら別の回避行動をとるようにすればいいだろう。
*センサ−2個モータ−2個で動くプログラム (挟み込みタイプ) [#ibaefd3e]
int c=40; //光センサー境界値
task main ()
{
SetSensor (SENSOR_1, SENSOR_LIGHT);
SetSensor (SENSOR_3, SENSOR_LIGHT);
while (true)
{
while (SENSOR_1<c && SENSOR_3<c) //両方のセンサーが黒
{
OnFwd (OUT_AC); //直進
}
while (SENSOR_1<c && SENSOR_3>=c) //左側のセンサーが黒、右側が白
{
OnFwd (OUT_C); //左折
OnRev (OUT_A);
}
while (SENSOR_1>=c && SENSOR_3<c) //左側のセンサーが白、右側が黒
{
OnFwd (OUT_A); //右折
OnRev (OUT_C);
}
OnFwd (OUT_AC); //両方のセンサーが白、直進
}
}
上記のプログラム同様2個のセンサーを搭載したタイプだが、こちらは黒い線の両側を挟み込み、両方のセンサーが白ならば直進するようになっている。&br;
while (SENSOR_1<c && SENSOR_3<c) //両方のセンサーが黒
{
OnFwd (OUT_AC); //直進
}
この部分は一本道では記述しておく必要はないが、黒い線が交差している場所でも直進するようにしてある。
ここの記述をかえることにより交差点での右左折が可能になる。&br;
センサーの幅をラインの幅ギリギリにしておけばほぼ間違えなくトレースできる。
*センサ−1個モータ−2個で動くプログラム (ジグザグタイプ) [#ibaefd3e]
int c=40; //光センサー境界値
task main ()
{
while (true)
{
while (SENSOR_2>=c) //センサーが白のとき
{
OnFwd (OUT_A); //右折
Off(OUT_C);
}
OnFwd (OUT_C); //センサーが黒のとき・左へ曲がる
Off (OUT_A);
}
}
これはセンサ−1個でラインの左側の白と黒との境界線を走るプログラムです。センサーを1つしか使えず、それほどスピードが必要でないときはこのプログラムがいいでしょう。
*コメント [#w38d9f1c]
#comment
ページ名: