HC-SR04ではTrigで超音波を発して、その反射をEchoで取得する。
この仕組みをどうするのか考えていた。
Trig時にmills()のようなもので時刻を取得し、割込みでEchoのRising edgeをとらえてその時の時刻との差を出すのか、と思っていた。
pulseIn()という関数があるようだ。
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2450
HC-SR04の使用チュートリアル
https://www.youtube.com/watch?v=ZejQOX69K5M&index=28&list=WL
http://qiita.com/exabugs/items/088f3f9229674be9e436
でもpulseIn()を使っている。
pulseIn()実施中はpollingのようになるのだろうか。
2m先の対象物の場合、2m/(340m/s)=5.8msecなので、loop()処理内の時間への影響としては小さいとみなせるのかもしれない。
誤解
(追記 2016/07/11)
pulseIn()の動作を誤解していた。
たとえば、パルスの種類(value)をHIGHに指定した場合、pulseIn関数は入力がHIGHに変わると同時に時間の計測を始め、またLOWに戻ったら、そこまでの時間(つまりパルスの長さ)をマイクロ秒単位で返します。
pulseIn()を実行した時、その時間からのHレベルになる時間が得られると思っていた。
そうではなく、上記の説明のように「HレベルになってからLレベルになるまでの時間」ということだった。
HC-SR04の測定もEchoが返った時にそのパルスの幅が距離に比例しているということだった。
タイムアウト
pulseIn(pin, value, timeout)
タイムアウトも指定できるようだ。ESP8266で使う場合、watchdog resetがかからないようにタイムアウトを指定しておくのが良さそうだ。