SRF-05 は、1cm~4mが検知できるそうです。
(まあ、本当に1cmを検知できるかっていうと、ちょっと疑問ですが・・・)
で、これは超音波センサーなので・・・
当たり前ですが、センサーが超音波を発して、何かに当たって反射して帰ってきた超音波をセンサーが受け取って検知します。
超音波を発してから受け取るまでに掛かった時間を計れば、距離が判る訳です。
ということは、近くに物があれば、すぐに「あったよ」と判断できるのですが・・・物が近くに無い場合は計測に時間が掛かることになります。
レスキューBでは、ロボットは迷路の中に居るので、前や横に壁が無いことは無いハズです。
ただ、いつもは10cm程度の近さにあるけど、数タイルの直線などがあれば100cmくらいの距離になることもあります。
でも、遠く離れた壁までの距離を測る必要はなく・・・
ロボットの居るタイルの前後左右に壁があるかを検知できれば、事足ります。
つまり、1mも2mも測る必要はなく、単に30cm程度を測れれば十分です。
どうもそんな時の為に、pulseIn( ) には、第3のパラメータが用意されています。
timeout(タイムアウト)までの時間で、単位はマイクロ秒です。
例えば、
d = pulseIn( port , HIGH , 2000 ) / 58;
とすれば、超音波を発してから2000マイクロ秒(つまり2ミリ秒)経っても超音波が帰って来なかったら、そこで計測を終わりにします。
そうすると、対象物までの距離が30cm以下の場合は、その距離が返されます。 対処物が30cm以上離れていると、タイムアウトになり 「0」 が返されます。
(つまり、0が返されたら、対象物までの距離が30cm以上であると判断する)
こうすることで、ほんのちょっとだけ処理時間を短縮できるのですが・・・
タイムアウトになったからといって、発した超音波が消えるわけではなく、対象物に当たると、いずれ帰ってきます。 これをセンサーが間違って受けてしまうと、誤計測になってしまいます。
(これを、干渉というのでしょうか!?)
この方法を使う場合は、よく考えて、誤検知が起こらないように考慮する必要がありますねぇ。
ちなみに、音速は 340.29m/s(海面の場合) なので・・・
発した超音波が1m進むのに掛かる時間は、2.939ミリ秒になります。
対象物までの距離が4mの場合は、往復で8mあるので、23.509ミリ秒掛かることになります。
これを速いと見るか、遅いと見るか・・・