ArduinoでHC-SR04超音波距離センサーを使う方法|配線・コード・距離計算を初心者向けに解説

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






Arduinoで超音波距離センサー(HC-SR04)を使う方法|配線と距離計算














Arduino / 電子工作

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

超音波距離センサーは、Arduino電子工作で距離を測るときの定番部品です。中でもHC-SR04は、pulseIn()が何を測っているかを理解して使えているかどうかで、扱いやすさが大きく変わります。配線から、距離を求める計算式、測定誤差への対処までを解説します。

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

執筆・編集:YOFUKASI AI編集部|公開されている技術資料・データシート・検証記事をもとに、Arduino初心者〜中級者向けに再構成しています。

ArduinoとHC-SR04超音波距離センサーを接続した配線イメージ

Chapter 01 — Introduction

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

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

Trig(10µsのパルスを送信) 10µs

Echo(反射が戻るまでHIGH) duration(pulseIn()が測る時間) ↑超音波発射 ↑反射波を受信

TrigがHIGHになると超音波が発射され、反射波が戻るまでEchoがHIGHのままになる。このHIGHの継続時間(duration)がpulseIn()の戻り値。

実例として、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のコードの書き方(コピペ可20選)で基本文法を、Arduinoに必要な工具・部品リストで必要な部品を確認できる。

Chapter 03 — Mechanism

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

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

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

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

hc_sr04_basic.ino
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に固定して計算している出典①

コード中のdurationにはlong型、distanceにはfloat型を使い分けている点にも注目してほしい。整数と小数をどう使い分けるかはArduinoの変数の型(int・float・String)の使い分けで詳しく解説している。

気温補正による精度向上

音速は気温によって変化する。より精度を高めたい場合、固定値の代わりに気温を考慮した音速を使う方法がある。【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()」を参照。C案のようなanalogRead()ベースのセンサーの基礎はanalogRead・analogWriteの使い方で解説している。

まずは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に設定する。ピンモードの詳しい役割はArduinoのピンモード(pinMode)の基礎解説を参照。

    実例: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()で出力する。シリアルモニタの見方や便利な使い方はArduinoのシリアルモニタ活用術|デバッグを爆速にするコツを参照。

    実例: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系のマイコンに直接接続すると、入力耐圧を超えて故障の原因になるおそれがあるため、抵抗分圧やレベル変換回路を挟む必要がある。

!誤解4. pulseIn()を使えば他の処理と自由に組み合わせられる

pulseIn()は、パルスが終わるまで他の処理を一切行わない「ブロッキング」な関数である。反射波が返ってこない場合、デフォルトでは最大1秒間そのまま待機し続けるため、ボタン入力や他のセンサーの読み取りと同時に扱いたい場合は反応が鈍く感じられることがある。この挙動と対処法は7章で解説する。



Chapter 07 — Next Steps

07応用アイデア:距離センサーの次のステップ

距離を取得できるようになったら、その値を条件分岐と組み合わせることで、はじめて「作品」らしい動きになる。if (distance < 10)のようなしきい値判定の書き方はArduinoのif文の書き方完全ガイド|ボタン・センサーで条件分岐をマスターする書き方で詳しく解説しているので、まだの方はあわせて確認しておくと、以下のアイデアがすぐに実装できるようになる。

Idea 01

近づいたらLEDを点灯

しきい値を下回ったらLEDを点灯させる、最もシンプルな応用。LEDの基本回路と組み合わせて試せる。

Idea 02

障害物回避ロボット

距離が近づいたらサーボやモーターの向きを変える構成。Arduinoでサーボモーターを制御する方法が参考になる。

Idea 03

複数センサーで広い範囲を監視

複数のHC-SR04を配列で管理し、どの方向に障害物があるかを判定する。配列の使い方を参照。

Idea 04

他の処理と並行して測定

pulseIn()のブロッキングを避けたい場合は、割り込み処理や非ブロッキングな時間管理を使う。割り込み処理(interrupt)とはmillis()でdelayを使わない書き方を参照。

補足:NewPingライブラリという選択肢
複数のHC-SR04を高速に切り替えて使いたい場合や、pulseIn()のブロッキングを避けたい場合は、割り込みベースで距離を測定する「NewPing」のような専用ライブラリを使う方法もある。ライブラリの探し方・入れ方に不安がある場合は、まず標準のpulseIn()方式で仕組みを理解してから移行するのがおすすめ。

Chapter 08 — FAQ

08FAQ

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を直接接続すると、マイコンの入力耐圧を超えるおそれがあるため、抵抗分圧やレベル変換回路を挟んで電圧を下げてから接続することが推奨されます(編集部見解)。

Q.pulseIn()を使うとloop()が止まって見えるのはなぜですか。
A.pulseIn()はパルスの終了を待つ間、他の処理を一切行わない「ブロッキング」な関数だからです。反射波が戻ってこない場合はデフォルトで最大1秒間待機し続けます。他のセンサーやボタンの反応と同時に扱いたい場合は、割り込み処理や非ブロッキングな設計、あるいはNewPingのような専用ライブラリの利用を検討してください。

参考文献

YOFUKASI AI — Arduino・電子工作の基礎から応用まで。



関連記事

特集記事

コメント

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

TOP
CLOSE