[[2019a/Member]] *課題2 [#m04645c9] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 黒い線をトレースする。 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 2コースあるうち私は下記のルートを担当した。 A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール) #ref(2019a/Member/Tomi/Mission2/ロボティクス課題2コース.jpg,50%) *全体像 [#q41b5df1] #ref(2019a/Member/Tomi/Mission2/20190717_210754s.jpg,50%) #ref(2019a/Member/Tomi/Mission2/20190717_210809s.jpg,50%) 動きやすさを重視するために全体の軽量化を試みた。 -タイヤ 初め四輪で行なったが、振り幅が大きくなってしまい誤差が大きくなってしまうため二輪に挑戦した。だが、アームを前に取り付けるため重心が偏ってしまい引きずって走るようになったので、初回から動きやすくなるように前のタイヤを小さいのに替え摩擦を小さくしたためだいぶ動きがスムーズになった。 #ref(2019a/Member/Tomi/Mission2/20190717_210905s.jpg,50%) -アーム ピンポン球を回収、シュートさせるために用いるアームは板を回転させることでピンポン球を動かすようにした。 #ref(2019a/Member/Tomi/Mission2/20190717_210839s.jpg,50%) *プログラミング [#m0c30a60] 担当したコースの道順上、線の右側をトレースすることにした。 -マクロ 右折 #define turn_right OnFwd(OUT_A);Off(OUT_C); 左折 #define turn_left OnFwd(OUT_C);Off(OUT_A); 左旋回 #define circling_left OnFwd(OUT_C);OnRev(OUT_A); 右旋回 #define circling_right OnRev(OUT_C);OnFwd(OUT_A); 直進 #define go_ahead OnFwd(OUT_AC); -グローバル変数 int t; -サブルーチン sub follow_line1() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0);ClearTimer(1); while((FastTimer(0)<15)&&(FastTimer(1)<t)){ if(SENSOR_2<41){ circling_right; } else if(SENSOR_2<43){ turn_right;ClearTimer(0); } else if(SENSOR_2<48){ go_ahead;ClearTimer(0); } else if(SENSOR_2<50){ turn_left;ClearTimer(0); } else if(SENSOR_2<55){ circling_left;ClearTimer(0); } } Off(OUT_AC); PlaySound(SOUND_CLICK); } sub follow_line() { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0);ClearTimer(1); while((FastTimer(0)<25)&&(FastTimer(1)<t)){ if(SENSOR_2<41){ circling_right; } else if(SENSOR_2<43){ turn_right;ClearTimer(0); } else if(SENSOR_2<48){ go_ahead;ClearTimer(0); } else if(SENSOR_2<50){ turn_left;ClearTimer(0); } else if(SENSOR_2<55){ circling_left;ClearTimer(0); } } Off(OUT_AC); } sub cross_line() { go_ahead;Wait(30);Off(OUT_AC); } また光センサーによる認識の数値は #ref(2019a/Member/Tomi/Mission2/ロボティクス入門課題2光センサー値.jpg,50%) とし、それぞれの値による動きは以下の通り。 41:右旋回 43:右折 48:直進 50:左折 55:左旋回 -実際の動き task main() { t=10000;follow_line();cross_line();//C t=10000;follow_line();Wait(100);cross_line();//D t=10000;follow_line();Wait(100);//E circling_right;Wait(30);Off(OUT_AC); t=10000;follow_line();Wait(100);//F t=10000;follow_line();Wait(100);//G circling_right;Wait(40);Off(OUT_AC); t=10000;follow_line1();Wait(100);cross_line();//H t=10000;follow_line1();Wait(100);cross_line();//I t=10000;follow_line1();Wait(100);//J t=10000;follow_line();Wait(100);//K go_ahead;Wait(30);Off(OUT_AC); t=300;follow_line();Wait(100); OnRev(OUT_B);Wait(20);Off(OUT_B); t=10000;follow_line();Wait(100);cross_line();//K t=10000;follow_line();//M OnFwd(OUT_B);Wait(20);Off(OUT_B); } *反省点 [#x989c1b4] 上の図のスタートからシュートまで一連の動きでできたのは5回に1回程度だった。タイヤを四輪から二輪にしたり、全体の軽量化をして改善を試みたができなかった。そこでプログラミングによる調整をした。グローバル変数を用いて交差点と円の区別をさせようとしたが、うまくできなかった。ピンポン球の回収・発射させる部分はつまる事なくできた。 次回はロボットにあったプログラミングは組みたい。