🌏

電子工作 その14(超音波センサー:HC-SR04の使い方)

2023/08/24に公開

こんにちは、Ideagearの鈴木陽介です。

今回は、Arduino Unoを用いた超音波センサー(HC-SR04)の使い方についてご説明します。

本記事は、記録として残すことが目的の手抜き記事ですが、日本語の参考資料としてご活用ください。

はじめに

HC-SR04については、弊社が現在手掛けている案件で活躍中ですが、そちらは基本同僚に任せており、私自身はほとんど使っていません。

ただ、その形状から人間や動物の眼のように見えることで、ロボットの目のような使い方ができるため、電子工作の世界では一般的によく使われるセンサーです。特に、ラジコンカーのようなものに搭載し、距離を測定しながら走行させるといった使い方が多いです。

このセンサーは、主に置き型の機器に取り付ける赤外線系の人感センサーと比べて目立ちますが、逆にあえて目立たせる意味で使われることが多いです。

参考記事

英語ですが、Random Nerd Tutorialsの記述がきれいにまとまっているので活用させてもらいました。

Complete Guide for Ultrasonic Sensor HC-SR04 with Arduino
https://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/

原理説明

参考記事から引用。


画像引用元:https://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/

補足しますと、右目が送信側、左目が受信側となっており、右目から送信した超音波が物体へぶつかり、跳ね返ったのを左目で受信することで距離を測定します。

ピン配置

参考記事から引用。


画像引用元:https://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/

ブレッドボード図

同じく参考記事から引用。


画像引用元:https://randomnerdtutorials.com/complete-guide-for-ultrasonic-sensor-hc-sr04/

下記は、実際にArduino Unoと配線した時の様子です。

ライブラリー

なんと、不要!

ソースコード

参考記事からそのまま拝借。

/*
 * created by Rui Santos, https://randomnerdtutorials.com
 * 
 * Complete Guide for Ultrasonic Sensor HC-SR04
 *
    Ultrasonic sensor Pins:
        VCC: +5VDC
        Trig : Trigger (INPUT) - Pin11
        Echo: Echo (OUTPUT) - Pin 12
        GND: GND
 */
 
int trigPin = 11;    // Trigger
int echoPin = 12;    // Echo
long duration, cm, inches;
 
void setup() {
  //Serial Port begin
  Serial.begin (9600);
  //Define inputs and outputs
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop() {
  // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
  // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
 
  // Convert the time into a distance
  cm = (duration/2) / 29.1;     // Divide by 29.1 or multiply by 0.0343
  inches = (duration/2) / 74;   // Divide by 74 or multiply by 0.0135
  
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  
  delay(250);
}

テスト

Arduino IDEのシリアルモニタを開いて値の変化を確認します。
インチ(in)とセンチメートル(cm)の両方の値が見て取れます。
https://twitter.com/Ideaport_Suzuky/status/1694685663847989629

おまけ

過去の実績動画も併せて共有します。

https://twitter.com/hqbot9/status/1694691298991874093
今は無き華強北国際創客中心で撮影された自動走行カーの動画です。HC-SR04により物体との距離を測り、壁や障害物を自動で避けて移動しています。(撮影日:2020年9月28日)

https://twitter.com/Ideaport_Suzuky/status/1566799725067526144
こちらは別の超音波距離センサーであるSeeed StudioのGrove Ultrasonic Rangerを使っています。(撮影日:2022年9月5日)

まとめ

いかがでしたでしょうか?

HC-SR04の配線はわずか4本で、しかもArduinoのライブラリーすら要らないというスーパーイージーなセンサーです。

欠点は、センサーが物体に対して斜めだと跳ね返った超音波を受信することができず、異常値を検出してしまうことでしょう。たとえば、センサーを部屋の中央に置いて、回転しながら壁との距離を測る場合、壁と斜めになるところ、つまり、角の部分では正常な値を検出できません。

斜め異常の対策としては、演算で算出(異常値を使わずその前後の値を使用する等)するか、過去の実績動画にある自動走行カーのように首振りして複数の角度で検出するか、はたまた別のセンサーと併用するなどの工夫が必要ですね。

それではまた!

Discussion