[[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/Mission1/ロボティクス 課題2 コース.jpg,50%)
#ref(2019a/Member/Tomi/Mission1/ロボティクス課題2コース.png,50%)

*全体像 [#q41b5df1]
#ref(2019a/Member/Tomi/Mission1/20190717_210754s.jpg,50%)
#ref(2019a/Member/Tomi/Mission1/20190717_210809s.jpg,50%)
動きやすさを重視するために全体の軽量化を試みた。
-タイヤ
初め四輪で行なったが、振り幅が大きくなってしまい誤差が大きくなってしまうため二輪に挑戦した。だが、アームを前に取り付けるため重心が偏ってしまい引きずって走るようになったので、初回から動きやすくなるように前のタイヤを小さいのに替え摩擦を小さくしたためだいぶ動きがスムーズになった。
#ref(2019a/Member/Tomi/Mission1/20190717_210905s.jpg,50%)
-アーム
ピンポン球を回収、シュートさせるために用いるアームは板を回転させることでピンポン球を動かすようにした。
#ref(2019a/Member/Tomi/Mission1/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);
 }
また光センサーによる認識の数値は





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);
}


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS