2017年9月1日金曜日

HC-SR04で距離測定

●モジュール


PINは電源+-とTrigとEchoの4つ
TrigをHIGHからLOWに変化させると測定用の音波が出力される。
Echoに音波の往復に掛かった時間と同じだけHIGHが出力される。


●プログラムコード
/* HC-SR04モジュール設定 */
#define SONIC_TRIG 7
#define SONIC_ECHO 6

void initUltraSonic() {
  pinMode(SONIC_TRIG, OUTPUT);
  pinMode(SONIC_ECHO, INPUT);
}
/*
 * 超音波距離測定
 * 音速340m/s@室温20度固定
 * 測定可能距離:2cm〜400cm
 * 失敗時:0
 */
double measureUltraSonic() {

  // Trigに10マイクロ秒 HIGH出力
  digitalWrite(SONIC_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(SONIC_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(SONIC_TRIG, LOW);

  // EchoがHIGHからLOWになる時間(マイクロ秒)を取得
  // TIMEOUT  : 測定距離 × 往復 × 1cm当たりの音波の時間(マイクロ秒) + Trigの時間
  //  23920μ : 400cm * 2 * 29.4 + 400
  double duration = pulseIn(SONIC_ECHO, HIGH, 23920);

  // 往復時間と音速から距離算出
  // 距離 = 時間 / 2 * 29.4
  return duration / 58.8;
}

/* 
 * 距離測定
 */
double measureRange() {
  
  double wk_range = 0, wk;
  int count = 0;
  
  for(int i = 0; i < 10; i++) {
    if (i > 0) delay(60); // MaxRepeat 60ms
    wk = measureUltraSonic();
    if (wk) {
      wk_range += wk;
      count++;
      if (count > 2) break;
    }
  }
  if (count == 0) {
    return 0;
  }
  return wk_range / count;
}

void setup() {

  // 距離測定初期化
  initUltraSonic();

  Serial.begin(115200);
}

void loop() {

  double wk_range = measureRange();
  if (!wk_range) {
    Serial.println(F(" 測定失敗"));
  } else {
    Serial.print(wk_range);
    Serial.println(F(" cm"));
  }

  Serial.flush();

  delay(500);

}
※9/2 複数回呼び出しのdelayが60msではなく、60μsになっていたので修正

0 件のコメント:

コメントを投稿