[[2019a/Member]]
#contents

*課題3:ボール運搬ロボット [#t0a921e9]
**フィールドの説明 [#ga6480ef]

&ref(課題3 フィールド説明2.png);

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


**ルール [#q54f8f20]

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

*ロボットの説明 [#va172a24]
**アームの説明 [#af94082a]

今回はモーターを2つ使って,ボールをととる動作と,ボールを放す動作に分けて動くようにした.
***ボールを取る動作 [#e38c3a04]
ボールを取る動作はゴムを使う機構にした.上からボールを押したときにゴムでとるような造りだ.

&ref(bo-ru toru.jpg);


***ボールを箱に入れる動作 [#eb5bf674]
ボールを箱に入れる動作は長い棒をうまく使ってできるようにした.

&ref(bo-ru toru3.jpg);&ref(bo-ru hanasu2.jpg);

長い棒が閉じているときはボールが落ちないようになっているが,長い棒が開くとそこからボールが落ちるような仕組みだ.

両側から閉じたかったので歯車を2枚使った.

&ref(bo-ru hanasu.jpg);

**足まわりの説明 [#v589206f]

足まわりのところはアームが重くなってしまっているので本体を乗せる部分を強化したりタイヤの部分を中心に強くした.

&ref(nxt support.jpg);

光センサーはタイヤの近くに設置しライントレースをしやすくした.

&ref(hikari sensa.jpg);

*経路の説明 [#v64c0bfb]
**1つ目のピンポン玉を入れるまでの経路 [#e1780a00]

**2つ目のピンポン玉を取るまでの経路 [#i121372b]

*プログラムの説明 [#v99e6db1]
**定義 [#c60a9e04]
 #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

**アームのサブルーチン&プログラム [#de49ff99]
***アームを上げ下げ [#f32b6fec]
+マスター側
 sub arm_up() //アームを上げる
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S1).rxe");
    while(msg !=11){
        ReceiveRemoteNumber(MAILBOX1,true,msg);
    }
    Wait(2000);
 }
+スレイブ側
 sub arm_up_s()
 {
      OnRev(OUT_C,50);
      Wait(5000);
      Off(OUT_C);
 }
 task main()
 {
      arm_up_s();
       SendResponseNumber(MAILBOX1,11);
 }


+マスター側
 sub arm_down() //アームを下げる
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S2).rxe");
    while(msg !=12){
        ReceiveRemoteNumber(MAILBOX1,true,msg);
    }
    Wait(2000);
 }
+スレイブ側
 sub arm_down_s()
 {
      OnFwd(OUT_C,30);
      Wait(3000);
      Off(OUT_C);
 }
 task main()
 {
      arm_down_s();
       SendResponseNumber(MAILBOX1,12);
 }


***長い棒の開け閉め [#wf044be0]

 sub arm_open() //棒を開ける
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S3).rxe");
    while(msg !=13){
        ReceiveRemoteNumber(MAILBOX2,true,msg);
    }
    Wait(2000);
 }


 sub arm_close() //棒を閉める
 {
    int msg;
    until(BluetoothStatus(1)==NO_ERR);
    RemoteStartProgram(1,"TAI(S4).rxe");
    while(msg !=14){
        ReceiveRemoteNumber(MAILBOX2,true,msg);
    }
    Wait(2000);
 }

**アーム以外のサブルーチン [#d144c74d]
***ライントレース [#ec318eaa]

 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);
 }
***交差点横断 [#g3421d67]

 sub oudann()
 {
    right;
    Wait(300);
    Off(OUT_BC);
    OnFwd(OUT_BC,30);
    Wait(500);
    Off(OUT_BC);
 }

 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);             
 }
*メインプログラム [#n85e20dd]

 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();
 }
*反省・感想 [#e703271c]

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