■課題06■

■練習課題■

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きっかりに停止するようにしてみよ.