未検知状態はエコーが返ってこない状態を指す。
室内では周辺のものがあるためエコーが返るため正常動作するが、
室外(見通し)だと室内同様に検知できなかった。
未検知状態では回路の違いにより、正常・異常動作するものがある事が分かった。注意する事。
Ultrasonic distance sensor HC-SR04 lack of timeout problem - #71 by DaveEvans - Sensors - Arduino Forum
左:正常 右:異常
左右センサ共にどこで購入したか不明。今後管理していきたい...。
異常状態
- 異常なものはタイムアウトが機能しない、たまにフリーズする。
- 結果、センサの前に手を置いた場合に距離(赤色)が正しく測定できない事が頻発する。赤色が一定値になるはずだが、10~200cmとばたついている。
- 異常なセンサでは数十ms間隔でサンプリングできないため、品選びに注意する必要がある。

異常。赤色が距離。
正常状態
正常なものは距離(赤色)が常に測定できる。

int Trig = 13;
int Echo = 12;
unsigned long Duration;
float Distance;
unsigned long startMillis,stopMillis,millisPrevious;
unsigned long millisPerRead = 10; //10ms以下は正常に超音波センシングできない
void setup() {
Serial.begin(115200);
delay(10);
pinMode(2, OUTPUT);
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
startMillis = millis();
}
void loop() {
if ( (millis() - millisPrevious) > millisPerRead ) {
millisPrevious = millis();
digitalWrite(Trig,LOW);
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
Duration = pulseIn(Echo,HIGH,millisPerRead*1000); // ★340m/s x 0.007s x 0.5 ≒ 110cm
if(Duration==0){
Distance = 200;
}
else if (Duration>0) {
Distance = (Duration/2.0)*340*100/1000000; // ultrasonic speed is 340m/s = 34000cm/s = 0.034cm/us
}
Serial.print(millis() - millisPrevious);
Serial.print(",");
Serial.println(Distance);
}
}
備考
- SRF05も購入したため試す。
- SR04は公式Documentには60ms/triggerと記載がある。今10msにしているが大丈夫か?
- 別のセンサを試すならVL53L0Xは20msで動作できている。 HIGH_SPEED with VL53L0X? - #6 by paynterf - Sensors - Pololu Forum