概要

超音波センサHC-SR04は、超音波の反射時間を利用して非接触で距離を測定することができる距離センサです。このHC-SR04を使ってArduinoで距離を測定する方法についてコードのサンプルを交えて解説します。

超音波センサHC-SR04

https://rb-station.com/products/%E8%B6%85%E9%9F%B3%E6%B3%A2%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-hc-sr04

 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を用いて、物体との距離を測っていきましょう。配線は次図のように繋ぎましょう。

HC-SR04とArduinoの接続

  • 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で取得します。

関連商品 

https://rb-station.com/products/%E8%B6%85%E9%9F%B3%E6%B3%A2%E8%B7%9D%E9%9B%A2%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-hc-sr04-%E3%83%96%E3%83%A9%E3%82%B1%E3%83%83%E3%83%88-%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%91%E7%B7%9A%E3%82%BB%E3%83%83%E3%83%88

pulseInを使いたくない場合

pulseInは実行中に他の処理が止まってしまうので、他の処理を止めたくない場合は下記記事を参考にしてください。

https://rb-station.com/blogs/article/arduino-pulsein

Arduino超音波センサ

Related Posts

ROSのPythonで他のサービスが立ち上がるまで待つ方法
ROSのPythonで他のサービスが立ち上がるまで待つ方法
ROSでパッケージを作成する時に他のサービスが発行するトピックに依存している時など、他のサービスが立ち上がるまで待つ必要がある時があります。 その場合、wait_for_service()関数を使用することで実現できます。この関数は、...
Read More
ROSのLaserScanデータの一定角度の範囲を無視する方法
ROSのLaserScanデータの一定角度の範囲を無視する方法
ROSでLidarセンサーを使う時、ロボットの車体など一定角度の範囲に常に障害物があり、これを無視したい時があると思いますが、その方法を紹介します。 以下は、得られた/scan_rawトピックのデータの一定角度の範囲を無視して新しい/...
Read More
ROSのmove_baseで、Pythonからコストマップをクリアする方法
ROSのmove_baseで、Pythonからコストマップをクリアする方法
move_baseを使っていると、障害物が無いのにコストマップで障害物判定されてしまうことがあります。そのようなときは、コストマップを一度クリアしましょう。 コマンドから   move_baseノードには、コストマップをクリアする方法...
Read More