2017a/Member

目次

課題について

詳しくは課題3を参照。

ロボット

まず、ロボット製作に当たって「缶を見つけて積み上げ、それをゴールまで運べるロボット」を目標とした。

全体概要

ロボット概要

写真のように、二台のNXTを連携させて一台のロボットを動かすようにした。缶を持ち上げるためのアームは前方につけなくてはいけないため、ロボットの前後バランスがとれるように、NXT本体は後方に設置し、おもりとして利用した。また、下の写真のように後輪となるキャスターを2個つけることにより、一輪にかかる負荷を軽減し、かつ、方向転換時に左右に重心がぶれてもしっかりと支えられるようにし、安定した走行を実現した。

後輪

アーム全体

アーム概要

写真の赤い線で囲まれている部分がアーム全体であり、その中で緑の線で囲まれている部分は缶をつかむための機構である。

アーム後部

アームを上下させるための動力はアーム後部に取り付けられているモータである。上の写真で示されているモータ△ら歯車で動力を伝え、アーム全体をシーソーのように動くようにした。また、モータ,篌命燭任聾切れているタイヤなどは、アームの反対側と釣り合いをとり、アームが自身やつかんだ缶の重さで自然に上下することを防ぐためにおもりとして取り付けたものだ。

平行四辺形

また、この写真に示されているように、缶をつかむ部分と平行四辺形になるようにつなげることにより、缶をつかむ部分が常に地面と垂直を保ったまま動くようにした。

缶をつかむ機構

缶をつかむ機構

写真のように、モータと歯車を使って左右のパーツを連動させて、缶をつかめるようにした。さらに、そのパーツから上方に部品をつなげる事により、積み上げた際に上の缶も下の缶もしっかりつかめるようにした。

センサー

センサー

センサーは、ライントレース用に光センサーを、缶の発見と距離の計測のために超音波センサーを、それぞれ一つずつ装備した。場所は、写真のように、アームを下げたときに、缶をつかむ部分と土台部分との間にできたスペースを利用した。写真を見て分かるようにアームを下げた状態だと、超音波センサーの目前に缶をつかむ部分が来てしまい、センサーの視界をふさいでしまうので、走行時は常にアームを上げておく必要が生じた。また、センサーが缶を認識するための補助として、ロボット本体から前方に、二本のレールのようなパーツを伸ばし、缶がセンサーの前に来るように誘導する工夫もした。これにより、確実に缶をつかむことが可能となった。

作戦

作戦

上図の赤線のコースをライントレースで進み、その途中で緑の円で示された二つの缶を回収して積み重ね、ゴールまで運ぶようにした。

プログラム

マスター側には左右の車輪用のモータと二つのセンサーをつなげ、ライントレースと缶の発見と距離の調整を担当させた。スレーブ側には、アームを上下させるモーターと缶をつかむ機構のモーターをつなぎ、マスターの指示に合わせたアーム全般の動作を担当させた。

マスター側

Bが右タイヤのモータ、Cが左タイヤのモータ

#define THRESHOLD 50    //しきい値
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define go_forward  OnRL(SPEED, SPEED);    //前進
#define go_back OnRL(-SPEED,-SPEED);    //後退
#define turn_left1  OnRL(SPEED, -SPEED);    //左旋回
#define turn_left0  OnRL(SPEED, 0);    //左折
#define turn_right0 OnRL(0, SPEED);    //右折
#define turn_right1 OnRL(-SPEED, SPEED);    //右旋回
#define SPEED 45 

