#contents

*課題内容 [#hf0b64d6]
 紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、D地点に置いた紙コップにはDを紙コップの底面にマークする
紙コップは上下どちらにおいてもかまわない
2台のロボットの場合はA地点とB地点からスタート、一体型の場合はA地点とB地点のいずれかからスタートする
最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねる (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにする)
紙コップを重ねる場所は、必ずしも目的地点の輪の中でなくてもかまわない
最終的に紙コップが自力で立っていること、またロボットが紙コップに触れていないこと、ただしスタート時と上下逆になっていてもかまわない
競技時間はすべてのコップを重ね終わるまで、あるいは審判が続行不能と判断するまで。
審判の合図の後、5秒以内にロボットをスタートさせ、それ以降はロボットや紙コップに触ってはいけない
EV3のチームはA,B,Cにそれぞれマークした紙コップをそれぞれ3個置く
EV3のチームはA,B,C,Dのどこからスタートしてもよいが、別の地点にある合計9個の紙コップを運ぶこと
紙コップに色を塗ったり文字や絵をかいてもよいが、穴を開けたり故意に変形させてはいけない
光センサは2セット合わせて2つまで使って良い、その他のセンサや部品はキットに含まれているものだけを使用すること

**攻略にあたって [#pe3656eb]

 私たちのグループではロボットの構造上の問題からライントレースによるコップの収集は断念して、直線的にコップを中心に持っていく戦法をとりました。
そのコースの概要を以下の図に示します。
�.蹈椒奪箸魑�動してCの地点のコップのまえまで直進させます。
�▲灰奪彖阿農纏澆気擦謄◆璽爐魑�動しコップをつかみます。
��コップを完全にホールドすると旋回してゴール地点を目指して直進します。
�ぅ粥璽訝賄世農纏澆靴討弔�んでいたコップを離します。
#ref(コース.jpg)


*ロボットの説明 [#m5a4490a]
#ref(ロボット1.jpg)
#ref(ロボット2.jpg)
#ref(ロボット3.jpg)
#ref(ロボット4.jpg)
#ref(ロボット5.jpg)
#ref(ロボット6.jpg)
 二つのNXTを組み合わせて一つの機体に仕上げています。
 赤で示した部分がアーム部分で青で示した部分が土台です。
緑で示した部分が超音波センサーでこれを用いてコップを認識します。

**アーム部分 [#n9b09441]
アームははさみ状に作った棒の先端にタイヤを二つ付けて作ったホールド部位(紫で示す)とモーターを二つ組み合わせたリフト部位(オレンジで示す)を組み合わせてできています。
このアームはコップの直前で土台(マスター)から送られてくる信号に従いリフト部位を動かして、ホールド部位のタイヤとコップを接触させます。その後、ホールド部位の下方のタイヤを回転させコップを巻き上げます。巻き上げた後のコップはタイヤの摩擦と上方のタイヤの重量による圧力でホールドされます。
その後、リフト部位を動かしてホールド部位を元の位置に戻します。
コップを離す際は、リフト部位を動かしホールド部位を下げてから、ホールド部位の下方のタイヤを掴む際の逆方向に回転させてコップを離します。

**土台部分 [#o4214532]
がっちりとした構造になっている。
土台部分については、コントローラー(黒で示す)を二つのせることに対する安定性の向上に重点を置きすぎて重量とタイヤ間隔が大きくなりすぎたせいでライントレースが満足にできない状況に陥ってしまいました。
どのような状況かというと、機体重量が重たすぎて出力を上げないと満足に動かなくなりこれによって機体の運動量が上昇し、止まりきれなくなった機体がラインの外に飛び出してしまったり、広い内輪差の為にカーブや交差点を曲がりきることができなくなりました。
これが原因で上記に示したような戦法をとるしかなくってしまいました。今回の反省点としてはこれが最も大きいです。



*プログラムの説明 [#d1889d6a]
 今回の課題ではNXTを二つ連携させる必要があり、それぞれに役割が分担されている。相互の命令のやりとりはMAILBOXによって行われている。
 マスター側(土台側)では移動用の二つのモーターと超音波センサーの制御、アームへの指令を担っています。そしてスレーブ側(アーム側)でアームのリフト部位とホールド部位のタイヤの制御しました。

**スレーブ(アーム)側 [#k3e2420e]
 #define SIGNALON 21                    //腕を動かすためにマスターがスレーブに送る信
 #define SIGNALOFF 22                    //腕を動かし終わったことをスレーブがマスターに送る信号
 #define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC);   //腕を上げる
 #define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC);   //腕を下ろす
 #define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B);    //紙コップを持つ
 #define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B);   //紙コップを離す
 #define CONN 0                       //マスターとつながっている
 #define SIGNALON2 31
 #define SIGNALOFF2 32

  void ude()                               //サブルーチン
    void ude()                               //サブルーチン
    {
        LIFT_down;
        CATCH;
        LIFT_up;
        CATCH;
        Off(OUT_B);
     }

   task main ()
    task main ()
   {

        int msg;
     while (true) {
      ReceiveRemoteNumber(MAILBOX1,true,msg);    //msgを受けている間

      if (msg == SIGNALON) {            //信号を受け取ったら紙コップを持ち上げる
        if (msg == SIGNALON) {            //信号を受け取ったら紙コップを持ち上げる
       ude();
     SendResponseNumber(MAILBOX2,SIGNALOFF);    //本体に次の行動をするように信号を送る
      } 
   	if (msg == SIGNALON2) {                    //信号を受け取ったら紙コップを離す
        if (msg == SIGNALON2) {                    //信号を受け取ったら紙コップを離す
       RELEASE;
      SendResponseNumber(MAILBOX2,SIGNALOFF2);   //本体に次の行動をするように信号を送る
      } else {                    //どちらでもなかったら動かない
        Off(OUT_BC);
 	
      }
	
 	
    }
  }
        } else {                    //どちらでもなかったら動かない
         Off(OUT_BC);
         }
        }
    }
**マスター(土台)側 [#cc3bbdc4]
 #define SPEED 50                              //スピード50
 #define go_forward OnFwd(OUT_BC,SPEED);       //前進
 #define CONN 1                //スレーブを表している
 #define SIGNALON 21              //腕を動かすためにマスターがスレーブに送る信号
 #define SIGNALOFF 22                          //腕を動かし終わったことをスレーブがマスターに送る信号
 #define SIGNALON2 31
 #define SIGNALOFF2 32
 #define turn_leftC  OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);  //左旋回
 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);  //右折

      task main()
   {
    task main()
       {
	int msg                     //MAILBOXに来る信号をmsgと定義する
	
 	
  	SetSensorLowspeed(S1);                           //端子1に超音波センサ               
   	go_forward;                   //前進
	until(SensorUS(S1) <= 9);            //センサの半径9cmに紙コップが入ったら停止
  	Off(OUT_BC);
   	SendRemoteNumber(CONN,MAILBOX1,SIGNALON );    //信号を送る
	
   while (true){
  	SetSensorLowspeed(S1);                           //端子1に超音波センサ
        go_forward;           //前進
        until(SensorUS(S1) <= 9);            //センサの半径9cmに紙コップが入ったら停止
        Off(OUT_BC);
        SendRemoteNumber(CONN,MAILBOX1,SIGNALON );    //信号を送る
         while (true){
		ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間

 		if (msg == SIGNALOFF ){         //信号を受け取ったら左旋回する
          if (msg == SIGNALOFF ){         //信号を受け取ったら左旋回する
     			turn_leftC;
    			Wait(1600);
         		Off(OUT_BC);
	 
 	go_forward;                   //前進
 	Wait(1000);
 	Off(OUT_BC);
 	
  	SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 );   //腕を動かすために信号を送る
  	

	 	if (msg == SIGNALOFF2 ){         //信号を受け取ったら左旋回し、停止
 			
     			turn_leftC;
    			Wait(1000);
         		Off(OUT_BC);
     }else {                         //それ以外では停止したまま
      Off(OUT_BC);
     }
    }
   }
  }
                        Off(OUT_BC);
        go_forward;                   //前進
        Wait(1000);
        Off(OUT_BC);
        SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 );   //腕を動かすために信号を送る
        if (msg == SIGNALOFF2 ){         //信号を受け取ったら左旋回し、停止 
                        turn_leftC;
                        Wait(1000);
                        Off(OUT_BC);
           }else {                         //それ以外では停止したまま
           Off(OUT_BC);
           }
          }
        }
       }
 
*感想・反省 [#zc1b1991]
 結果としては本番では、ゴール地点でコップを離せなかったので、得点は技術点2点でした。
 今回の課題に対する反省点はロボットの説明で示した通りです。
改善する点としては二つのNXTを一つにするのではなくコップを集める機体とコップを積み上げる機体の二つを作成し土台部分は説明書の基本的な構造にするとよかったのではないかと考えられました。
こうすることによってライントレースによる安定したコップの収集が可能になり、もっと高い得点が得られたのではないのでないかと考えられました。

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