#116中級

ESP32とHC-SR04で作る超音波距離計

HC-SR04超音波センサーは、発した音波が物体に反射して戻るまでの時間(Time of Flight)を測定して距離を計算します。このプロジェクトでは、ESP32からセンサーのTRIGピンに10マイクロ秒のパルスを送り、ECHOピンからの反射波の持続時間を`pulseIn()`で読み取ります。計算した距離をcm単位で16x2 I2C LCDに表示します。HC-SR04は5Vで動作するため、ECHOピンには**分圧回路**が必須です。分圧しないとESP32の3.3V GPIOが破損します。

4.9(28)
44 完了
ESP32とHC-SR04で作る超音波距離計
定規を使わずに、手や箱までの距離を測る小さな装置です。距離センサーが耳に聞こえない音を発して反射波を捉え、ESP32が結果をセンチメートル単位で小さなディスプレイに表示します。物体が遠すぎる場合は、測定範囲外であることも知らせます。コウモリが暗闇で周囲を把握する仕組みを、机の上で体験できます。

動画

回路図

ESP32とHC-SR04で作る超音波距離計 - Circuit

ソースコード

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   ESP32 HC-SR04 Ultrasonic Distance Sensor
4// ─────────────────────────────────────────
5// Triggers the HC-SR04 with a TRIG pulse, computes the distance (cm) from
6// the ECHO time and shows it on a 16x2 I2C LCD every 0.2 s. If no echo
7// comes back, the screen shows "Menzil disinda" (out of range).
8//
9// Pins:
10//   GPIO 5  -> HC-SR04 TRIG
11//   GPIO 18 -> HC-SR04 ECHO (via a voltage divider)
12//   Divider: ECHO -> 1k -> GPIO 18 -> 2k -> GND
13//   GPIO 21 -> LCD SDA, GPIO 22 -> LCD SCL
14//   HC-SR04 and LCD VCC -> 5V (VIN), GND -> GND
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18
19// Pin definitions
20const int TRIG_PIN = 5;
21const int ECHO_PIN = 18;   // Needs a 1k + 2k voltage divider
22
23// LCD addr 0x27 or 0x3F
24LiquidCrystal_I2C lcd(0x27, 16, 2);
25
26const float SOUND_SPEED_CM_PER_US = 0.0343f;      // Speed of sound (cm/us)
27const unsigned long PULSE_TIMEOUT_US = 30000UL;   // Echo timeout (~5 m)
28
29void setup() {
30  pinMode(TRIG_PIN, OUTPUT);
31  pinMode(ECHO_PIN, INPUT);
32  digitalWrite(TRIG_PIN, LOW);
33
34  // DevKit V1 default I2C pins
35  Wire.begin(21, 22);
36
37  lcd.init();
38  lcd.backlight();
39
40  // Splash screen 3 s
41  lcd.setCursor(3, 0);
42  lcd.print("BlueGrays");
43  lcd.setCursor(1, 1);
44  lcd.print("HC-SR04 v1.0");
45  delay(3000);
46
47  // Main screen
48  lcd.clear();
49  lcd.setCursor(0, 0);
50  lcd.print("Mesafe:");
51}
52
53// Reads the distance in cm, -1 on error
54float readDistanceCm() {
55  // A 10 us TRIG pulse starts a measurement
56  digitalWrite(TRIG_PIN, LOW);
57  delayMicroseconds(2);
58  digitalWrite(TRIG_PIN, HIGH);
59  delayMicroseconds(10);
60  digitalWrite(TRIG_PIN, LOW);
61
62  unsigned long duration = pulseIn(ECHO_PIN, HIGH, PULSE_TIMEOUT_US);
63  if (duration == 0) return -1.0f;
64  // Round trip, so divide by 2
65  return (duration * SOUND_SPEED_CM_PER_US) / 2.0f;
66}
67
68void loop() {
69  float distance = readDistanceCm();
70
71  // Clear bottom row
72  lcd.setCursor(0, 1);
73  lcd.print("                ");
74  lcd.setCursor(0, 1);
75
76  if (distance < 0) {
77    lcd.print("Menzil disinda");
78  } else {
79    lcd.print(distance, 1);   // 1 decimal place
80    lcd.print(" cm");
81  }
82
83  delay(200);
84}
85

よくある質問

ECHOラインに分圧回路を入れるのはなぜですか?▾

HC-SR04は5 Vで動作し、ECHOピンからも5 Vを出力しますが、ESP32の入力が受け付ける電圧は最大3.3 Vです。1 kΩと2 kΩの抵抗で構成した分圧回路で5 Vを約3.3 Vに下げ、ESP32を保護します。

TRIGピンにも分圧回路は必要ですか?▾

いいえ。TRIGはESP32からセンサーへ送る信号です。ESP32の3.3 VのHIGHは、通常HC-SR04で問題なく認識されます。

HC-SR04Pでも分圧回路は必要ですか?▾

HC-SR04PやRCWL-1601などのモデルは3.3 Vで駆動できます。その場合はECHO出力も3.3 Vになるため、分圧回路は不要です。

距離の測定精度を上げるにはどうすればよいですか?▾

音速は温度によって変化します(20 °Cでは約343 m/s)。温度センサーを使って音速を補正し、複数回の測定値の中央値を取ると、精度が向上します。