task main()
{
    SetSensorLight(S3);    //端子3に光センサー
    SetSensorLowspeed(S1);    //端子1に超音波センサー
    until(BluetoothStatus(1)==NO_ERR);    //スレーブ側と接続できるまで待つ
    int nKan=0;    //缶を認識した回数
    while (nKan < 2) {    //缶を2個回収する間の動作
     while(SensorUS(S1)>15){     //缶との距離15センチ以上の時にはライントレースする
      if (SENSOR_3 < THRESHOLD-10) {
       turn_left1;
      }
      else {
       if (SENSOR_3 < THRESHOLD-5) {
        turn_left0;
       }
       else if (SENSOR_3 < THRESHOLD+5) {
        go_forward;
       }
       else if (SENSOR_3 < THRESHOLD+10) {
        turn_right0;
       }
       else {
        turn_right1;
       }
      }
      Wait(1);
     }
     until(SensorUS(S1)<=12){    //センサーと缶との間の距離が12センチ(アームが缶をつかめる少し手前の距離)以下になるまで
      go_forward;
     }
     if (SensorUS(S1)<=12){    //センサーと缶との間の距離が12センチ以下の時
      Off(OUT_BC);
      RemoteStartProgram(1,"sss1.rxe");    //スレーブ側に缶をつかんで持ち上げるプログラムの起動を指示
      Wait(2000);    //アームを下ろしきるまでの時間稼ぎ
      RotateMotorEx(OUT_BC,45,100,0,true,true);    //缶をつかむための位置調整
      Wait(6000);    //スレーブ側のプログラムが終了するまでの時間稼ぎ
      nKan++;    //カウントを追加
     }
    }
    while(nKan<3){    //缶を2個回収し終えた後の動作
     RotateMotor(OUT_B,-SPEED,200);    //ゴール方向に方向転換
     go_forward;    //ゴール手前まで前進
     Wait(2500);
     Off(OUT_BC);
     RemoteStartProgram(1,"sss2.rxe");    //スレーブ側に缶を置くプログラムの起動を指示
     Wait(5000);    //スレーブ側のプログラムが終了するまでの時間稼ぎ
     go_back;    //ゴールゾーンから離脱
     Wait(3000);
     Off(OUT_BC);
     nKan++;   //プログラムを終了させるためにカウント追加
    }
}

ライントレースは課題2で使ったものから交差点認識機能を取り除いて流用した。ライントレースのみで進むとゴールに缶を置くことは難しいので、あらかじめ回収する缶の個数を「nKan」で設定して、回収し終わるとゴールに向かうようなプログラムを考えた。

スレーブ側

Bが缶をつかむ機構のモーター、Cがアームを上下させるモーター

缶を回収、積み重ねるとき

ファイル名「sss1.nxc」

task main()
{
    RotateMotor(OUT_C,-30,30);     //積み上げる際の落差軽減のためアームを少し下げる
    RotateMotor(OUT_B,30,30);    //缶を掴む機構を開ける,缶を掴んでいた場合はこの時缶をはなす
    RotateMotor(OUT_C,-30,150);    //アームを下げきる
    Wait(2000);    //本体が位置調整をするための時間合わせ
    OnFwd(OUT_B,-30);    //缶を掴む
    Wait(3000);
    Off(OUT_B);
    RotateMotor(OUT_C,50,180);    //アームを上げる
}

ゴールに缶を置くとき

ファイル名「sss2.nxc」

task main()
{
    RotateMotor(OUT_C,-30,180);    //アームを下げる
    RotateMotor(OUT_B,30,90);    //缶を掴む機構を全開にして掴んでいた缶をはなす
}

ロボコン結果

本来の作戦通りに缶を二つ積み、ゴールまで運ぶことができた。さらに、たまたまTに置かれている缶にロボットが触れたので合計得点は12点となり、全体の順位は3位だった。

まとめ

今回の感想

期末テスト明けということもあり、作業時間が少なく大変だった。実はこの作戦はイメージしていたものでは無く、時間が無かったので、マスターとスレーブの連携動作確認のために適当に作ったテストプログラムをロボコン当日に使い物になるように調整して利用したものだった(故にファイル名が適当)。また、ロボコン直前に負荷が多くかかるマスター側の出力が急速に低下したため、電池残量に余裕のあったスレーブ側と、主従関係とプログラムを逆転させるというトラブルも起こった。そんな突貫作業の中、最終的に3位という順位に入れた事は驚きであったが、製作の数日間の苦労が報われたようでもあり、うれしかった。(繰り下げでいただいたシュークリームはとてもおいしかったです。ごちそうさまでした。)

全体の感想

生まれて初めてプログラミングに触れて、とても新鮮な体験だった。想像していたよりも「組み立てる」という感覚が強く、理屈に合うように考えながら作業するのは大変だったが、ロボットがイメージ通りに動作したときは、なんともいえない達成感があった。ロボットの組み立ては、中学ロボコンの経験を生かす事ができたが、一から部品を選別、加工できるわけでは無く、限られた形状と数しか使えないのはかなり不自由に感じた。私は工学部なので、今後の大学生活の中でも社会に出ても、おそらく何らかの形でプログラミングと関わる機会は多いと思う。そのようなときは、この講義で学んだ知識と経験を生かしていきたい。


添付ファイル: file作戦.jpg 71件 [詳細] fileセンサー.jpg 60件 [詳細] fileIMG_2725.JPG 75件 [詳細] fileキャスター.JPG 93件 [詳細] fileロボット.JPG 65件 [詳細] fileモーター.JPG 60件 [詳細] file平行四辺形.JPG 60件 [詳細] fileアーム.JPG 64件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-14 (月) 00:50:28 (737d)