星期四, 2月 23, 2017

HC-SR04 超音波測距模組讀到 0 值後當住的解法

我在使用 Arduino 讀取 HC-SR04 超音波測距模組時, 常會遇到若 pulseIn() 傳回 0 (表示前方無任何障礙物, 所以 timeout) 後, 會有一段無法預期的時間 pulseIn() 都只會傳回 0, 像是 HC-SR04 的 echo 腳位完全沒有作用一樣。有的時候這段時間還超級長, 根本像是整個模組當掉了一樣。

經過搜尋網路上別人的經驗後, 發現這一篇討論串也提到相同的問題, 解決方法就是將 Arduino 原本用來讀取 HC-SR04 的 echo 訊號的腳位先故意設為輸出模式, 並且輸出低電位後一小段時間, 再重新設定回輸入模式, 就可以喚醒 HC-SR04, 或者說是 echo 的功能。

我自己把上述作法寫成以下的程式, 只要 pulseIn() 傳回 0, 我就採取前述對策:

const int echoPin = 11;
const int triggerPin = 12;

unsigned long ping1() {
  unsigned long pulse;

  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pulse = pulseIn(echoPin, HIGH, 50000);

  if(pulse == 0) {
    pinMode(echoPin, OUTPUT);
    digitalWrite(echoPin, LOW);
    delay(100);
    pinMode(echoPin, INPUT);
  }
  
  return pulse;
}


另外, HC-SR04 似乎對供電非常敏感, 我使用的有些 Arduino UNO 板如果只靠 USB 供電, 即使套用上述作法, 仍然無效, 必須外加電源供電, 才會正常, 也提供給大家參考。

沒有留言: