Arduinoで超音波距離センサーを使う方法――HC-SR04の配線から距離計算まで一気に理解する

プログラミング・電子工作






Arduinoで超音波距離センサーを使う方法――HC-SR04の配線から距離計算まで一気に理解する。|YOFUKASI AI




Arduino / 電子工作

Arduinoで超音波距離センサーを使う方法――HC-SR04の配線から距離計算まで一気に理解する。

pulseIn()が何を測っているか、理解して使っていますか。HC-SR04の配線から、距離を求める計算式、測定誤差への対処までを解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約13分

Chapter 01 — Introduction

01HC-SR04はどうやって「距離」を測っているのか

結論から言えば、HC-SR04はセンサー自身が距離を計算しているわけではない。Arduino側がTrigピンにパルスを送って超音波を発射させ、Echoピンから返ってくるパルスの「幅(時間)」をpulseIn()で測定し、そこから音速を使ってArduino側で距離を計算している。この仕組みを理解しておくと、測定値が乱れたときの原因を切り分けやすくなる。

実例として、ArduinoとHC-SR04を使って実際に距離測定を行った検証記事がある。【Arduino】超音波距離センサ(HC-SR04)の使い方(algorithm.joho.info)では、サンプルプログラムを実行した結果として、19.21cm、19.14cm、18.76cm、18.73cmという実測値が得られたことが報告されている。同記事では、この計算において音速を340m/sに固定して計算しており、より高精度な計測には気温などの影響を考慮する必要があると説明されている。

編集部見解:HC-SR04は安価で手軽に使えるセンサーだが、内部で「時間」を計測し、それを人間側が「距離」に変換しているという点を意識しておくと、精度を求める場面での改善方法(気温補正や複数回測定の平均化)にも自然に発展させやすいと考えられる。
― YOFUKASI AI編集部

本記事では、HC-SR04の基本的な配線から、距離を求める計算式の仕組み、そして測定誤差への対処法までを、初心者から中級者を対象に体系的に解説する。なお、素材画像の提供がなかったため、配線は図ではなく手順化されたテキストで示す。



Chapter 02 — Background

02Arduinoにおける超音波距離センサーの基礎知識

HC-SR04は、超音波を発射し、物体に反射して戻ってくるまでの時間から距離を測定するセンサーモジュールである。VCC・Trig・Echo・GNDの4本のピンを持ち、比較的安価で入手しやすいことから、電子工作の入門用センサーとして広く使われている。

用語の整理

  • Trig(トリガー):超音波を発射させるための入力ピン。ここに短いパルスを送ると発射が始まる。
  • Echo(エコー):反射波を受信するまでの時間をパルス幅として出力するピン。
  • pulseIn():指定したピンのパルス幅(マイクロ秒)を測定するArduinoの関数。

Echoピンのパルス幅を測定する際に使うpulseIn()関数は、Arduinoの標準関数として提供されている。公式リファレンスでは、Arduino公式 Language Reference「pulseIn()」において、指定したピンのパルス(HIGHまたはLOW)を読み取る関数であり、値がHIGHの場合はピンがLOWからHIGHになるのを待ってから時間の計測を開始し、ピンがLOWに戻るまでの時間を計測すると定義されている。タイムアウト以内にパルスが完了しなければ0を返す点も定義されている。

HC-SR04は基本的に5V駆動を前提としたセンサーであり、Echoピンの出力電圧も5V振幅になる。3.3V系のマイコンで使う場合は電圧の扱いに注意が必要である。超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説(araisun.com)では、3.3V系マイコンやRaspberry Piでは、5VのEchoを分圧やレベル変換で下げてから入力する必要があると説明されている

センサーを扱う前に、Arduinoの基礎文法をまだ体系的に学んでいない場合は、先に基礎を押さえておくとこの先の理解がスムーズになる。Arduinoのコードの書き方の基礎はこちらの記事で詳しく解説している

Chapter 03 — Mechanism

03距離計算の仕組みと技術的背景

HC-SR04を使った距離測定は、次の3ステップで行われる。

  • Trigピンに10マイクロ秒のHIGHパルスを送り、超音波を発射させる
  • Echoピンのパルス幅をpulseIn()で測定する(超音波が発射されてから戻ってくるまでの往復時間)
  • 測定した時間と音速を使って、片道分の距離を計算する

距離の計算式は、次のようになる。

int trigPin = 8;
int echoPin = 9;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // 10μsのパルスを送信
  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH); // 往復時間(μs)を計測
  float distance = duration * 0.034 / 2;  // 距離(cm)に変換

  Serial.print(distance);
  Serial.println(" cm");
  delay(500);
}

この計算式は複数の解説記事でも共通して紹介されている。【Arduino】超音波距離センサ(HC-SR04)の使い方(algorithm.joho.info)では、距離[cm] = 0.034 × (パルス幅[μs] ÷ 2)という計算式が紹介されており、この記事では音速を340m/sに固定して計算している

気温補正による精度向上

音速は気温によって変化する。より精度を高めたい場合、固定値の代わりに気温を考慮した音速を使う方法がある。【Arduino】超音波距離センサ(HC-SR04)の測定精度を向上(気温考慮)(algorithm.joho.info)では、気温をtempとしたとき、音速vを(331.5+0.6×temp)÷10000という式で近似し、この音速vと計測した時間から距離を計算するコード例が紹介されている。

編集部想定シナリオ
屋外や気温変化の大きい環境でHC-SR04を使う場合、朝と昼で測定値が数%ずれることがある。これは音速そのものが気温によって変わるためであり、センサーの故障や配線ミスではない。気温センサーと組み合わせて音速を補正することで、こうした季節・時間帯による測定誤差を小さくできる。

HC-SR04のデータシートに基づく仕様の整理は、以下の記事も参考になる。超音波距離センサ HC-SR04をArduinoで使う方法(雑学エンジニアブログ)では、HC-SR04のデータシートや公開されているサンプルコードでは、音速を340m/sとして距離を算出していると説明されている



Chapter 04 — Comparison

04距離測定方式の比較と選択肢

距離を測定する方法は、HC-SR04以外にも複数の選択肢がある。以下に3つを整理する。

項目 A. HC-SR04(固定音速で計算) B. HC-SR04(気温補正あり) C. 赤外線距離センサー(GP2Y0A02YK等)
実装の手軽さ 高い 中程度(気温センサーが別途必要) 高い(analogRead()のみで完結)
測定精度 気温変化で数%程度ずれる場合がある 固定音速方式より安定しやすい 距離と出力電圧の関係が非線形
対象物の影響 柔らかい素材・斜面で誤検知しやすい Aと同様 色や反射率の影響を受けやすい
価格帯 安価 Aと同程度+気温センサー分 HC-SR04よりやや高価な傾向

※各方式の特性の目安は編集部見解を含む。pulseIn()の仕様についてはArduino公式 Language Reference「pulseIn()」を参照。

まずはA案の固定音速方式で全体の動作を確認し、精度に不満が出てきた段階でB案の気温補正や、用途によってはC案の赤外線センサーへの切り替えを検討する、という順序が取り組みやすい。

Chapter 05 — Practice

05実践:HC-SR04で距離をシリアル表示する5ステップ

ここでは「HC-SR04で対象物までの距離を測定し、シリアルモニタにcm単位で表示する」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。

  1. STEP1. HC-SR04を配線する

    VCC・GND・Trig・Echoの4本を、それぞれ対応する場所に接続する。

    配線手順(テキスト版)

    1. HC-SR04のVCCピンを、Arduinoの5Vピンに接続する
    2. HC-SR04のGNDピンを、ArduinoのGNDピンに接続する
    3. HC-SR04のTrigピンを、Arduinoのデジタルピン8番に接続する
    4. HC-SR04のEchoピンを、Arduinoのデジタルピン9番に接続する
    実例:Trig=8番、Echo=9番の組み合わせで配線した。
  2. STEP2. pinMode()でTrigを出力、Echoを入力に設定する

    setup()内で、TrigピンをOUTPUT、EchoピンをINPUTに設定する。

    実例:pinMode(8, OUTPUT); pinMode(9, INPUT);を記述した。
  3. STEP3. Trigに10μsのパルスを送る

    Trigピンを一度LOWにしてから、10マイクロ秒だけHIGHにし、再びLOWに戻す。

    実例:digitalWrite(8, LOW); delayMicroseconds(2); digitalWrite(8, HIGH); delayMicroseconds(10); digitalWrite(8, LOW);という手順で発射処理を実装した。
  4. STEP4. pulseIn()でEchoのパルス幅を測定する

    pulseIn(echoPin, HIGH)を呼び出し、往復にかかった時間(マイクロ秒)を取得する。

    実例:long duration = pulseIn(9, HIGH);を記述した。
  5. STEP5. 距離に変換し、シリアルモニタに表示する

    測定した時間に0.034を掛け、2で割ることで距離(cm)に変換し、Serial.println()で出力する。

    実例:float distance = duration * 0.034 / 2; Serial.println(distance);を追加。対象物を前後に動かすと、表示される距離もそれに応じて変化することを確認した。対象物を5cm程度に近づけた際に値が不安定になったため、有効測定範囲の下限に近いことが原因だと判断した(編集部想定シナリオ)。

