*課題2 [#ad0b1f6a] 第2コースで黒い線に沿って動き、350mlの空き缶(黄色で表示)を移動させるロボットを製作せよ。 #ref(2018a-mission2.png,,100%) **第2コース [#he232dad] +Aをスタート +Bを右折 +Jで一時停止の後、Yの空き缶をキャッチしてJに戻る +JからKに向かい、Kを直進 +Lを直進 +Iを左折 +Hで一時停止の後、左折 +Gで一時停止の後、右折 +Fで一時停止の後、右折 +Eを直進 +Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう +Cで一時停止の後、直進 +Bを直進 +Aで停止 *ロボット [#qa359c29] #ref(IMG_1387.JPG,,50%) **アーム (つかむ前) [#ta6e0e45] #ref(IMG_1386.JPG,,50%) **アーム(つかんだ後) [#af982efd] #ref(IMG_1388.JPG,,50%) ***工夫しところ [#qac00363] ロボットを作る際に、光センサーをライントレースしやすいようにできるだけ本体に近ずけた。また、アームの部分に関しては横にマジックハンドのようなのが理想だったが、作ることができなかったので縦に動いてつかむというよりは捕まえるに近いような形にした。 *プログラム [#u177d47b] **定義 [#m865e33b] #define BLACK 45 #define WHITE 50 #define sp SetPower(OUT_AC,1); #define sp2 SetPower(OUT_ABC,3); #define MAE sp;OnFwd(OUT_AC); #define HIDARIHE sp;Off(OUT_A);OnFwd(OUT_C); #define MIGIHE sp;OnFwd(OUT_A);Off(OUT_C); #define HIDARIMUKI sp;OnFwd(OUT_C);OnRev(OUT_A); #define MIGIMUKI sp;OnFwd(OUT_A);OnRev(OUT_C); #define KYUUMIGIHE sp;OnFwd(OUT_A);OnRev(OUT_C); #define KYUUHIDARIHE sp;OnFwd(OUT_C);OnRev(OUT_A); **サブルーチン [#vb293fb4] sub ZENSHINR() ***sub ZENSHINR() /線の右側を進む [#o7e5d1dc] { ClearTimer(0); while(FastTimer(0)<=25) { if (SENSOR_2 < BLACK) { MIGIHE; } else if (SENSOR_2 < WHITE) { MAE; ClearTimer(0); } else { HIDARIHE; ClearTimer(0); } } Off(OUT_AC); } sub ZENSHINL() ***sub ZENSHINL() /線の左側を進む [#ib09776d] { ClearTimer(0); while(FastTimer(0)<=25) { if (SENSOR_2 < BLACK) { HIDARIHE; } else if (SENSOR_2 <WHITE) { MAE; ClearTimer(0); } else { MIGIHE; ClearTimer(0); } } Off(OUT_AC); } sub CURVEL() ***sub CURVEL() /線の左側を回る [#k8af0ae3] { ClearTimer(0); while(FastTimer(0)<=18) { if (SENSOR_2 < BLACK) { KYUUHIDARIHE; } else if (SENSOR_2 <WHITE) { MAE; ClearTimer(0); } else { MIGIHE; ClearTimer(0); } } } Off(OUT_AC); } **メイン [#oc1c02af] SetSensor(SENSOR_2, SENSOR_LIGHT); ZENSHINR(); MAE; Wait(40); Off(OUT_AC); while(SENSOR_2 >= WHITE ){ MIGIMUKI; } Off(OUT_C); ZENSHINL(); Wait(80); while(SENSOR_2 < WHITE ){ OnFwd(OUT_A); } OnFwd(OUT_AC); Wait(25); Off(OUT_AC); sp2; OnRev(OUT_B); Wait(80); Off(OUT_B); MAE; Wait(50); Off(OUT_AC); Wait(100); while(SENSOR_2 >= WHITE ){ OnRev(OUT_A); } while(SENSOR_2 < WHITE ){ OnRev(OUT_A); } while(SENSOR_2 >= WHITE ){ OnRev(OUT_A); } CURVEL(); while(SENSOR_2 >= WHITE ){ OnFwd(OUT_A); } while(SENSOR_2 < WHITE ){ OnFwd(OUT_A); } while(SENSOR_2 >= WHITE ){ MIGIMUKI; } CURVEL(); while(SENSOR_2 >= WHITE ){ OnFwd(OUT_A); } while(SENSOR_2 < WHITE ){ OnFwd(OUT_A); } while(SENSOR_2 >= WHITE ){ MIGIMUKI } CURVEL(); *反省 [#c7973321] 今回の課題は前回の課題よりロボットを作るのは比較的簡単だった。しかし、プログラミングでつまずいた。前回の課題では前後左右の動きしかしなかったので今回の課題は前回とのギャップでとても難しかった。特に難しかったのが急カーブだ。初め急カーブを曲がるにはタイヤを片方前で片方後ろに回すことを知らず、単純に片方のタイヤだけ動かしていた。結局このこと知っても間に合わなかった。ロボットにはこういう細かいことも動作を作用することがわかった。こういうところがロボットを作るたのしさだと思った。次回の課題は完成させられるようにしたい。