[[2019a/Member]]
*目次 [#ha636ac0]
#contents

*課題3について [#aef2e5c2]

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


**基本ルール [#o668dedf]
+競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
+図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
+開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
+競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
+途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
+競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
+競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。

*ロボットの説明 [#c0f90928]
全体像↓
#ref(./IMG_20190807_054224.jpg,10%,)
機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした.
1つのNXTは機体を動かすためのもので,もう1つのNXTはアームを動かすためのものにした.機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした.
**アームについて [#p64e7a0d]
正面から↓
#ref(./IMG_20190807_054248.jpg,10%,)
斜め横から↓
#ref(./IMG_20190807_131625.jpg,10%,)
歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大3個まで一度に運ぶことが出来る.また,アームを開くことにより,黒い棒で抑えられていたボールが落ちる.
歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大3個まで一度に運ぶことが出来る.また,アームを開くことにより,黒い棒で抑えられていたボールが落ちる
**光センサーについて [#s43b0a65]
光センサーを出来るだけ前につけることにより,ライントレースをしやすいようにした.
*プログラミングの説明 [#z3e0b25c]
今回の課題ではNXTを2つ使ったので片方をマスター,もう片方をスレーブとして,Bluetoothを用いて通信する.
**定義の説明 [#fe0401c3]
光センサーで感知する色を以下のように定義する.
 BL 40 //灰色に近い黒
 WH 47 // 灰色に近い白
 HB 32 //真っ黒
 HW 55 //真っ白

また以下のように動きを定義する.
 left OnFwd(OUT_B,45);OnRev(OUT_C,40); //左回り
 right OnFwd(OUT_C,45);OnRev(OUT_B,40); //右回り
 lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25); //左曲がり
 rights OnFwd(OUT_C,38);OnFwd(OUT_B,25); //右曲がり
#ref(./色の定義.png,70%,)
 CONN 1 //Bluetoothの接続
**交差点の認識方法 [#b67bc650]
直角の交差点は,カーブに比べて,黒い部分に滞在する時間が長くなるので,その時間差を利用して認識する.直角の交差点で止まり,カーブでは進み続ける時間は0,25秒だった.
#ref(./line2.png,70%,)

**ライントレース(マスター側) [#b6d6b773]
sub hidari()
{
    SetSensorLight(S3); //光センサー起動
    long t0=CurrentTick();
    while(CurrentTick()-t0<=250){ //0,25秒以上経過するまで続ける
        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); 
}
**交差点の横断(マスター側) [#hf7a7ce2]
sub oudann()
{
    right; //右回り
    Wait(300);
    Off(OUT_BC);
    OnFwd(OUT_BC,30); //直進
    Wait(500);
    Off(OUT_BC);
}

**直角のライントレース(マスター側) [#c866a05b]
sub magari()
{
    SetSensorLight(S3); //光センサー起動
    int nOnline=0;
    while(nOnline<4600){ //4,6秒以上経過するまで続ける
        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);             
}

**アームを上げる(マスター側) [#l351203a]
sub arm_up()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ
    RemoteStartProgram(1,"TAI(S1).rxe"); //スレーブ側にTAI(S1)を命令
    while(msg !=11){ 
        ReceiveRemoteNumber(MAILBOX1,true,msg); //MIALBOX1からメッセージを受け取る
    }
    Wait(2000);
}
**アームを上げる(スレーブ側) [#rdd701ba]
sub arm_up_s()
{
      OnRev(OUT_C,50);
      Wait(5000);
      Off(OUT_C);
      SendResponseNumber(MAILBOX1,11); //MAILBOX1に11と送る


**アームを下げる(マスター側) [#je6a013a]
sub arm_down()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ
    RemoteStartProgram(1,"TAI(S2).rxe"); //スレーブ側にTA1(S2)を命令
    while(msg !=12){
        ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1からメッセージを受け取る
    }
    Wait(2000);
}
**アームを下げる(スレーブ側) [#qa3f499b]
sub arm_down_s()
{
      OnFwd(OUT_C,30);
      Wait(3000);
      Off(OUT_C);
      SendResponseNumber(MAILBOX1,12); //MAILBOX1に12と送る
}


**アームを開く(マスター側) [#vaa50dbf]
sub arm_open() 
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ
    RemoteStartProgram(1,"TAI(S3).rxe"); //スレーブ側にTA1(S3)を命令
    while(msg !=13){
        ReceiveRemoteNumber(MAILBOX2,true,msg); //MAILBOX2からメッセージを受け取る
    }
    Wait(2000);
}
**アームを開く(スレーブ側) [#s01d2d3c]
sub open_s()
{
      OnFwd(OUT_B,30);
      Wait(3000);
      Off(OUT_B);
      SendResponseNumber(MAILBOX2,13); //MAIKBOX2に13と送る
}



**アームを閉じる(マスター側) [#t4d6fe11]
sub arm_close()
{
    int msg;
    until(BluetoothStatus(1)==NO_ERR); //子機の準備を待つ
    RemoteStartProgram(1,"TAI(S4).rxe"); //スレーブ側にTA1(S4)を命令
    while(msg !=14){
        ReceiveRemoteNumber(MAILBOX2,true,msg); //MAILBOX2からメッセージを受け取る
    }
    Wait(2000);
}
**アームを閉じる(スレーブ側) [#wd805956]
sub close_s()
{
      OnRev(OUT_B,50);
      Wait(5000);
      Off(OUT_B);
      SendResponseNumber(MAILBOX2,14); //MAILBOX2に14と送る

**全体のプログラミング [#i4255e8b]
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();
}

*結果 [#v09d3370]
ロボコンではボールを運ぶどころかほとんど起動しないまま終わってしまった.電池切れが原因か.
*まとめ・感想 [#we0fb2b7]
テスト期間に近いこともあり,あまり時間を割けなかったので,あまり良い結果にはならなかった.しかし,この授業を通して,1つのことに集中したり,長い時間をかけたりすることができ,結果はともあれ,良い経験になったと思う.


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