ブレッドボード上での配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。

電子工作ブレッドボード完全攻略ガイドはこちらの記事で詳しく解説している

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. 音速は常に340m/sとして計算すればよい

340m/sという値はあくまで一般的な気温を想定した固定値であり、実際の音速は気温によって変化する。屋外や温度変化の大きい環境で高精度な測定が必要な場合は、気温を考慮した補正式を使うことが推奨される。

!誤解2. HC-SR04はどんな距離・どんな素材でも正確に測定できる

HC-SR04には有効な測定範囲(一般的に2cm〜400cm程度)があり、対象物が近すぎたり遠すぎたりすると正しく測定できない。また、柔らかい素材や斜めの面は超音波を乱反射させ、反射波がセンサーに戻らず測定値が異常になることがある。

!誤解3. 3.3V系のマイコンにもそのままEchoを繋いでよい

HC-SR04は5V駆動が前提のセンサーであり、Echoピンの出力も5V振幅になる。3.3V系のマイコンに直接接続すると、入力耐圧を超えて故障の原因になるおそれがあるため、抵抗分圧やレベル変換回路を挟む必要がある。



Chapter 07 — FAQ

07FAQ

Q.HC-SR04はどうやって距離を測っているのですか。
A.TrigピンからArduinoが10マイクロ秒のパルスを送ると、HC-SR04が超音波を発射します。その超音波が物体に反射して戻ってくるまでの時間をEchoピンのパルス幅として出力するので、その時間と音速から距離を計算します。

Q.HC-SR04の4本のピンはそれぞれ何に接続すればよいですか。
A.VCCはArduinoの5Vに、GNDはGNDに接続します。TrigはArduinoの出力用デジタルピンに、EchoはArduinoの入力用デジタルピンに接続します。TrigとEchoは別々のピンを使うのが基本です。

Q.距離はどうやって計算すればよいですか。
A.pulseIn()関数で測定したEchoのパルス幅(マイクロ秒)に音速(一般的に秒速約340m、cm/µsに換算すると約0.034)を掛け、往復分を2で割ることで距離(cm)を求められます。計算式は「距離[cm] = 0.034 × (パルス幅[µs] ÷ 2)」となります。

Q.測定値が0や不安定な値になることがあるのはなぜですか。
A.HC-SR04には約2cmから400cm程度という有効な測定範囲があり、対象物が近すぎたり遠すぎたりすると正しく反射波を受信できず、測定値が0や異常値になることがあります。また、柔らかい素材や斜めの面は超音波を乱反射させ、反射波が戻ってこないことがあります。

Q.測定精度を上げるにはどうすればよいですか。
A.音速は気温によって変化するため、固定値(340m/s)で計算する代わりに、気温センサーの値を使って音速を補正する方法があります。音速は概算でおよそ(331.5 + 0.6 × 気温[℃])m/sという式で近似できるとされています。あわせて複数回測定した値の平均を取ることで、ノイズによる誤差を減らす方法も有効です。

Q.HC-SR04を3.3V系のマイコンで使う場合、何に注意すればよいですか。
A.HC-SR04は基本的に5V駆動を前提としたセンサーで、Echoピンの出力も5V振幅になります。3.3V系のマイコンにEchoを直接接続すると、マイコンの入力耐圧を超えるおそれがあるため、抵抗分圧やレベル変換回路を挟んで電圧を下げてから接続することが推奨されます(編集部見解)。

参考文献

関連記事(内部リンク)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE