2014a/Member

メンバー

清原 雅司 (kiyo)

須藤 海志 (sudo)

課題

2014a/Mission1

ロボット本体

image1.jpgpic11.jpeg

今まで使っていたドライブベースにセンサーをつけたまんまモーターを単純に接続しました。結果、前方に大きく伸びた形で、カブトムシみたいにになりました。

pic10.jpeg

アームに付いたかごを下ろすことでピンポン玉を取ります。衝撃でアームが壊れないように穴あきの黒くて長いブロックで補強しました。ロボットの動くときにかごの中でピンポン玉が動き回っていましたが、何とかキープできそうだったのでそのままにしました。

プログラム

みんなと同じことをやるのはつまらないと思い、黒い線の縁でトレースするのではなく、 線上でトレースして走るようにプログラミングしました。

結果、交差点でのプログラムが必要ないので割と単純なプログラムになりました。 しかしこれだと交差点のプログラムを入れていないので評価が落ちるのではないか、 と途中で思いましたがこのまま続けることにしました。

#define BLACK 40 // 黒と認識する閾値を"40"とする。
#define turn_right OnFwd(OUT_A);OnRev(OUT_C); // 左のタイヤを前に回し、右のタイヤを後ろに回して右に回転する。
#define turn_left OnFwd(OUT_C);OnRev(OUT_A); // 右のタイヤを前に回し、左のタイヤを後ろに回して左に回転する。
#define right_time 20 // 右に回転する時間を"20"センチ秒にする。
#define down OnRev(OUT_B);Wait(12);Off(OUT_B); // アームを下げる。
#define step1 358 // スタートからピンポン玉をとる直前までの時間を"358"センチ秒とする。
#define step2 2470 // ピンポン球をとった後からシュートする直前までの時間を"2470"センチ秒とする。

sub go() // "進む"というサブルーチンのプログラム。
{
      if (SENSOR_2 < BLACK) {  // SENSOR_2の値が黒の閾値以下であり、黒と認識すれば、
        OnFwd(OUT_AC); // 左右のタイヤの両方を前に回し前に進む。
        }

      else if (SENSOR_2 > BLACK){ // SENSOR_2の値が黒の閾値以上であり、黒でないと認識すれば、
        turn_right; // 右回転を始める。
        ClearTimer(1); // タイマー1を0にする。
        while (FastTimer(1) <= right_time){ // タイマー1が右に回転する時間を数えるまでに、
          if (SENSOR_2 < BLACK){ // SENSOR_2の値が黒の閾値以下であり、黒と認識すれば、
            Wait(15); // 15センチ秒だけさらに回転し、
            Off(OUT_AC);  // 左右のタイヤを止める。
             }
          }
        turn_left; // 黒と認識せずに右に回転する時間をタイマー1が数えたら、
        until (SENSOR_2 < BLACK); // SENSOR_2の値が黒の閾値以下であり、黒と認識するまで待ち、
        Float(OUT_AC);  // 左右のタイヤを浮かしながら止める。
        }
}

sub get() // "ピンポン球をとる"というサブルーチンのプログラム。
{
    Off(OUT_AC);Wait(20); // 左右のタイヤを止め、20センチ秒待つ。
    turn_right;Wait(20); // 右に回転して角度を調整する。
    Off(OUT_AC);Wait(20); // 左右のタイヤを止め、20センチ秒待つ。
    down; // アームを下げてピンポン球をとる。
}

sub shoot() // "ピンポン球をシュートする"というサブルーチンのプログラム。
{
    Off(OUT_AC);Wait(100); // 左右のタイヤを止め、1秒待つ。
    turn_right; // 右に回転してゴールを狙う。
    Wait(55); // 55センチ秒回転する。
    Off(OUT_AC);Wait(100); // 左右のタイヤを止め、1秒待つ。
    OnFwd(OUT_ABC); // 左右のタイヤを前に回し前進しながらアームを上げ始める。
    Wait(11); // 11センチ秒待つ。
    Off(OUT_ABC); // 全てのモーターを止める。
}

task main() // メインのプログラム。
{
    OnFwd(OUT_B);Wait(10);Off(OUT_B); // 初めにアームを上げる。
    SetSensor(SENSOR_2, SENSOR_LIGHT); // 光センサーをSENSOR_2にセットする。
    ClearTimer(0); // タイマー0を0にする。
    while (FastTimer(0) <= step1) { // step1までの間、
      Off(OUT_B); // アームを保持する。
      go(); // "進む"
    }
 
    get();  // "ピンポン球をとる"
 
    ClearTimer(0); // タイマー0を0にする。
    while (FastTimer(0) <= step2) { // step2までの間、
      go(); // "進む"
    }

    shoot(); // "ピンポン球をシュートする"
}

工夫点

  1. 黒い線上では直進すること。➡︎これにより、交差点をそのまま突破する。
  2. 線上から外れたときは、まず右に回転して、それでも線上に乗らなければある程度時間が経ってから左に回転する。⬅︎欠点として右に回転する時間が短いと急な右カーブに対応出来なかった。
  3. step1の時間設定は、ピンポン玉をとるまでに、交差点のような目印がなかったので行った。ロボットの進行途中でアームを下すと、かごの中にピンポン玉が入るように時間を計って設定した。毎回、ピンポン玉を取る場所に大きな誤差はなかった。
  4. step2の時間設定は、ピンポン玉を離した時にピンポン玉がゴールに入るように設定した。step1と同様にちょうどいい角度になるときの時間を計り、設定した。アームが前に長すぎたため、ゴールの交差点のところまで行くと、アームが邪魔だった。

反省

  1. 大きく首を振って黒い道を探すプログラムになったので、ブレが大きくカッコよくなかった。

添付ファイル: filepic10.jpeg 263件 [詳細] filepic11.jpeg 311件 [詳細] fileimage1.jpg 352件 [詳細]

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