#contents *課題 [#j496acd3] [[2019a/Mission2]] &ref(./2019a-mission2.png,60%); 私は以下のルートで走行するロボットを作成した。 A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) *ロボットの構造 [#kc253e0a] **ロボット全体の構造 [#r52dd6c8] レゴのクラフトガイドを参考にタイヤと光センサーを付け、そこにアームの部分を取り付けた。 &ref(./image1.jpeg,40%); **アームの構造 [#a7ffc8ff] ピンポン玉をすくい取るような機構にした。ピンポン玉まで進みアームを上げるとピンポン玉が持ち上がる。 &ref(./image3.jpeg,60%); *プログラム内容 [#v7c13868] **ライントレースの方法 [#na352db6] 図のように光センサーの取る値に対するロボットの動きを5段階に分けることでライントレースをできるようにした。 &ref(./hikari3.png,60%); **交差点での止まり方 [#r0a1c5c8] &ref(./hikari5,60%); &ref(./hikari5.png,60%); �△茲蠅皚,諒�が長い時間、線上を通るので、光センサーの値が38を取る時間が一定以上になったらロボットが止まるようにした。 **#define[#lab1035a] ***5段階に分けた光センサーの取る値 [#kf9da661] #define BLACKS 38 #define BLACK 45 #define THRESHOLD 53 #define WHITE 60 #define WHITES 68 ***光センサーに対応したロボットの動き [#g27bc6bf] #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); **サブルーチン [#wb67a32a] ***線の左側をライントレースするプログラミング [#x98e539a] sub follow_line_left() { 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); } ***線の右側をライントレースするプログラミング [#ja616424] 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); } **メインプログラム [#ne8b38c8] 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); //停止。 } *反省・感想[#d7a75c1d] 今回の課題ではライントレース、交差点で止まるなどの点で前回の課題1に比べて多くの点で難しさを感じた。今回の課題で多くのトライ&エラーを経験したことで問題解決の力を伸ばすことができた。この今回身につけた力を課題3に活かし、よりよいロボット、プログラムを作ろうと思った。