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