2009a/A5/課題2右へ戻る

#define THERESHOLD 40 //闘値
#define KAITEN 180 //180度回転する秒数
int SYOU; //衝突変数――衝突した瞬間を見極める変数
int RUN_TIME; //パックを運ぶ時間――ここに下の変数を代入していく
#define RUN_TIME_F 36; //パックを運ぶ時間(1回目F):36
#define RUN_TIME_J 80; //パックを運ぶ時間(2回目J):80
#define STOP_TIME 1300; //機体を停止させるまでの秒数(3周したら停止する)

task main () //黒のラインを認識して、黒のラインに入るとそこから光学センサーが外れるようなプログラム
{
     SYOU = 0;
     RUN_TIME =  RUN_TIME_F; //パックを運ぶ時間を1回目の値に設定
     SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2はタッチセンサー
     SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1は光学センサー
     SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3は光学センサー
     ClearTimer(1); //タイマー1セット

     while(Timer(1)<STOP_TIME){ //STOP_TIMEで指定した時間まで動作をする
                                  //タッチセンサーが当たってないときの基本動作
          if (SENSOR_1>THERESHOLD){
               if (SENSOR_3>THERESHOLD){ //どちらも黒い線に入っていない場合
                    OnFwd(OUT_A+OUT_C);
               } else {
                    Off(OUT_C);
                    OnFwd(OUT_A);
               }
          } else {
               if (SENSOR_3>THERESHOLD){
                    OnFwd(OUT_C);
                    Off(OUT_A);
               } else { //どちらも黒い線に入った場合
                    OnFwd(OUT_A+OUT_C);
               }
          }

        if (SENSOR_2 == 1 ) { //タッチセンサーが当たっているとき

               if (SYOU == 0){ //衝突した瞬間
                    ClearTimer(0); //タイマーをセット
                    SYOU = 1; //衝突変数に1を代入
               }
               if (SYOU == 1){
                         if (Timer(0) >= RUN_TIME){ //指定した時間経過したら
                              OnFwd(OUT_A);
                              OnRev(OUT_C);
                              Wait(KAITEN); //180度回転(右)
                              OnFwd(OUT_C);
                              OnRev(OUT_A);
                              Wait(KAITEN); //180度回転(左) これで正面を向く
                                        //それと同時にタッチセンサーに物体が当たっていない状態になる
                              SYOU = 0; //衝突変数に0を代入

                              if (RUN_TIME == RUN_TIME_F){ //一度目の衝突かどうかを判定
                                   RUN_TIME = RUN_TIME_J; //一度目なら次に運ぶ時間を二度目のものに設定
                              }else{
                                   RUN_TIME = RUN_TIME_F; //二度目なら次に運ぶ時間を一度目のものに設定
                              }
                         }
               } //ここまでSYOU == 1のときの動作
        } //ここまでタッチセンサーが当たっているときの動作
     } //ここまでwhile間の動作

     Off(OUT_A+OUT_C);//指定された秒数がきたら機体を停止
}


図1
  • 開始位置は上図の通りで、矢印の方向に進んでいきます
  • 黄の四角がロボット、赤の四角が牛乳パックです

    シミュレーション
  • 動作のシミュレーション画像です
  • 牛乳パックは持ち上げることなく、ただ引きずっているだけです

添付ファイル: fileシミュレーション11.gif 162件 [詳細] filerosen2.JPG 181件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-07-03 (金) 16:18:04 (3701d)