Arduinoで超音波距離センサーを使う方法――HC-SR04の配線から距離計算まで一気に理解する。
pulseIn()が何を測っているか、理解して使っていますか。HC-SR04の配線から、距離を求める計算式、測定誤差への対処までを解説します。
目次
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の基本的な配線から、距離を求める計算式の仕組み、そして測定誤差への対処法までを、初心者から中級者を対象に体系的に解説する。なお、素材画像の提供がなかったため、配線は図ではなく手順化されたテキストで示す。
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のコードの書き方の基礎はこちらの記事で詳しく解説している。
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として距離を算出していると説明されている。
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案の赤外線センサーへの切り替えを検討する、という順序が取り組みやすい。
05実践:HC-SR04で距離をシリアル表示する5ステップ
ここでは「HC-SR04で対象物までの距離を測定し、シリアルモニタにcm単位で表示する」という編集部想定シナリオを題材に、配線からコード作成までの具体的な手順を示す。
-
STEP1. HC-SR04を配線する
VCC・GND・Trig・Echoの4本を、それぞれ対応する場所に接続する。
配線手順(テキスト版)- HC-SR04のVCCピンを、Arduinoの5Vピンに接続する
- HC-SR04のGNDピンを、ArduinoのGNDピンに接続する
- HC-SR04のTrigピンを、Arduinoのデジタルピン8番に接続する
- HC-SR04のEchoピンを、Arduinoのデジタルピン9番に接続する
実例:Trig=8番、Echo=9番の組み合わせで配線した。 -
STEP2. pinMode()でTrigを出力、Echoを入力に設定する
setup()内で、TrigピンをOUTPUT、EchoピンをINPUTに設定する。実例:pinMode(8, OUTPUT); pinMode(9, INPUT);を記述した。 -
STEP3. Trigに10μsのパルスを送る
Trigピンを一度LOWにしてから、10マイクロ秒だけHIGHにし、再びLOWに戻す。
実例:digitalWrite(8, LOW); delayMicroseconds(2); digitalWrite(8, HIGH); delayMicroseconds(10); digitalWrite(8, LOW);という手順で発射処理を実装した。 -
STEP4. pulseIn()でEchoのパルス幅を測定する
pulseIn(echoPin, HIGH)を呼び出し、往復にかかった時間(マイクロ秒)を取得する。実例:long duration = pulseIn(9, HIGH);を記述した。 -
STEP5. 距離に変換し、シリアルモニタに表示する
測定した時間に0.034を掛け、2で割ることで距離(cm)に変換し、
Serial.println()で出力する。実例:float distance = duration * 0.034 / 2; Serial.println(distance);を追加。対象物を前後に動かすと、表示される距離もそれに応じて変化することを確認した。対象物を5cm程度に近づけた際に値が不安定になったため、有効測定範囲の下限に近いことが原因だと判断した(編集部想定シナリオ)。
ブレッドボード上での配線の基礎をもう一度確認したい場合は、以下の記事も参考になる。
06注意点・よくある誤解
340m/sという値はあくまで一般的な気温を想定した固定値であり、実際の音速は気温によって変化する。屋外や温度変化の大きい環境で高精度な測定が必要な場合は、気温を考慮した補正式を使うことが推奨される。
HC-SR04には有効な測定範囲(一般的に2cm〜400cm程度)があり、対象物が近すぎたり遠すぎたりすると正しく測定できない。また、柔らかい素材や斜めの面は超音波を乱反射させ、反射波がセンサーに戻らず測定値が異常になることがある。
HC-SR04は5V駆動が前提のセンサーであり、Echoピンの出力も5V振幅になる。3.3V系のマイコンに直接接続すると、入力耐圧を超えて故障の原因になるおそれがあるため、抵抗分圧やレベル変換回路を挟む必要がある。
07FAQ
参考文献
- Arduino公式ドキュメント編集チーム「pulseIn()」Arduino Documentation, 2025年改訂. https://docs.arduino.cc/language-reference/en/functions/advanced-io/pulseIn/
- algorithm.joho.info「【Arduino】超音波距離センサ(HC-SR04)の使い方」algorithm.joho.info, 2017年公開. https://algorithm.joho.info/arduino/ultrasonic-distance-sensor-hc-sr04/
- algorithm.joho.info「【Arduino】超音波距離センサ(HC-SR04)の測定精度を向上(気温考慮)」algorithm.joho.info, 2017年公開. https://algorithm.joho.info/arduino/ultrasonic-distance-sensor-hcsr04-temp/
- 雑学エンジニアブログ「超音波距離センサ HC-SR04をArduinoで使う方法!超簡単に距離測定が可能」雑学エンジニアブログ, 2022年. https://zatsugaku-engineer.com/arduino/hc-sr04/
- araisun.com「超音波センサHC-SR04の使い方|ArduinoとRaspberry Piで解説」araisun.com, 2026年. https://araisun.com/arduino-hc-sr04/
- 本文中の具体的な原因特定エピソードは、断りのない限り編集部想定シナリオに基づく想定であり、実測データではありません。
関連記事(内部リンク)
- Arduinoのコードの書き方|基礎から応用まで全てがわかる初心者の手引き ― https://yofukasi-lab-wp.com/2025/03/07/arduino-cord/
- 電子工作 ブレッドボード完全攻略ガイド ― これだけ読めば全てがわかる!(2026年更新版) ― https://yofukasi-lab-wp.com/2026/07/18/breadboard/
コメント