[[2019a/Member]] *課題2 [#xdd18bdf] **コース [#n6a10767] #ref(2019a-mission2) **ミッション [#a6985f11] A地点から出発→B→C(直進)→D(一時停止の後,直進)→E→F→G(一時停止の後,右折)→H→I→J(右折)→K(左折)→L(ピンポン玉をつかむ)→K(直進)→M(一時停止)→シュート→A地点に入る(ゴール) *ロボットの構造 [#jbda5e2a] **ロボットの全体の仕組み [#o6372fae] アームを前方につけ操作盤を後方につけた。光センサーはアームの下に取り付けた。 #ref(image1 (9).jpeg) **アームの構造 [#o56c3b5b] ピンポン玉をすくいあげるようにして取るような構造にした。 #ref(image1 (10).jpeg) *プログラミング [#w2b38e75] 光センサーを五段階に設定 #define BLACKS 45 #define BLACK 53 #define THRESHOLD 61 #define WHITE 69 #define WHITES 75 光センサーに対応したロボットの動作 #define left_s OnFwd(OUT_A,20);OnRev(OUT_B,20); #define left OnFwd(OUT_A,20);Off(OUT_B); #define right_s OnFwd(OUT_B,20);OnRev(OUT_A,20); #define right OnFwd(OUT_B,20);Off(OUT_A); #define forward OnFwd(OUT_AB,20); **サブルーチン [#kdaea624] ***線の左側をライントレースするプログラミング [#n5333acd] sub follow_line_left() [#x3708656] { SetSensorLight(S3); long t0=0,t1=0,time_max=2; while(t1-t0<time_max){ if(SENSOR_3<BLACKS){ t0=CurrentTick(); left_s;until(SENSOR_3<THRESHOLD); t1=CurrentTick(); }else if(SENSOR_3<BLACK){ left; }else if(SENSOR_3<THRESHOLD){ forward; }else if(SENSOR_3<WHITE){ right; }else if(SENSOR_3<WHITES){ right_s; } } Off(OUT_AB); Wait(1000); } ***線の右側をライントレースするプログラミング [#u1a0e38a] sub follow_line_right() { SetSensorLight(S3); long t0=0,t1=0,time_max=2; while(t1-t0<time_max){ if(SENSOR_3<BLACKS){ t0=CurrentTick(); right_s; until(SENSOR_3<THRESHOLD); t1=CurrentTick(); }else if(SENSOR_3<BLACK){ right; }else if(SENSOR_3<THRESHOLD){ forward; }else if(SENSOR_3<WHITE){ left; }else if(SENSOR_3<WHITES){ left_s; } } Off(OUT_AB); Wait(1000); } ***メインプログラム [#kb149545] task main() { long t=1000; forward; Wait(1000); ・・・Aから出る。 follow_line_left(); ・・・BからCを通りDで止まる。 forward; Wait(t); ・・・Dの交差点を渡る。 follow_line_left(); ・・・DからEを通りFで止まる。 right; Wait(t); ・・・Gで方向転回。 follow_line_right(); ・・・GからHまで移動。 repeat(2){ forward; Wait(t); follow_line_right(); } ・・・HからIを通りJで止まる。 right_s; Wait(t); follow_line_right(); ・・・JからKまで移動。 left_s; Wait(t); ・・・Kで方向転換。 follow_line_left(); ・・・KからLに移動。 OnRev(OUT_C,20); Wait(500); ・・・ボールをすくい取る。 left_s; Wait(4000); ・・・Lで方向転換。 follow_line_right(); ・・・LからKに移動。 forward; Wait(2000); ・・・交差点を渡る。 follow_line_right(); ・・・KからMに移動。 OnFwd(OUT_C,20); Wait(500); ・・・ボールを下ろす。 OnRev(OUT_AB,20); Wait(500); OnFwd(OUT_AB,100); Wait(t); ・・・シュート。 Off(OUT_AB); ・・・停止。 } *まとめ [#a6b306ab] 今回は交差点で止まったりなどプログラミングがむずかいかった。また,光センサーの値が場所によって変わるのでよりプログラミングより困難になった。