2019a/Member

目次

課題3について

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

2019a-mission3.png

フィールドの説明

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

基本ルール

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

ロボットの説明

全体像↓

IMG_20190807_054224.jpg

1つのNXTは機体を動かすためのもので,もう1つのNXTはアームを動かすためのものにした.機体を動かすためのモーターが2つ,アームを上下するためのモーターが1つ,アームの開閉をするためのモーターが1つついている,また,機体の後ろのタイヤは2つつけると,動きの邪魔をしてしまうので1つにした.

アームについて

正面から↓

IMG_20190807_054248.jpg

斜め横から↓

IMG_20190807_131625.jpg

歯車を使うことにより,モーターの縦の回転を横の回転に変換することが出来る.アームを下げると下の輪ゴムに引っ掛かりボールを拾えるようになっていて,最大3個まで一度に運ぶことが出来る.また,アームを開くことにより,黒い棒で抑えられていたボールが落ちる

光センサーについて

光センサーを出来るだけ前につけることにより,ライントレースをしやすいようにした.

プログラミングの説明

今回の課題ではNXTを2つ使ったので片方をマスター,もう片方をスレーブとして,Bluetoothを用いて通信する.

定義の説明

光センサーで感知する色を以下のように定義する.

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); //右曲がり
色の定義.png
CONN 1 //Bluetoothの接続

交差点の認識方法

直角の交差点は,カーブに比べて,黒い部分に滞在する時間が長くなるので,その時間差を利用して認識する.直角の交差点で止まり,カーブでは進み続ける時間は0,25秒だった.

line2.png

ライントレース(マスター側)

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

}

交差点の横断(マスター側)

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秒以上経過するまで続ける
       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); //MIALBOX1からメッセージを受け取る
   }
   Wait(2000);

}

アームを上げる(スレーブ側)

sub arm_up_s() {

     OnRev(OUT_C,50);
     Wait(5000);
     Off(OUT_C);
     SendResponseNumber(MAILBOX1,11); //MAILBOX1に11と送る

アームを下げる(マスター側)

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

}

アームを下げる(スレーブ側)

sub arm_down_s() {

     OnFwd(OUT_C,30);
     Wait(3000);
     Off(OUT_C);
     SendResponseNumber(MAILBOX1,12); //MAILBOX1に12と送る

}

アームを開く(マスター側)

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

}

アームを開く(スレーブ側)

sub open_s() {

     OnFwd(OUT_B,30);
     Wait(3000);
     Off(OUT_B);
     SendResponseNumber(MAILBOX2,13); //MAIKBOX2に13と送る

}

アームを閉じる(マスター側)

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

}

アームを閉じる(スレーブ側)

sub close_s() {

     OnRev(OUT_B,50);
     Wait(5000);
     Off(OUT_B);
     SendResponseNumber(MAILBOX2,14); //MAILBOX2に14と送る

全体のプログラミング

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

}

結果

ロボコンではボールを運ぶどころかほとんど起動しないまま終わってしまった.電池切れが原因か.

まとめ・感想

テスト期間に近いこともあり,あまり時間を割けなかったので,あまり良い結果にはならなかった.しかし,この授業を通して,1つのことに集中したり,長い時間をかけたりすることができ,結果はともあれ,良い経験になったと思う.


添付ファイル: fileline2.png 14件 [詳細] file色の定義.png 14件 [詳細] fileIMG_20190807_054224 (1).jpg 10件 [詳細] fileIMG_20190807_131625.jpg 10件 [詳細] fileIMG_20190807_054248.jpg 15件 [詳細] fileIMG_20190807_054224.jpg 11件 [詳細] file2019a-mission3.png 14件 [詳細] file無題.png 6件 [詳細] fileロボティクス入門課題3.png 8件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-14 (水) 23:31:47