サンプルプログラムをダウンロードとして,分割コンパイルを行えるように整理せよ.モータ駆動関係(タイマとポート含む)の関数のファイルをmotor.c,そのためのヘッダファイルをmotor.hとして作成せよ.
これらで今回新たにプロジェクトを作成する.通常のプロジェクト作成とほとんど同様だが,プロジェクトに追加するC言語のソースファイルがこれまではひとつだけだったが,今回は「main.c」「sensor.c」「motor.c」の3回追加する必要がある.
このプロジェクトが最終プロジェクトとなる.以降,最後までこのプロジェクトを修正して課題をこなせ.ただし,毎週バックアップを必ずとること.途中で動かなくなっても,前の週の段階まではすぐ戻れるようにしておくこと.
#define UPPERLIMIT 0x80 #define LOWERLIMIT 略 #define そのほかの定数 //motor.cの中で使用する定数など void initMotor(void); int driveMotor(int targetR, int targetL); int turnRight(int sensor_thold); そのほか,関数プロトタイプのリスト.motor.cの中にある関数全部について記述
main.cを変更して,停止状態から加速して直進するが,前方センサに反応があったときに180度回転して元に戻るようにせよ.前回使用したreadSensor()は使用せずにsensor.cに含まれるcheckSensor()を使用すること.checkSensorには,センサに反応すればLEDが点灯するようにすでに組み込まれている.
それに加え,前回同様wait()の中で5ミリ秒間隔程度にcheckSensor()で、前方の壁から大体5cm程度で反応するようにcheckSensorの基準値を設定せよ.
180度回転させる関数として次を作成すること.
int turnRound(int sensor_thold); //180度回転
作り方は課題05のturnLeft()とほとんど同じである.ただwaitする秒数をうまく調整して90度でなく180度回転させる点と,前回のforward()と同様に,センサーの基準値を指定できるようにすること.
int checkSensor(int sensor_thold);
checkSensorに渡す引数には,センサの基準値(sensor_thold)を指定する.例えば「150」を指定するように使用するには,次のように書く.
int kekka; kekka = checkSensor(150);
こうすると,センサ値150を基準として,それよりもセンサが大きい値(壁から近い)の時に,「反応あり」とする.右センサ・前センサ・左センサのすべてに対して基準値との比較で反応ありかどうかを調べ,次のLEDを点灯する.
前センサ ● ●課題8で使用 左センサ● ●右センサ
LEDに対応して次のような返値を返し,変数kekkaに格納する.
これは,前方のセンサに障害物を検知した場合ビット1に1をセットし,右センサの場合にビット0,左をビット2とする.すると次のように3ビットで表せる0から7の値で,三つのセンサが反応したかしないかの組み合わせを表現できる.
checkSensorを呼び出した後,得られた返値kekkaを使って,例えば次のように前センサに反応があった時の処理を書くことができる.
if(kekka == 2) { /* 前センサに反応,左右にはなし,の場合にここを実行する */ }