【Arduino】超音波距離センサ(HC-SR04)の測定精度を向上(気温考慮)

この記事では、Arduinoと超音波距離センサ(HC-SR04)で対象物までの距離を気温を考慮して測定する方法をソースコード付きで解説します。

超音波距離センサ(HC-SR04)

超音波距離センサ(HC-SR04)は、超音波を用いた距離センサーです。
このセンサーは、2~450cmまでの範囲内にある対象物までの距離を測定できます。
アマゾンで200円で入手できました。
出力した超音波が対象物に跳ね返って戻ってくるまでの時間と音速(超音波の速度)から距離を求めます。

計算式

(対象物までの距離)=(音速)×(出力してから戻ってくるまでの時間÷2)

前回は音速を340m/sで固定しました。

ご参考ページ
参考 【Arduino】超音波距離センサ(HC-SR04)の使い方

しかしながら、実際には気温や湿度などの影響で変化します。
よって、測定精度を上げるにはこれらの変化を反映してやります。
今回は、気温を考慮してArduinoでHC-SR04を使ってみました。

回路構成


赤:5V、黒:GND、黄:8番ピン、緑:9番ピン

使用機器
1 Arduino UNO ×1
2 超音波距離センサ(HC-SR04)×1
3 ブレッドボード ×1
4 ジャンパーワイヤ 数本

※使用した>超音波距離センサ(HC-SR04)

仕様 内容
電源電圧 5V
待機電流 2mA未満
信号出力 0-5V
センサ角度 15度以下
測定可能距離 2cm-450cm
分解能 0.3cm

超音波センサの4本の端子の構成は以下の通りです。
(本体にもラベルが刻まれています)

ラベル 内容
Vcc 電源入力(5V)
Trig 超音波信号を送信
Echo 超音波信号を受信
GND グランド

ソースコード

サンプルプログラムのソースコードです。

int trig = 8; // 出力ピン
int echo = 9; // 入力ピン

void setup() {
  Serial.begin(9600);
  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);
}

void loop() {
  // 超音波の出力終了
  digitalWrite(trig,LOW);
  delayMicroseconds(1);
  // 超音波を出力
  digitalWrite(trig,HIGH);
  delayMicroseconds(11);
  // 超音波を出力終了
  digitalWrite(trig,LOW);
  // 出力した超音波が返って来る時間を計測
  int t = pulseIn(echo,HIGH);
  // 計測した時間と音速(気温を考慮)から反射物までの距離を計算
  float temp = 22.4;    // 気温
  float v = (331.5+0.6*temp)/10000; // 音速
  float distance = v*(t/2); // 距離
  // 計算結果をシリアル通信で出力
  Serial.print(distance);
  Serial.println(" cm");
  delay(500);
}
処理手順
出力ピン(8)で超音波を出力(トリガ端子を10μs以上Highにすると40kHzのパルスを8回送信)
入力ピン(9)で超音波を受信(エコー端子がHIGHになってからLOWに変化するまでの時間=超音波が送信されてから受信するまでの時間[μs]を計測)
以下の式で時間から距離を求めます。
距離[cm] = (音速) × (②で求めた時間[μs]÷2)
音速=331.5 + (0.6×気温) [m/s] = [331.5 + (0.6×気温)]÷10000 [cm/μs] 
※気温の単位は℃
参考ページ
参考 pulseIn関数の使い方

実行結果

サンプルプログラムの実行結果です。

シリアルモニター

19.21 cm
19.14 cm
18.76 cm
18.73 cm

※本当は温度センサーでリアルタイムに読み取った値で音速を逐次計算した方が良いです。

関連記事
1 Arduino入門 基本的な使い方
関連記事

コメント

  1. ひむか より:

    超音波センサーHC-SR04を使ってLCD1602Aに距離を表示させる場合の
    配線図とコードはどうなりますか
    すみません。初心者ですのでよろしくお願いいたします。

    • 管理人 より:

      ※ひむか様
      コメントありがとうございます。
      LCD1602Aを持っていないのでなんとも言えませんが
      本記事ようにHC-SR04を配線した後、LCDを配線して
      LCDに文字を出力するプログラム(lcd.printなど)も追加することになります。

      一般的なLCDの配線と文字出力プログラムは下記事で紹介しています。
      を追加すれば良いかと思います。

      【Arduino】液晶画面(LCD)に文字列を表示
      https://algorithm.joho.info/arduino/lcd/

      • ひむか より:

        返信ありがとうございます。
        HC-SR04とLCD1602A(Elegoo Arduino電子工作キットD同梱品)を使用して
        管理人様の気温考慮コードを織り込み試行錯誤しながら
        下記コードで正常に作動しました。
        //気温考慮 距離LCD表示 OK 2018.9.18
        #include
        LiquidCrystal lcd( 4, 6, 10, 11, 12, 13 );
        int trig = 2; // 出力ピン
        int echo = 3; // 入力ピン
        void setup() {
        Serial.begin(9600);
        pinMode(trig,OUTPUT);
        pinMode(echo,INPUT);
        }
        void loop() {
        digitalWrite(trig,HIGH);
        delayMicroseconds(11);
        digitalWrite(trig,LOW);
        // 出力した超音波が返って来る時間を計測
        int t = pulseIn(echo,HIGH);
        // 計測した時間と音速から反射物までの距離を計算
        float temp = 25; // 気温
        float v = (331.5+0.6*temp)/10000; // 音速
        float distance = v*(t/2); // 距離
        // 計算結果をシリアル通信で出力
        lcd.begin( 16, 2 );
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(“distance”);
        lcd.print(distance);
        lcd.print(“cm”);
        delay(500);
        }
        さらに、温度センサー(thermistor:Elegoo Arduino電子工作キット)を取り込み、lcd表示がパラパラ変わるのではなく
        過去数秒間(例えば2秒間)の平均値を表示させる場合の場合はどうなりますか?
        それから、7セグメント4桁表示器(SH5461AS 上下6pin 脚付き:Elegoo Arduino電子工作キット)に距離表示させる場合はどうなりますか?

        • 管理人 より:

          ※にひむか様
          こちらこそ、ソースコード付きでご報告いただき感謝です。
          正常に動作してこちらも嬉しいです。

      • ひむか より:

        泡立つ液面までの距離を測定するにはこのHC-SR04は誤差が大きいというか
        正常値とかけ離れた数値を交互に表示します。
        泡立つ液面までの距離を正確に測るセンサーをご存じありませんか?

  2. ひむか より:

    ありがとうございます。精度を上げる方法のちほどやってみなす。
    ところで超音波距離センサに温度センサー(thermistor)を追加して
    温度変化仁対応した距離表示をおこなうコードを検討中です。
    距離だけ表示する場合のコードはどうなりまsうか
    1602Aに二段表示で距離(DISTANCE)表示が上で、下段に気温表示
    が可能ですか。