2013b/Member

MISSION

  • 2台のロボットで空き缶を収集し、ゴールに空き缶になるべく高く積み上げる

基本ルール

  • 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
  • 図の左下の隅からスタートする。ロボットが紙からはみ出ない範囲で可能な限りに隅に配置する。
  • 空き缶を集めて図の「ゴール」と書かれた円弧と直線で囲まれる領域に空き缶を運ぶ
  • なるべく高く空き缶を積み上げる
  • 運び終わった後、あるいは積み上げた後はロボットはゴールの領域から外に出ること。また空き缶と接触していたはいけない。
  • 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
  • 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
  • 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 route.JPG

ロボットの説明

  • 戦略 二台のロボットを駆使して、缶を集めるロボットと缶を積むロボットに役割を分担する。

route2.jpg

積み上げロボットが青のルートで缶を一つ持ってゴールで待機し、缶を運ぶロボットが赤のルートで缶を一つだけゴールに運ぶ

積み上げロボット

IMG_0696.JPG 缶を縦に二個掴みタイヤで押さえつける。 IMG_0698.JPG この二つのタイヤで缶を持ち上げる。 IMG_0689.JPG

モーターの出力が3つしかないため、直進しかできなくなりました。

収集ロボット

IMG_0687.JPG IMG_0693.JPG シンプルです。積むロボットとの関係上、缶一つだけしか運べないようにしました。

メンバー

  • yunagi 積み上げロボの制作
  • uirin 空き缶収集ロボの制作とプログラミング
  • mato 積み上げロボのプログラミング 私です
  • ryois 空き缶収集ロボの制作とプログラミング

プログラム

缶を積むロボット

定義

#define THRESHOLD 50 //閾値
#define HIPOWER 2 //高速
#define LOWPOWER 1 //低速
#define set_power_H SetPower(OUT_AC,HIPOWER); //ACを高速で動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER); //ACを低速で動かす
#define go_forward(t) set_power_H; OnFwd(OUT_A); Wait(t); Off(OUT_A); //前進
#define go_back(t) set_power_L; OnRev(OUT_A); Wait(t); Off(OUT_A); //後進
#define can_hold(t)set_power_L; OnFwd(OUT_C); Wait(t);  //缶を掴む
#define can_up(t) set_power_L; OnFwd(OUT_B); Wait(t); Off(OUT_B); //缶を持ち上げる
#define can_down(t) set_power_L; OnRev(OUT_B); Wait(t); Off(OUT_B); //缶を下ろす
#define can_rerease(t) set_power_L; OnRev(OUT_C); Wait(t); Off(OUT_C); //缶を離す

サブルーチン(缶を積む)

 sub can_stack()
{    
   can_hold(100);
    go_back(30);
   go_forward(50);
   can_up(700);
   go_forward(200);
   can_down(200);
   can_rerease(60);
   go_back(1000);  
   
  }

メインのプログラム

task main()
{
 SetSensor(SENSOR_2, SENSOR_LIGHT);
       go_forward(600);
       Wait(3000); //缶を集めるロボットがいなくなるのを待つ。
       can_stack();
     }

缶を運ぶロボット

定義

#define THRESHOLD 40 //閾値
#define HIPOWER 3 //高速
#define LOWPOWER 2 //低速
#define set_power_H SetPower(OUT_AC,HIPOWER); //ACを高速で動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER); //ACを低速で動かす
#define go_forward set_power_H; OnFwd(OUT_AC); //前進
#define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左折
#define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右旋回
#define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右折
#define time0 800
#define time1 700
#define time3 4000

サブルーチン

  • 最初にライントレースをするためにターンする
    sub turn1() {  OnFwd(OUT_A); Wait(250); Off(OUT_A); }
  • 一個目の空き缶にまでいくためのプログラム
   sub line1() { 
             if (SENSOR_2 < THRESHOLD -5) { turn_right1; }
        else if (SENSOR_2 < THRESHOLD -3) { turn_right0; } 
        else if (SENSOR_2 < THRESHOLD +3) { go_forward; }
        else if (SENSOR_2 < THRESHOLD +5) { turn_left0; }
        else                              { turn_left1; } }
  • 小回りの精度をあげたライントレースのプログラム
   sub line2() {
             if (SENSOR_2 < THRESHOLD +0) { turn_right1; }
        else if (SENSOR_2 < THRESHOLD +3) { turn_right0; } 
        else if (SENSOR_2 < THRESHOLD +5) { go_forward; }
        else if (SENSOR_2 < THRESHOLD +7) { turn_left0; }
        else                              { turn_left1; }  }
  • 一個目の空き缶を運んだあとのプログラム
   sub uturn() { OnRev(OUT_AC); Wait(150); OnFwd(OUT_A); OnRev(OUT_C); Wait(100);} 
  • ラインの左側を通り、空き缶を回収するプログラム
   sub line3() {  
             if (SENSOR_2 < THRESHOLD +0) { turn_left1; }
        else if (SENSOR_2 < THRESHOLD +3) { turn_left0; } 
        else if (SENSOR_2 < THRESHOLD +5) { go_forward; }
        else if (SENSOR_2 < THRESHOLD +7) { turn_right0; }
        else                              { turn_right1; }  }

メインのプログラム

   task main ()
   {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     turn1();                                           //最初にターン
     ClearTimer(0);                                     
     while (FastTimer(0) <= time0) { line1(); }         //time0が終わるまでline1を実行
     ClearTimer(0);
     while (FastTimer(0) <= time1) { line2(); }         //time1が終わるまでline2を実行
     uturn();                                           //空き缶を運び終わり、Uターン
     ClearTimer(0);
     while (FastTimer(0) <= time3) { line3(); }         //time3が終わるまでline3を実行
     OnRev(OUT_AC); Wait(150);             //空き缶を置いて後退   
     Off(OUT_AC);   
   }

感想

 はじめは缶を掴み、そのアームごと持ち上げて積むロボットを作ったが、モーターが重すぎて持ち上げることができなかったため、断念せざるを得なかった。ロボットの製作に時間がかかってしまい、プログラミングがお粗末なものになってしまった。本来ならば、二台のロボットが通信して缶を積みたかった。ロボコン本番では収集ロボットがうまく動いてくれず残念ではあったが、積み上げロボットだけで15点を獲得できたのは嬉しかった。機械ロボット学系としてこの授業を受けることができたのは、近い将来にきっと役に立つと思う。


添付ファイル: fileroute2.jpg 179件 [詳細] fileIMG_0693.JPG 174件 [詳細] fileIMG_0687.JPG 168件 [詳細] fileIMG_0689.JPG 186件 [詳細] fileIMG_0698.JPG 164件 [詳細] fileIMG_0696.JPG 165件 [詳細] fileroute.JPG 176件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-02-06 (木) 18:04:21