前回作成した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の字型になるようなものを作成してみよ。
各自,次の様式でレポート作成し,次の次の実験中に提出すること