*課題3 [#y99f8e94]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。

#ref(mission3.png,,50%)
フィールドの説明
フィールドは課題2で使用した紙を使用する。
生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
プラ容器には色をつけたり文字や記号を書いてもよい。
プラ容器は両面テープ等でフィールドに固定してもよい。
2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
**ルール [#n50f30af]

基本ルール
~競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
~図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域~内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
~開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
~競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
~途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
~競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
~競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
~基本得点の計算方法
~プラ容器内の玉を1個運べば8点。二つとも運べば20点。
~L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
~競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
~競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
~競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
~競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
~競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
~技術点の計算方法
~以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチー~玉を探し取りにいくまでの動作 (3点)
~玉を掴む動作 (3点)
~玉をを運ぶ動作 (2点)
~玉を容器の中に入れる動作 (2点)
~2台のRIS、NXT、EV3の連携の良さ(2点)
~自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
~その他 (3点)
*ロボットの説明 [#z9abf1d7]
今回作ったロボットはこちらです。
#ref(image1.jpeg,,80%)
私たちのグループは二つのロボットに分けるのではなく、一体型のロボットの作った。一つのNXTの本体はタイヤを動かし、前後左右の動きを可能にそして、もう片方のNXTは、アームの部分を動かし、上下の動きを可能にする。二つのNXTはBluetoothで通信している。
**アームの機構 [#c71ef7eb]
アームの機構はこのようになっている。
#ref(image2 - コピー.jpeg,,35%)
**ボールをつかむ機構 [#afb546e3]
ボールをとるために、輪ゴムを利用した。ボールを上から二本の輪ゴムで挟み上にあげるというものである。
#ref(ボール上げ.png,,35%)
このようにしてボールをつかんでいき、ボールがお互いに押し合って、上に上がって、溜まっていく。
#ref(close.png,,35%)
溜まっていったボールは、黒い棒の開け閉めによって、ボールをとどめておいたり、出したりできるようにした。
**光センサー [#e5d234b9]
センサーの位置は下のようになった
#ref(センサー.png,,50%)
光センサーはタイヤよりも前の位置につけた。当初、光センサーの位置はタイヤよりも後ろについていたが、それだと色の認識の判断が遅れ、ライントレースができるときとできない時があったため、タイヤよりも前につけることにした。
*プログラムの説明 [#vf204729]
今回はNXTを二つ使っているので、片方をマスター、もう一方をスレーブとしてBluetoothで通信している。スレーブ側のプログラムは「アームを上げる」、「アームを下げる」、「扉を開ける」、「扉を閉める」の四つの操作を行う。コースとしては右側のマップのB→C→D→E→F→Gとライントレースをしていき、箱の中のふたつをとり、残りの二つをとるという、作戦である。
**スレーブ側のプログラム [#b0e868cf]
***アームを上げる [#o2654d2e]
プログラム名はTAI(S1)
 task main()
 {
   OnRev(OUT_C,50);
   Wait(5000);
   Off(OUT_C);
   SendResponseNumber(MAILBOX1,11);   //マスター側にアームを上げた終わったことを伝える
 }
***アームを下げる [#hc9d17c4]
プログラム名はTAI(S2)
 task main()
 {
    OnFwd(OUT_C,30);
    Wait(3000);
    Off(OUT_C);
    SendResponseNumber(MAILBOX1,12); //マスター側にアームを下げた終わったことを伝える
 }
***扉を開ける [#f96fe191]
プログラム名はTAI(S3)
 task main()
 {
   OnFwd(OUT_B,30);
   Wait(3000);
   Off(OUT_B);  
   SendResponseNumber(MAILBOX2,13); //マスター側に扉を開けたことを伝える
 }
***扉を閉める [#bc4422b4]
プログラム名はTAI(S4)
 task main()
 {
   OnRev(OUT_B,50);
   Wait(5000);
   Off(OUT_B);
   SendResponseNumber(MAILBOX2,14); //マスター側に扉を閉めたことを伝える
 }
**マスター側のプログラム [#h83c6e5b]
***定義したマクロ [#m84ac443]
 #define BL 40
 #define WH 47
 #define HB 32
 #define HW 55
 #define left OnFwd(OUT_B,45);OnRev(OUT_C,40);    //左旋回
 #define right OnFwd(OUT_C,45);OnRev(OUT_B,40);  //右旋回
 #define lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25);  //左に曲がる
 #define rights OnFwd(OUT_C,38);OnFwd(OUT_B,25); //右に曲がる
 #define CONN 1                  //Bluetoothの接続番号
***ライントレース [#y01440fa]
ライントレースのプログラムは以下のようになる。
 sub hidari()
 {
    SetSensorLight(S3);
    long t0=CurrentTick();
    while(CurrentTick()-t0<=250){
        if(SENSOR_3>HW){
            right;
            t0=CurrentTick();
        }else if(SENSOR_3>WH){
            rights;
            t0=CurrentTick();
        }else if(SENSOR_3>BL){
            OnFwd(OUT_BC,30);
            t0=CurrentTick();
        }else if(SENSOR_3>HB){
            lefts;
             t0=CurrentTick();
        }else{
            left;
         } 
    }
    Off(OUT_BC); 
 }
***交差点横断 [#gb1d3340]
交差点横断のプログラムは次のようになる。
  sub oudann()
 {
    right;
    Wait(300);
    Off(OUT_BC);
    OnFwd(OUT_BC,30);
    Wait(500);
    Off(OUT_BC);
 }
***直角のライントレース [#tacf7b5c]
直角のところのライントレースは次のようになる。なお、このプログラムは箱の前で止まるようになっている。
  sub magari()
 {
    SetSensorLight(S3);
    int nOnline=0;
    while(nOnline<4600){
        if(SENSOR_3>HW){
             right;
             nOnline++;
        }else if(SENSOR_3>WH){
             rights;
        }else if(SENSOR_3>BL){
              OnFwd(OUT_BC,30);
        }else if(SENSOR_3>HB){
               lefts;
        }else{
               left;
        }
        
    }
    Off(OUT_BC);             
 }
***アームを上げる [#a75642a9]
 sub arm_up()
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S1).rxe");
    while(msg !=11){
        ReceiveRemoteNumber(MAILBOX1,true,msg);
    }
    Wait(2000);
 }
***アームを下げる [#y567662f]
 sub arm_down()
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S2).rxe");
    while(msg !=12){
        ReceiveRemoteNumber(MAILBOX1,true,msg);
    }
    Wait(2000);
 }
***扉を開ける [#r0585964]
  sub arm_open()
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S3).rxe");
    while(msg !=13){
        ReceiveRemoteNumber(MAILBOX2,true,msg);
    }
    Wait(2000);
 }
***扉を閉める [#r2ea2bbb]
 sub arm_close()
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S4).rxe");
    while(msg !=14){
        ReceiveRemoteNumber(MAILBOX2,true,msg);
    }
    Wait(2000);
 }
***全体のプログラム [#id98e096]
 task main()
 {
    hidari();
    oudann();
    magari();
    arm_up();
    OnFwd(OUT_BC,30);
    Wait(300);
    Off(OUT_BC);
    arm_down();
    arm_close();
    left;
    Wait(1500);
    Off(OUT_BC);
    OnFwd(OUT_BC,30);
    Wait(2000);
    Off(OUT_BC);
    arm_up();
    arm_down();
    left;
    Wait(2500);
    Off(OUT_BC);
    OnFwd(OUT_BC,40);
    Wait(5000);
    Off(OUT_BC);
    hidari();
    oudann();
    hidari();
    oudann();
    hidari();
    arm_up();
    arm_open();
 }

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