概要
超音波センサHC-SR04は、超音波の反射時間を利用して非接触で距離を測定することができる距離センサです。このHC-SR04を使ってArduinoで距離を測定する方法についてコードのサンプルを交えて解説します。
超音波センサHC-SR04
音波センサHC-SR04はこのような外観をしています。丸い網がけの部分が超音波を送受信する部分です。
左側の「T 」がついている方がトランスミッター(Transmitter)で、超音波を発することができます。右側の「R」がついている方がレシーバー(Receiver)で、超音波を受信することができます。
超音波の性質と注意点
人間の聞くことのできる音波は20Hz〜20KHzの周波数の領域とされており、その範囲外の周波数の音を超音波と呼びます。
いくつか超音波の特徴はありますが、距離測定において需要な性質は下記です。
指向性
超音波はまっすぐ飛びます。これを利用して物体に超音波が物体に反射して戻ってくる時間を計測することで距離を測定します。(ToF = Time of Flight型の距離センサー)
そのため、反射面が音を拡散しやすい、吸収しやすい材質だとうまく測定できなくなってしまう点に注意です。
温度の影響を受ける
超音波は音ですので、空気中を伝わる速度は一般的な音速の式に従います。
反射した超音波が戻ってくるまでの時間をもとに距離を測っているので、音速が変化するということは、周りの気温によって距離の値に誤差が生じるということになりますので、計算式を作る際は気温も考慮できるとより正確な距離を計測することが可能になります。
音速の簡易計算ツールはこちら
https://rb-station.com/blogs/tool/calculate-speed-of-sound
Arduinoで距離計測
では、ArduinoとHC-SR04を用いて、物体との距離を測っていきましょう。配線は次図のように繋ぎましょう。
- Vcc: 5V
- Gnd: GND
- Trig: 3番ピン
- Echo: 2番ピン
続いて、Arduinoで距離を計測するサンプルは次の通りです。
int TRIG = 3; int ECHO = 2; double duration = 0; double distance = 0; double speed_of_sound = 331.5 + 0.6 * 25; // 25℃の気温の想定 void setup() { Serial.begin( 9600 ); pinMode(ECHO, INPUT ); pinMode(TRIG, OUTPUT ); } void loop() { digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite( TRIG, HIGH ); delayMicroseconds( 10 ); digitalWrite( TRIG, LOW ); duration = pulseIn( ECHO, HIGH ); // 往復にかかった時間が返却される[マイクロ秒] if (duration > 0) { duration = duration / 2; // 往路にかかった時間 distance = duration * speed_of_sound * 100 / 1000000; Serial.print("Distance:"); Serial.print(distance); Serial.println(" cm"); } delay(200); }
シリアルモニタで確認すると、上記のように物体までの距離が出力されているのがわかります。
コードの解説
- Trigピンは10μ秒Highにすると、超音波パルス(40kHz)が発信されるため、delayMicroseconds( 10 )で、TrigピンをHIGHにしてから10μ秒待ち、TrigピンをLOWにしています。
- すると、EchoピンがHIGHになって、超音波を受信するとLOWになりますので、その時間をpulseInで取得します。
関連商品
pulseInを使いたくない場合
pulseInは実行中に他の処理が止まってしまうので、他の処理を止めたくない場合は下記記事を参考にしてください。