2018a/Member/hiro/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
#contents
*課題2 [#id668a63]
ライントレースをして空き缶を移動させるという課題でした。
第1コースと第2コースからコースをペアで別々のコースを選択するというもので、第2コースを走らせました。
&ref(2018a-mission2.png);
**第2コース [#pe78aa3b]
Aをスタート
Bを右折
Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
JからKに向かい、Kを直進
Lを直進
Iを左折
Hで一時停止の後、左折
Gで一時停止の後、右折
Fで一時停止の後、右折
Eを直進
Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
Cで一時停止の後、直進
Bを直進
Aで停止
(一時停止の指定がある場所は、1秒間停止すること)
*ロボットについて [#a1ef14c8]
3輪型のロボットにしました。前2輪がモーターA,Cで回転し、後ろの1輪は、くるくる回転するタイヤの構造にしました。(下図は後輪の画像)
&ref(後輪.jpg);
缶を掴む部分の構造は、アームを下げることによって缶を捕まえ、運んでいくという構造にしました。
(写真参照)
&ref(DSC_0205.JPG);
アームの上げ下げはモーターBが回転することによってゴムが引っ張られ、ゴムの張力よってアームが上げ下げされるという構造にしました。
&ref(アームの説明.jpg);
**苦労したところ [#g8abccdc]
急カーブを曲がったり、直角の角を曲がったりするときに、タイヤがバウンドしてしまってプログラム通りの細かい動きをしてくれなくなったときがあった。
タイヤを大きな細いタイヤから小さな太いタイヤに変えたら、少しはバウンドしてしまったが、プログラム通りに動いてくれるようになったので良かった。
*プログラム [#q3b54d82]
#define RUN_TIME 3 // トレースする時間(単位 1/10 秒)
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); // 右に曲がる
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); // 左に曲がる
#define OTO_1 PlaySound(SOUND_DOUBLE_BEEP);
#define OTO_2 PlaySound(SOUND_UP);
#define SO 784
下のサブルーチンは黒線の右側をライントレースするプログラム.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.
sub follow_line()
{
ClearTimer(0); // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME)
{ // タイマー0がRUN_TIME(0.3秒)以下の時に繰り返す
if (SENSOR_2 < 38)
{ // 黒線上にいるとき
TURN_RIGHT;
}
else if (SENSOR_2 < 43)
{ // 灰色で直進
OnFwd(OUT_A+OUT_C);
ClearTimer(0);
}
else
{ // 黒線から外れたとき
TURN_LEFT;
ClearTimer(0);
}
}
}
下のサブルーチンは黒線の左側をライントレース.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.
sub follow_linetwo()
{
ClearTimer(0); // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME)
{ // タイマー0がRUN_TIME(0.5秒)以下の時に繰り返す
if (SENSOR_2 < 38)
{ // 黒線上にいるとき
TURN_LEFT;
}
else if (SENSOR_2 < 43)
{ // 灰色で直進
OnFwd(OUT_A+OUT_C);
ClearTimer(0);
}
else
{ // 黒線から外れたとき
TURN_RIGHT;
ClearTimer(0);
}
}
}
ライントレースは黒や白ならタイヤを両方回転させて曲がり,黒と白の間ならまっすぐ進むといったプログラムになっている.
task main ()
{
OnFwd(OUT_A+OUT_C); Wait(100); // スタート
SetSensor(SENSOR_2, SENSOR_LIGHT);
最初はまっすぐ進むことでライントレースするところまで行く.
follow_line(); // 黒線右側をライントレース
TURN_RIGHT; Wait(100); // Bで右に曲がる
Off(OUT_A+OUT_C);
follow_line(); // Jまで行く
Off(OUT_AC);
TURN_LEFT;
Wait(20);
Off(OUT_AC); // JでYに真っ直ぐになるように左回転して調整する
OnFwd(OUT_AC);
Wait(100);
Off(OUT_AC); // 空き缶のところまで行く
OnRev(OUT_B);
Wait(300);
Off(OUT_B); // 空き缶掴む
OnRev(OUT_AC);
Wait(100);
Off(OUT_AC); // 軌道に戻る
TURN_LEFT;
Wait(140);
Off(OUT_AC); // Jで左回転
OnFwd(OUT_AC);
Wait(100);
Off(OUT_A+OUT_C); // 少し前に出る
follow_linetwo(); // JからKまで 黒線左側をライントレース
TURN_RIGHT;
Wait(50);
OnFwd(OUT_AC);
Wait(25);
Off(OUT_AC); // Kで左側に行かないように黒線を乗り越える
follow_linetwo(); // KからLまで 黒線左側をライントレース
Off(OUT_AC);
TURN_RIGHT;
Wait(20);
Off(OUT_AC);
OnFwd(OUT_AC);
Wait(50);
Off(OUT_AC); // Lで左側に行かないように黒線を乗り越える
follow_linetwo(); // LからIまで 黒線左側をライントレース
Off(OUT_AC);
TURN_LEFT;
Wait(100);
Off(OUT_AC); // Hの方向に体を向ける
follow_linetwo(); // 黒線左側をライントレース
Off(OUT_AC);
Wait(300); // IからHまで、Hで3秒停止
TURN_LEFT;
Wait(30); // Hで左回転
follow_linetwo(); // 黒線左側をライントレース
Off(OUT_AC);
TURN_LEFT;
Wait(30); // Gの下の直角カーブを左回転して曲がる
follow_linetwo(); // 黒線左側をライントレースしてGまで行く
Off(OUT_AC);
Wait(300); // Gで3秒間一時停止
TURN_RIGHT;
Wait(200); // Gで右回転
OnFwd(OUT_AC);
Wait(20); // 黒線右側をライントレースできるように少し前に進んで調整
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
Wait(300); // GからFまで行き、Fで3秒間停止
TURN_RIGHT;
Wait(30); // Fで右回転
follow_line(); // 黒線右側をライントレース FからEまで行く
Off(OUT_AC);
TURN_LEFT;
Wait(20);
OnFwd(OUT_AC);
Wait(30); // Eで右側に行かないように黒線を乗り越える
follow_line(); // 黒線右側をライントレース EからDまで行く
Off(OUT_AC);
Wait(300); // Dで3秒間停止
TURN_LEFT;
Wait(250);
Off(OUT_AC); // Dで左回転
OnFwd(OUT_AC);
Wait(70);
Off(OUT_AC); // Xまで行く
OnFwd(OUT_B);
Wait(300);
Off(OUT_B); // 持っていた缶をXで放す
OnRev(OUT_AC);
Wait(120);
Off(OUT_AC); // Dに戻る
TURN_RIGHT;
Wait(410);
OnFwd(OUT_AC);
Wait(40);
Off(OUT_AC); // Dで180°回転した後,少し前に進む
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
TURN_RIGHT;
Wait(70); // Dの上の直角カーブを右へ曲がる
follow_line(); // 黒線右側をライントレース DからCへむかう
Off(OUT_AC);
Wait(300); // Cで3秒間停止
TURN_LEFT;
Wait(20);
OnFwd(OUT_AC);
Wait(30); // Cで右側へ行かないように黒線を乗り越える
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
Wait(300); // フィニシュ
}
**工夫したところ [#e7e6e709]
急カーブをうまく曲がれるようにするため、細かい動きでライントレースをしていけるように左右のタイヤ両方を回転させた。
しかし、これだと前に進まないため、白と黒の間をトレースしたときだけまっすぐ進むようにプログラムした。
直角カーブの部分はターンを入れることでうまくトレースできるようにした。
**苦労したところ [#j849005a]
直角カーブを曲がるのがとても苦労した。
ターンとOnFwdを組み合わせてなんとか曲がることができた。
ターンとOnFwdの時間の調整が難しかった。
*感想 [#af5dc064]
課題1に比べてとても難しく大変だったが、その分、完成したときの達成感があった。
途中、音を加えてみた。
音を入れて楽しみながらプログラムしました。
*動画URL [#r76b6dc5]
https://youtu.be/URsMHJ74iT8
終了行:
[[2018a/Member]]
#contents
*課題2 [#id668a63]
ライントレースをして空き缶を移動させるという課題でした。
第1コースと第2コースからコースをペアで別々のコースを選択するというもので、第2コースを走らせました。
&ref(2018a-mission2.png);
**第2コース [#pe78aa3b]
Aをスタート
Bを右折
Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
JからKに向かい、Kを直進
Lを直進
Iを左折
Hで一時停止の後、左折
Gで一時停止の後、右折
Fで一時停止の後、右折
Eを直進
Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
Cで一時停止の後、直進
Bを直進
Aで停止
(一時停止の指定がある場所は、1秒間停止すること)
*ロボットについて [#a1ef14c8]
3輪型のロボットにしました。前2輪がモーターA,Cで回転し、後ろの1輪は、くるくる回転するタイヤの構造にしました。(下図は後輪の画像)
&ref(後輪.jpg);
缶を掴む部分の構造は、アームを下げることによって缶を捕まえ、運んでいくという構造にしました。
(写真参照)
&ref(DSC_0205.JPG);
アームの上げ下げはモーターBが回転することによってゴムが引っ張られ、ゴムの張力よってアームが上げ下げされるという構造にしました。
&ref(アームの説明.jpg);
**苦労したところ [#g8abccdc]
急カーブを曲がったり、直角の角を曲がったりするときに、タイヤがバウンドしてしまってプログラム通りの細かい動きをしてくれなくなったときがあった。
タイヤを大きな細いタイヤから小さな太いタイヤに変えたら、少しはバウンドしてしまったが、プログラム通りに動いてくれるようになったので良かった。
*プログラム [#q3b54d82]
#define RUN_TIME 3 // トレースする時間(単位 1/10 秒)
#define TURN_RIGHT OnFwd(OUT_A); OnRev(OUT_C); // 右に曲がる
#define TURN_LEFT OnFwd(OUT_C); OnRev(OUT_A); // 左に曲がる
#define OTO_1 PlaySound(SOUND_DOUBLE_BEEP);
#define OTO_2 PlaySound(SOUND_UP);
#define SO 784
下のサブルーチンは黒線の右側をライントレースするプログラム.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.
sub follow_line()
{
ClearTimer(0); // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME)
{ // タイマー0がRUN_TIME(0.3秒)以下の時に繰り返す
if (SENSOR_2 < 38)
{ // 黒線上にいるとき
TURN_RIGHT;
}
else if (SENSOR_2 < 43)
{ // 灰色で直進
OnFwd(OUT_A+OUT_C);
ClearTimer(0);
}
else
{ // 黒線から外れたとき
TURN_LEFT;
ClearTimer(0);
}
}
}
下のサブルーチンは黒線の左側をライントレース.センサー2が0.3秒以上黒を認識すると次のプログラムへ行く.センサー2が黒を認識するのが0.3秒以内だとサブルーチンの中のプログラムを繰り返す.
sub follow_linetwo()
{
ClearTimer(0); // Timer(0) をリセット
while ( Timer(0) <= RUN_TIME)
{ // タイマー0がRUN_TIME(0.5秒)以下の時に繰り返す
if (SENSOR_2 < 38)
{ // 黒線上にいるとき
TURN_LEFT;
}
else if (SENSOR_2 < 43)
{ // 灰色で直進
OnFwd(OUT_A+OUT_C);
ClearTimer(0);
}
else
{ // 黒線から外れたとき
TURN_RIGHT;
ClearTimer(0);
}
}
}
ライントレースは黒や白ならタイヤを両方回転させて曲がり,黒と白の間ならまっすぐ進むといったプログラムになっている.
task main ()
{
OnFwd(OUT_A+OUT_C); Wait(100); // スタート
SetSensor(SENSOR_2, SENSOR_LIGHT);
最初はまっすぐ進むことでライントレースするところまで行く.
follow_line(); // 黒線右側をライントレース
TURN_RIGHT; Wait(100); // Bで右に曲がる
Off(OUT_A+OUT_C);
follow_line(); // Jまで行く
Off(OUT_AC);
TURN_LEFT;
Wait(20);
Off(OUT_AC); // JでYに真っ直ぐになるように左回転して調整する
OnFwd(OUT_AC);
Wait(100);
Off(OUT_AC); // 空き缶のところまで行く
OnRev(OUT_B);
Wait(300);
Off(OUT_B); // 空き缶掴む
OnRev(OUT_AC);
Wait(100);
Off(OUT_AC); // 軌道に戻る
TURN_LEFT;
Wait(140);
Off(OUT_AC); // Jで左回転
OnFwd(OUT_AC);
Wait(100);
Off(OUT_A+OUT_C); // 少し前に出る
follow_linetwo(); // JからKまで 黒線左側をライントレース
TURN_RIGHT;
Wait(50);
OnFwd(OUT_AC);
Wait(25);
Off(OUT_AC); // Kで左側に行かないように黒線を乗り越える
follow_linetwo(); // KからLまで 黒線左側をライントレース
Off(OUT_AC);
TURN_RIGHT;
Wait(20);
Off(OUT_AC);
OnFwd(OUT_AC);
Wait(50);
Off(OUT_AC); // Lで左側に行かないように黒線を乗り越える
follow_linetwo(); // LからIまで 黒線左側をライントレース
Off(OUT_AC);
TURN_LEFT;
Wait(100);
Off(OUT_AC); // Hの方向に体を向ける
follow_linetwo(); // 黒線左側をライントレース
Off(OUT_AC);
Wait(300); // IからHまで、Hで3秒停止
TURN_LEFT;
Wait(30); // Hで左回転
follow_linetwo(); // 黒線左側をライントレース
Off(OUT_AC);
TURN_LEFT;
Wait(30); // Gの下の直角カーブを左回転して曲がる
follow_linetwo(); // 黒線左側をライントレースしてGまで行く
Off(OUT_AC);
Wait(300); // Gで3秒間一時停止
TURN_RIGHT;
Wait(200); // Gで右回転
OnFwd(OUT_AC);
Wait(20); // 黒線右側をライントレースできるように少し前に進んで調整
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
Wait(300); // GからFまで行き、Fで3秒間停止
TURN_RIGHT;
Wait(30); // Fで右回転
follow_line(); // 黒線右側をライントレース FからEまで行く
Off(OUT_AC);
TURN_LEFT;
Wait(20);
OnFwd(OUT_AC);
Wait(30); // Eで右側に行かないように黒線を乗り越える
follow_line(); // 黒線右側をライントレース EからDまで行く
Off(OUT_AC);
Wait(300); // Dで3秒間停止
TURN_LEFT;
Wait(250);
Off(OUT_AC); // Dで左回転
OnFwd(OUT_AC);
Wait(70);
Off(OUT_AC); // Xまで行く
OnFwd(OUT_B);
Wait(300);
Off(OUT_B); // 持っていた缶をXで放す
OnRev(OUT_AC);
Wait(120);
Off(OUT_AC); // Dに戻る
TURN_RIGHT;
Wait(410);
OnFwd(OUT_AC);
Wait(40);
Off(OUT_AC); // Dで180°回転した後,少し前に進む
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
TURN_RIGHT;
Wait(70); // Dの上の直角カーブを右へ曲がる
follow_line(); // 黒線右側をライントレース DからCへむかう
Off(OUT_AC);
Wait(300); // Cで3秒間停止
TURN_LEFT;
Wait(20);
OnFwd(OUT_AC);
Wait(30); // Cで右側へ行かないように黒線を乗り越える
follow_line(); // 黒線右側をライントレース
Off(OUT_AC);
Wait(300); // フィニシュ
}
**工夫したところ [#e7e6e709]
急カーブをうまく曲がれるようにするため、細かい動きでライントレースをしていけるように左右のタイヤ両方を回転させた。
しかし、これだと前に進まないため、白と黒の間をトレースしたときだけまっすぐ進むようにプログラムした。
直角カーブの部分はターンを入れることでうまくトレースできるようにした。
**苦労したところ [#j849005a]
直角カーブを曲がるのがとても苦労した。
ターンとOnFwdを組み合わせてなんとか曲がることができた。
ターンとOnFwdの時間の調整が難しかった。
*感想 [#af5dc064]
課題1に比べてとても難しく大変だったが、その分、完成したときの達成感があった。
途中、音を加えてみた。
音を入れて楽しみながらプログラムしました。
*動画URL [#r76b6dc5]
https://youtu.be/URsMHJ74iT8
ページ名: