wait()の内部にプログラムを追加して次のような機能を追加せよ.また,次のように引数を増やして,センサーを利用する場合と,しない場合を切替えられるようにせよ.
int wait(int msec, int sensor_thold);
このsensor_tholdには,0から1023を入れることとする.この値はセンサーの基準値で,この基準値よりも大きいときにセンサーが「反応」したものとみなす.センサー値の範囲は0から250〜300程度(ロボットによって違う)なので,0だと必ずセンサーが反応し,1024以上(実際は300以上)だとまったくセンサが反応しなくなることを意味する.
waitの引数を追加したので,waitの呼出方法も変更になる点に注意.
wait(300); → wait(300, 200); //センサーチェックを200でする場合 → wait(300, 1024); //しない場合
このようなフラグは,プログラムを読むひとにはわかりづらいので,次のように定数を使用する.
#define SENSOR_NEAR 200 #define SENSOR_NOCHECK 1024 (中略) wait(300, SENSOR_NEAR); //またはwait(300, SENSOR_NO_CHECK);
wait関数の本体も次のように書き換える
int wait(int msec, int sensor_thold){ ※5ミリ秒に一回実行される部分 { ※ここでセンサーの読み込み そして,読み込んだ値を判定すること センサーに反応あり → return -1; センサーに反応なし → そのまま続行 指定時間が経過したかどうかのチェック(前回作成した部分) 経過していたらbreak; } return 0; //センサーに反応なしのまま,指定待ち時間が経過した時だけ,ここまで到達 }
停止状態から加速して無限に直進し続けるプログラムを書き,それにセンサを読み込むルーチンを追加せよ.直進し続けながら,センサに反応があれば1秒間停止し,その後再び直線するようにせよ.また,waitと同様にforward()を次のように書き換え,センサーの基準値を指定できるようにしておくこと.
int forward(int msec, int sensor_thold);
センサの反応には個体差がある.ACアダプタ動作時に(電源とは反応が違う)自分の班のロボット用にきっちり調整し,迷路用の壁(白アクリル板)の手前5cmきっかりに停止するようにしてみよ.