[[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に比べてとても難しく大変だったが、その分、完成したときの達成感があった。 途中、音を加えてみた。 音を入れて楽しみながらプログラムしました。 &ref(MOV_0200.mp4); *動画URL [#r76b6dc5] https://youtu.be/URsMHJ74iT8