HC-SR04が未検知状態で異常動作する

未検知状態はエコーが返ってこない状態を指す。

室内では周辺のものがあるためエコーが返るため正常動作するが、
室外(見通し)だと室内同様に検知できなかった。
未検知状態では回路の違いにより、正常・異常動作するものがある事が分かった。注意する事。 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);
    
  }  
}

備考