[2019a/Member/Nove/Mission3]

#contents
*課題について [#vb223768]
ピンポン玉4つを所定の箱の中に運搬するロボットの作成。
**フィールドの説明 [#a9167204]
#ref(2019a/Member/Nove/Mission3/2019a-mission3.png)
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
**ルール [#x1cf3abd]
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域-内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別-ログラムで起動してよい)。
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
*ロボット本体の説明 [#u1e7dd8b]
**ロボット1 [#p5a3fba7]
アームで容器ごと掴み、箱の近くでアームをさらに上げ、後ろにボールを流し球を入れる仕組み。しっかりと球が転がるよう坂も作った。
**写真 [#wc968b3d]
全体を横から見たものと上から見たものを載せる。
#ref(2019a/Member/Nove/Mission3/s_ロボット1_0011.jpg)
#ref(2019a/Member/Nove/Mission3/s_ロボット1_0010.jpg)
球を入れる過程を示すものを載せる。
#ref(2019a/Member/Nove/Mission3/s_ロボット1_0014.jpg)
#ref(2019a/Member/Nove/Mission3/s_ロボット1_0012.jpg)
**ロボット2 [#r32402c9]
三つ目のモーターで輪ゴムを取り付けた部品を上下させ、たまを取る、入れるの動作を行うようにした。また、上部につけたブロックは球を持ち上げる際に上げすぎないためのストッパーと球を落とすときにぶつけさせるという役割を果たしている。それに加え、車体の高さを上げることで箱と衝突数ることが無いようにした。
**写真 [#e480d390]
全体を横から見たもの、上から見たもの、アームが下がっているものの三枚を載せる。
#ref(2019a/Member/Nove/Mission3/s_ロボット2_0013.jpg)
#ref(2019a/Member/Nove/Mission3/s_ロボット2_0012.jpg)
#ref(2019a/Member/Nove/Mission3/s_ロボット2_0007.jpg)
球を入れる過程を示すものを載せる。
#ref(2019a/Member/Nove/Mission3/s_ロボット2_0006.jpg)
#ref(2019a/Member/Nove/Mission3/s_ロボット2_0002.jpg)
*プログラムの説明 [#m6173479]

**ロボット1 [#fac4b430]

-ルート
A⇒K⇒J⇒箱キャッチ⇒I'⇒シュート

-プログラムについて

 #define RUN_TIME 610
 #define power(s) SetPower(OUT_B,s);
 #define STEP 5
 #define turn OnFwd(OUT_A);OnRev(OUT_C);Wait(148);Off(OUT_AC);
 #define turn_left OnFwd(OUT_C);OnRev(OUT_A);Wait(120);Off(OUT_AC);

 sub tores()
 
 { SetSensor(SENSOR_2,SENSOR_LIGHT);
   
    ClearTimer(0); 
 
    while ( FastTimer(0) <= RUN_TIME ) {    
        if ( 48 < SENSOR_2 ){
            OnFwd(OUT_A); Off(OUT_C);    //白なら右へ
        } else if (45 <SENSOR_2 < 49) {
            Off(OUT_A); OnFwd(OUT_C);    //灰色なら左へ
        } else {
            OnRev(OUT_A);OnFwd(OUT_C);    //黒なら左へ旋回
         } 
         
     }
  } 


 sub down()
 {
         OnFwd(OUT_B);
         power(0);    //ゆっくり前進
         Wait(50);
         Off(OUT_B);
         Wait(100);
 }  

 
 sub up1()
 {
         OnRev(OUT_B);
         power(0);    
         Wait(30);
         Off(OUT_B);
         Wait(100);
 } 

 
 sub throw()
 {
         OnFwd(OUT_B);
         power(0);   
         Wait(80);
         Off(OUT_B);
         OnRev(OUT_B);
        Wait(50);
         Off(OUT_B);
 } 

 
 task main()
 {
         
         OnFwd(OUT_AC);
         Wait(100);
         tores();
         turn;
         OnRev(OUT_AC);
         Wait(120);
         Off(OUT_AC);
         down();    
         OnFwd(OUT_AC);
         Wait(130);
         Off(OUT_AC);
         up1();
         OnRev(OUT_AC);
         Wait(415);
         turn_left;
         OnRev(OUT_AC);   
         Wait(140);
         Off(OUT_AC);
         throw(); 
 }


**ロボット2 [#ae1818ac]

-ルート

A'⇒K'⇒L'⇒玉キャッチ⇒K'⇒L玉入れ⇒L⇒玉キャッチ⇒J'⇒玉入れ

-プログラムについて

今回、時間が全く足りなかったのでライントレースで動かすつもりだったが断念し、Lに直角に向かうようなプログラムにした。輪ゴムを取り付けた部品を上下させることで球を取る動きをさせようとした。またpowerの関数を作り、力の加減を変数化しすることにより球を取る、あるいは落とす動作の時に詰まらないようにした。

 #define RUN_TIME 700
 #define turn OnFwd(OUT_A);OnRev(OUT_C);
 #define turn2 OnFwd(OUT_C);OnRev(OUT_A);
 #define power(s) SetPower(OUT_B,s); //モータのパワーをsにする
 #define go OnFwd(OUT_AC);

upのsubルーチンは球を取った後、箱にぶつからない高さまで球を持ち上げるためのものである。

 sub up()
 {
         OnFwd(OUT_B);
         power(1);//ゆっくり前進
         Wait(50);
         Off(OUT_B);
 }

up2のsubルーチンは球を箱に入れる際、上に設置したブロックに押し当て、球を落下させるために使われている。下に球を抜けさせる必要があるため、少し強くしている。

 sub up2()
 {
         OnFwd(OUT_B);
         power(3);//ゆっくり前進
         Wait(20);
         Off(OUT_B);
 }

downのsubルーチンは球を取る際に使われる。輪ゴムを抜けさせるため、少し強くいている。
 sub down()
 {
         OnRev(OUT_B);
         power(2);//ゆっくり前進
         Wait(50);
         Off(OUT_B);
 }


 task main()
 {
    go;Wait(110);Off(OUT_AC);//Lと直角に移動
    turn2;Wait(70);Off(OUT_AC);//90℃回転
    go;Wait(210);Off(OUT_AC);//Kまで
    turn;Wait(70);Off(OUT_AC);//90℃回転
    go;Wait(30);Off(OUT_AC);//玉の場所まで位置調整
    down();Wait(30);//玉キャッチ
    up();Wait(30);//持ち上げ
    turn2;Wait(70);Off(OUT_AC);//90℃回転
    go;Wait(10);Off(OUT_AC);//Lまで位置調整
    up2();Wait(30);//落とす
    OnRev(OUT_AC);Wait(1000);Off(OUT_AC);//コース外へ
 }

当初使う予定だったライントレースのプログラムも載せておく。

 sub tores()
 {    SetSensor(SENSOR_1,SENSOR_LIGHT);
     ClearTimer(0);
     while(FastTimer(0)<=RUN_TIME){
            if(48<SENSOR_1){//白ならば右回転
                   OnFwd(OUT_A);
                   Off(OUT_C);
                     ClearTimer(0);
            }else if(45<SENSOR_1<49){//白黒ならば左回転
                   Off(OUT_A);
                   OnFwd(OUT_C);
            }else{//黒ならば逆左回転
                   OnRev(OUT_A);
                   OnFwd(OUT_C);
              }
       }
      Off(OUT_AC);
      Wait(100);                                    
 }
*結果 [#fe36c36f]
どちらのロボットも上手く玉を運ぶことが出来ず、9位という結果だった。
*まとめ [#b19f72df]
プログラム、ロボットの設計共に課題2のペアで作った。自分はロボット2であるため説明がそちらの方が濃くなっている。
本番までにうまく球を入れるようにはできなかった。
また、球を一つとるところまでしかプログラムを作り切れなかった。
自分の思う通りにプルグラムを組むのは難しく、一つとして満足のいく結果を作ることができず悔しく思う。自分でもさらにプログラミングのことを勉強し、これからの授業や研究等に活かしていきたい。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS