■課題05■

■必修課題■

前回作成したdriveMotor()とwait()を利用して,次の関数を作成せよ.

ヒント

概略は次のようになる

  int forward(int msec10){
    p1 = モータを前進させる向き
    p3 = モータを前進させる向き
    driveMotor()を使って最高速まで加速

    もしもmsec10が0でないならば
        wait()を使ってある時間一定速度で走る
  もしもmsec10が0ならば
    wait()を繰り返し呼び出して無限ループ(永遠にreturnしなくてよい)
    return 0; //成功
  }
  
  int turnLeft(void){
    stop(); //必ず一度停止してから回転(直前の状態とモータの回転方向が逆になることもあるため)
    p1 = 左に曲がるための回転方向
    p3 = 左に曲がるための回転方向
    driveMotor(右速度,左速度); //停止状態からある速度まで加速
    wait(時間); //ちょうど90度回転する分の時間を待つ
    stop(); //必ず停止して終了
    return 0;
  }

  turnRight()も同様

ある速度には,適当な速度値を入れること.そこを最高速(UPPERLIMIT)にしてしまうと,加速が終わるまでにすでに90度以上回転してしまうので注意.

どの関数も深く考えすぎないこと.簡単!

■必修課題のチェック■

プログラムをROMに焼き込んで,ACアダプタで動作させたときに,ちゃんと8の字で走行できるように調整してみよ.ちょうど90度回転するように調整しないと,8の字にならない.電源接続時とACアダプタでは微妙に電圧が異なるため,回転角度がずれてしまう.ACアダプタ用に調整すること.

	   int dutydata_R; //大域変数
           int dutydata_L; //大域変数

           void main() //組み込み用プログラムなので結果は返さない
           {
	     dutydata_R = LOWERLIMIT; //右モータ停止状態からスタート
             dutydata_L = LOWERLIMIT; //左モータ停止状態からスタート

	     initTimer(); //タイマの初期化
             initMotor(); //モータの初期化
             tabsr = 0x0d; //タイマとモータの起動

             wait(200);

             for(;;)       //無限に8の字走行を繰り返す
             {
               forward(30); //0.3秒間前進
               turnRight();//右90度回転
               forward(30); //0.3秒間前進
               turnRight();//右90度回転
               forward(30); //0.3秒間前進
               turnRight();//右90度回転
               forward(30); //0.3秒間前進
               turnLeft(); //左90度回転
               forward(30); //0.3秒間前進
               turnLeft(); //左90度回転
               forward(30); //0.3秒間前進
               turnLeft(); //左90度回転
               forward(30); //0.3秒間前進
               turnLeft(); //左90度回転
               forward(30); //0.3秒間前進
               turnRight();//右90度回転
             }
          }
         

■応用課題■

8の字走行した後に180度回転して逆に8の字をたどらせるなど,もっと複雑な動きをさせてみよ.

また、アナログ数字の8の字型になるようなものを作成してみよ。

■締め切り■

■レポート課題■

各自,次の様式でレポート作成し,次の次の実験中に提出すること