2005/B7

☆右チーム☆(ブリトニー&かずま)

目次

プログラム 

まずは、

1周して一番明るいところを見つけてそっち向きに止まるプログラム

  • 考え方
最初に変数hikariを用意し、0を入れておき0より大きい光を
受けたらその光の値を代入し、その後も、hikariに入ってる値
より大きければそれを新たに代入するようにさせ、同時にタイ
マーをリセットさせる、あらかじめロボが1周するのにかかる
時間を覚えさせておき、タイマーがその時間になったら停止さ
せる。
そうするとロボは一番明るいところでとまるはず。
はかってみたところ5秒であったのでタイマーに50を入れた。
  • 完成プログラム
     12月2日作成
     作成者/ブリトニー
      int hikari;
     task main ()
     {
       hikari = 0;
        SetSensor(SENSOR_1, SENSOR_LIGHT);
        ClearTimer(0);
        OnFwd(OUT_A);
        OnRev(OUT_C);
      
        while(Timer(0) < 50)
        {
         if(SENSOR_1 > hikari);
         {hikari = SENSOR_1;
          ClearTimer(0);      
         }
          }        
        Off(OUT_A+OUT_C) ;
     }

光チェイスロボット??

// 光チェイスのプログラム??
//
//    作成者:かずま
//    作成日:2005-12-15

#define THRESHOLD 45    // 閾値

task main()
{
    SetSensor(SENSOR_1, SENSOR_LIGHT);    // センサ端子1に接続されたセンサが
                                          // 光センサであると宣言
    while(true)
    {
        if(SENOSR_1 >= THRESHOLD)         // もしロボが光の方を向いていたら
        {
            Off(OUT_A+OUT_C);
            OnFwd(OUT_A+OUT_C);           // 前進する
        }
       
        if(SENSOR_1 < THRESHOLD)          // もしロボが光の方を向いていなかったら
        {
            Off(OUT_A+OUT_C);
            OnFwd(OUT_C);                 // 左回転する
            OnRev(OUT_A);
        }
    }
}

一応これでも追いかけます。でもこれじゃダメなんだろうなぁ…

光チェイスロボット

// 光チェイスのプログラム
//
//    作成者:かずま
//    作成日:2005-12-22

#define AROUND_TIME 500        // ロボが一周するのにかかる時間を定義
#define gosa 10                // 光センサの反応誤差を考慮
#define search_range 20        // サーチの範囲を定義

int light=0;                   // light という整数型の変数を定義
int turn=0;                    // turn という整数型の変数を定義

void turn_right(int t)
{
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(t);
    Off(OUT_A+OUT_C);
}

void turn_left(int t)
{
    OnRev(OUT_A);
    OnFwd(OUT_C);
    Wait(t);
    Off(OUT_A+OUT_C);
}

sub search()                   // 一度光の値を決定した後
{                              // 光を見失ったとき、探し出すためのプログラムをサブルーチンを使って表しておく
    turn=turn + search_range;
    turn_right(turn);
    turn=turn + search_range;
    turn_left(turn);
}

task main()
{
    SetSensor(SENSOR_1, SENSOR_LIGHT);    // センサ端子1に接続されたセンサが
                                          // 光センサであると宣言
 
    ClearTimer(0);    // タイマースタート

    OnFwd(OUT_A);     // ロボは右回転して一番明るいところを探す
    OnRev(OUT_C);

    while(Timer(0)*10 <= AROUND_TIME)    // タイマーの値がロボが一周する時間以下の間
    {
        if(SENSOR_1 > light)             // もしセンサ1がlightの値より大きくなったら
        {
            light=SENSOR_1;              // lightにセンサ1の値を代入し
            ClearTimer(0);               // タイマーを0に戻す
        }

        if(Timer(0)*10 == AROUND_TIME)   // もしタイマーがロボが一周する時間になったら
        {
            Off(OUT_A+OUT_C);            // 右回転をやめる
            Wait(1);                     // このときロボは光の方向を向いている(はず…)
        }
    }
    while(Timer(0)*10 > AROUND_TIME)     //タイマーの値がロボが一周する時間より大きくなったら
    {
        while((light - gosa <= SENSOR_1) && (SENSOR_1 <= light + gosa))    // ロボが光の方向を向いている間は
        {
            turn=0;
            OnFwd(OUT_A+OUT_C);    // 前進する
        }

	 while((SENSOR_1 < light - gosa) || (SENSOR_1 > light + gosa))    // ロボが光を見失ったら
        {
            search();              // searchを開始
        }
    }
}

以前指摘があったところを改良して作りました。

  • searchについて
    searchは一度光の値を決定した後、光を見失った場合探し出す
    ためのプログラムです。上のプログラムの場合、まず0.2秒間
    右回転し、今度は0.4秒間左回転をします。その後、0.6秒間右
    回転をします。つまり0.2秒分ずつ捜索範囲が拡大していくの
    です。このような動作を光が見つかるまで繰り返します。なお
    、捜索範囲は一番上に定義したsearch_rangeの値を変更するこ
    とで、簡単に調節できます。

感想

難しかった点

  • ロボットは簡単だったが、プログラムがメッサ難しかった。
  • タイマーの使い方が難しくてClearTimerを入れ忘れていたところがあった。
  • それからタイマーは0.1秒単位だってトコに注意っすね。

工夫した点

  • searchのプログラム(上のプログラム参照)。
  • 最初の光の値を決めるプログラムがなかなか簡潔にできた。

反省点

  • PlaySoundを使ってプログラムがどこまで正常に動いてるのか調べた方がよかった。

感想

  • プログラムがうまくいかなかったら他の人に見てもらうと結構早く間違いに気づきます “ヘ( ̄∇ ̄ )カモォーン♪

コメントはこちらまで


戻る


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