戻る

懐中電灯の光に向かって進むプログラム

untilを使ったプログラム

// 12月5日
// コンド
// 機体は課題3のモーターが二つあるタイプの機体をもとに
// 三輪で後ろがキャスターになっている(プログラム:パート1)

int light = 0;
int turn_time = 30;

task main()
{
   SetSensor(SENSOR_2, SENSOR_LIGHT);   // 真ん中のライトセンサー
   ClearTimer(0);                       // タイマー0をリセットする
        
   while(Timer(0) <= turn_time)         // 4秒以内の動き
     {
        if(SENSOR_2 > light)            // センサー2が『light』の光量より多いとき
         {
             light = SENSOR_2;          // 『light』をセンサー2で示した値に置き換える
          }
     
        OnFwd(OUT_A);                   // 左タイヤが正転
        OnRev(OUT_A);                   // 右タイヤが後転

     }
   
   OnFwd(OUT_A);                        // 左タイヤが正転
   OnRev(OUT_A);                        // 右タイヤが後転
   until(SENSOR_2 >= light);            // センサー2の値以上になるまで
   
   while(true)
     {
        if(SENSOR_2 < light)            // センサーが懐中電灯の光から外れたとき
          {
             OnFwd(OUT_A);              // 左タイヤが正転
             OnRev(OUT_C);              // 右タイヤが後転
             until(SENSOR_2 >= light);  // センサーが懐中電灯の光を見るまで
          }
  
        else                            // センサーが懐中電灯の光を見たとき
          {
             OnFwd(OUT_A + OUT_C);      // 前進する
             until(SENSOR_2 < light);   // センサーが懐中電灯から外れるまで
          }
        
    }

}

反省

・懐中電灯の光を探してくるくる回る。
・初めてタイマーを使ってみて、とりあえずうまくいった。

repeatを使ったプログラム

// 12月9日
// コンド
// プログラム:パート2

int light = 0;
int i = 0;
int i_max = 0;

task main()
{
   SetSensor(SENSOR_2, SENSOR_LIGHT);  // 真ん中のライトセンサー
   
   OnFwd(OUT_A);                       // 左タイヤが正転
   OnRev(OUT_C);                       // 右タイヤが後転
   
   repeat(60)                          // 一回転するまで繰り返す
     {
        if(SENSOR_2 > light)           // センサー2が『light』の光量より多いとき
         {
             light = SENSOR_2;         // 『light』をセンサー2で示した値に置き換える
             i_max = i;                // i_maxをiに置き換える
         }
        PlayTone(light*10,5);          // 光量に合わせた音を出す
        Wait(5);                       // 0.05秒待つ
        i++;                           // iを一つ増やす
     }
   
   OnFwd(OUT_C);                       // 左タイヤが正転
   OnRev(OUT_A);                       // 右タイヤが後転
   Wait(i_max*5);                      // 懐中電灯のある方向まで回る(修正しました)
   OnFwd(OUT_A + OUT_C);               // 懐中電灯に向かって進む
   
   while(true)
     {
        if(SENSOR_2 < light)           // センサーが懐中電灯の光から外れたとき
          {
             PlayTone(light*10,100);   // 音を出す
             OnFwd(OUT_A);             // 左タイヤが正転
             OnRev(OUT_C);             // 右タイヤが後転
             until(SENSOR_2 >= light); // センサーが懐中電灯の光を見るまで
          }
  
        else                           // センサーが懐中電灯の光を見たとき
          {
             PlayTone(light*5,100);    // 音を出す
             OnFwd(OUT_A + OUT_C);     // 前進する
             until(SENSOR_2 < light);  // センサーが懐中電灯から外れるまで
          }
        
    }

}

反省

・センサーがひとつだけなのでその分精度が低いのが欠点。
・一つ目と似ているので音を付け足してみました。
  • 光センサーを2つ使うとどのくらい精度が向上するでしょうか? -- 松本(教員)? 2005-12-10 (土) 19:42:31
  • 最も明るい方向まで旋回するのは Wait(i_max); ではなくて Wait(i_max*5); かな? -- 松本(教員)? 2005-12-12 (月) 11:35:39

上の二つの動きの流れ

・最初は一回転して懐中電灯の光をさがす。
・懐中電灯の光に向かって動き出す。
・懐中電灯の光を見失ったら、その場で回転して懐中電灯の光を探す。
・これを繰り返す。

センサーを二つ使った場合のプログラム

// 12月19日
// コンド
// 前半は上の二つのプログラムとほぼ同様で、while以下を作りました

  while(true)
    {
    
       if((SENSOR_1 >= light) && (SENSOR_3 >= light))
 // 両センサーが懐中電灯の光を見ているとき
         {
            OnFwd(OUT_A + OUT_C);        // 両タイヤが正転
            PlaySound(SOUND_FAST_UP);    // ピロピロ〜と速く高くなる音を出す
            until((SENSOR_1 >= light) && (SENSOR_3 >= light));
// センサーが懐中電灯の光を見るまで
         }
       if((SENSOR_1 < light) && (SENSOR_3 >= light))
 // 左センサーが懐中電灯の光から外れたとき
         {
            OnFwd(OUT_C);                // 右タイヤが正転
            OnRev(OUT_A);                // 左タイヤが後転
            PlaySound(SOUND_DOWN);       // ピロピロ〜という低い音を出す
            until((SENSOR_1 >= light) && (SENSOR_3 >= light));
// センサーが懐中電灯の光を見るまで
         }
 
       if((SENSOR_1 >= light) && (SENSOR_3 < light))
  // 右センサーが懐中電灯の光から外れたとき
         {
            OnFwd(OUT_A);                // 左タイヤが正転
            OnRev(OUT_C);                // 右タイヤが後転
            PlaySound(SOUND_UP);         // ピロピロ〜という高い音を出す
            until((SENSOR_1 >= light) && (SENSOR_3 >= light));
// センサーが懐中電灯の光を見るまで
         }

       else  // センサーが懐中電灯の光を見失ったとき
         {
            OnFwd(OUT_A); OnRev(OUT_C);  // 回転する
            PlaySound(SOUND_LOW_BEEP);   // ブーという低い音を出す             
            until((SENSOR_1 >= light) && (SENSOR_3 >= light));
// センサーが懐中電灯の光を見つけるまで
         }
    }

動きの流れ

・一回転して懐中電灯の光を探す。
・懐中電灯の光に向かって進む。
・懐中電灯のずれを修正しながら進む。
・懐中電灯の光を見失ったとき、その場で回転して探す。
  • やはり、センサー二つだと精度が良いのでしょうか。沢山のプログラムお疲れさまです。 -- ゆん(TA)? 2006-02-02 (木) 18:00:35


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