各モータ系の関数(foward()など)が-1を返してきたときには,一度ロボットを停止し,全センサをチェックして,その結果次第で次の動作を決定するような判断ルーチンを作成せよ.
これは,右手法と呼ばれる迷路をとくための判断ルーチンである.右手伝いに壁に右手を付けたまま進めば,いずれ迷路のゴールにたどり着くことを利用している.
課題10で使用したchechSensor()の返値を使用して,次のようにmain関数に判断ルーチンを作成すればよい.(switch文の説明)
void main(void) { 初期化部分 for(;;) { センサ結果=checkSensor(基準値); switch(センサ結果) { case 右センサに反応なしの場合: turnRight(); break; case 前センサに反応なしの場合: followRight(); break; case ほかの状況: その状況に適した行動; break; case ほかの状況: その状況に適した行動; break; case 以下略 ← 考えられるすべての状況に対処しないといけない } } }
壁に接触しないように、より細かい制御のためには、次のように各case内部で、動作結果をちゃんと調べて、失敗したときの対処を行う必要がある。例えば次のような単純な対応ができる。
case 右センサに反応なしの場合: 返値=turnRight(); if(返値==失敗を意味する値) { //turnRight()に失敗したときの対処、例えば次のようにバックさせる back3cm(); } break;
さらに、そこまでする必要はないかもしれないが、もっと細かく制御するためには、距離値を直接確認することも考えられる.
case 行き止まりの場合: 右センサ値 = readSensor(0); //右センサの読み込み 左センサ値 = readSensor(2); //左センサの読み込み if(右の方が壁から遠い) { 右回りで180度回転 } else { 左回りで180度回転 } } break;
readSensor()は,sensor.cの中に用意されている関数で,課題9で使用したreadSensorと同じ動作をする関数である.