目次

課題3

ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。

mission3.png

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

ルール

基本ルール

競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

図の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点)

ロボットの説明

今回作ったロボットはこちらです。

image1.jpeg

私たちのグループは二つのロボットに分けるのではなく、一体型のロボットの作った。一つのNXTの本体はタイヤを動かし、前後左右の動きを可能にそして、もう片方のNXTは、アームの部分を動かし、上下の動きを可能にする。二つのNXTはBluetoothで通信している。

アームの機構

アームの機構はこのようになっている。

image2 - コピー.jpeg

ボールをつかむ機構

ボールをとるために、輪ゴムを利用した。ボールを上から二本の輪ゴムで挟み上にあげるというものである。

ボール上げ.png

このようにしてボールをつかんでいき、ボールがお互いに押し合って、上に上がって、溜まっていく。

close.png

溜まっていったボールは、黒い棒の開け閉めによって、ボールをとどめておいたり、出したりできるようにした。

光センサー

センサーの位置は下のようになった

センサー.png

光センサーはタイヤよりも前の位置につけた。当初、光センサーの位置はタイヤよりも後ろについていたが、それだと色の認識の判断が遅れ、ライントレースができるときとできない時があったため、タイヤよりも前につけることにした。

プログラムの説明

今回はNXTを二つ使っているので、片方をマスター、もう一方をスレーブとしてBluetoothで通信している。スレーブ側のプログラムは「アームを上げる」、「アームを下げる」、「扉を開ける」、「扉を閉める」の四つの操作を行う。コースとしては右側のマップのB→C→D→E→F→Gとライントレースをしていき、箱の中のふたつをとり、残りの二つをとるという、作戦である。

スレーブ側のプログラム

アームを上げる

プログラム名はTAI(S1)

task main()
{
  OnRev(OUT_C,50);
  Wait(5000);
  Off(OUT_C);
  SendResponseNumber(MAILBOX1,11);   //マスター側にアームを上げた終わったことを伝える
}

アームを下げる

プログラム名はTAI(S2)

task main()
{
   OnFwd(OUT_C,30);
   Wait(3000);
   Off(OUT_C);
   SendResponseNumber(MAILBOX1,12); //マスター側にアームを下げた終わったことを伝える
}

扉を開ける

プログラム名はTAI(S3)

task main()
{
  OnFwd(OUT_B,30);
  Wait(3000);
  Off(OUT_B);  
  SendResponseNumber(MAILBOX2,13); //マスター側に扉を開けたことを伝える
}

扉を閉める

プログラム名はTAI(S4)

task main()
{
  OnRev(OUT_B,50);
  Wait(5000);
  Off(OUT_B);
  SendResponseNumber(MAILBOX2,14); //マスター側に扉を閉めたことを伝える
}

マスター側のプログラム

定義したマクロ

#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の接続番号

ライントレース

ライントレースのプログラムは以下のようになる。

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); 
}

交差点横断

交差点横断のプログラムは次のようになる。

 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){             //4.6秒以下の間はwhile内を実行する
       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);             
}

アームを上げる

sub arm_up()
{
   int msg;
   until(BluetoothStatus(1)==NO_ERR);        
   RemoteStartProgram(1,"TAI(S1).rxe");           //TAI(S1)を行うようにスレーブ側に命令
   while(msg !=11){
       ReceiveRemoteNumber(MAILBOX1,true,msg);
   }
   Wait(2000);                   //スレーブ側から応答があるまで待機
}

アームを下げる

sub arm_down()
{
   int msg;
   until(BluetoothStatus(1)==NO_ERR);
   RemoteStartProgram(1,"TAI(S2).rxe");      //TAI(S2)を行うようにスレーブ側に命令
   while(msg !=12){
       ReceiveRemoteNumber(MAILBOX1,true,msg);
   }
   Wait(2000);
}

扉を開ける

 sub arm_open()
{
   int msg;
   until(BluetoothStatus(1)==NO_ERR);
   RemoteStartProgram(1,"TAI(S3).rxe");      //TAI(S3)を行うようにスレーブ側に命令
   while(msg !=13){
       ReceiveRemoteNumber(MAILBOX2,true,msg);
   }
   Wait(2000);
}

扉を閉める

sub arm_close()
{
   int msg;
   until(BluetoothStatus(1)==NO_ERR);
   RemoteStartProgram(1,"TAI(S4).rxe");      //TAI(S4)を行うようにスレーブ側に命令
   while(msg !=14){
       ReceiveRemoteNumber(MAILBOX2,true,msg);
   }
   Wait(2000);
}

全体のプログラム

 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();
}

まとめ

発表ではボールを一個もとることができず、悔しい結果となってしまった。電池はとても重要だ。


添付ファイル: fileセンサー.png 204件 [詳細] fileclose.png 207件 [詳細] fileボール上げ.png 251件 [詳細] fileimage2 - コピー.jpeg 119件 [詳細] fileimage1.jpeg 231件 [詳細] filemission3.png 125件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-16 (金) 14:12:41