ต่อ HC-SR04 กับ ESP32 ให้ถูก: แบ่งแรงดันขา ECHO จาก 5 V เหลือ 3.3 V

HC-SR04 ใช้ไฟ 5 V และส่งสัญญาณ ECHO กลับมา 5 V แต่ขา ESP32 รับได้แค่ 3.3 V วิธีต่อตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ พร้อมโค้ดวัดระยะ

อัปเดต 2026-10-31

HC-SR04 เป็นเซนเซอร์วัดระยะที่ราคาถูกและใช้กันมากที่สุดในหุ่นยนต์มือใหม่ แต่เมื่อใช้กับ ESP32 มีจุดที่คนพลาดบ่อย คือขา ECHO ส่งสัญญาณกลับมาที่ 5 V ในขณะที่ขา GPIO ของ ESP32 ออกแบบมาสำหรับ 3.3 V ต่อตรงอาจทำงานได้ช่วงหนึ่ง แต่เสี่ยงทำให้ขานั้นเสียในระยะยาว

HC-SR04 ทำงานอย่างไร

  1. บอร์ดส่งพัลส์ HIGH ยาว 10 ไมโครวินาทีเข้าขา TRIG
  2. เซนเซอร์ยิงคลื่นเสียง 40 kHz ออกไป แล้วตั้งขา ECHO เป็น HIGH ค้างไว้จนได้ยินเสียงสะท้อนกลับ
  3. ความยาวของพัลส์ ECHO คือเวลาที่เสียงเดินทางไปและกลับ ระยะ (cm) จึงประมาณ เวลา (µs) ÷ 58

เซนเซอร์ต้องใช้ไฟเลี้ยง 5 V และวัดได้ราว 2–400 cm ตามสเปก ในการใช้งานจริงค่าที่ไว้ใจได้มักอยู่ที่ไม่เกิน 2–3 เมตร ลำคลื่นค่อนข้างแคบ ของที่อยู่เฉียงหรือผิวที่เอียงอาจสะท้อนเสียงออกไปทางอื่นจนวัดไม่เจอ

ทำไมต้องแบ่งแรงดัน

ขา TRIG ไม่มีปัญหา เพราะ ESP32 ส่ง 3.3 V ออกไป ซึ่ง HC-SR04 อ่านเป็น HIGH ได้ ปัญหาอยู่ที่ขา ECHO ที่ส่ง 5 V กลับเข้า ESP32 ทางแก้ที่ง่ายที่สุดคือตัวต้านทานสองตัวต่ออนุกรมกัน:

ECHO ──[ 1 kΩ ]──┬──▶ ขา GPIO ของ ESP32
                 │
               [ 2 kΩ ]
                 │
                GND

แรงดันที่ขา GPIO = 5 V × 2 kΩ ÷ (1 kΩ + 2 kΩ) ≈ 3.3 V พอดีกับระดับที่ ESP32 รับได้ ถ้าไม่มีตัว 2 kΩ ใช้ 1 kΩ สองตัวต่ออนุกรมแทนได้ หรือใช้คู่ 2.2 kΩ / 4.7 kΩ ซึ่งได้ราว 3.4 V

มี HC-SR04 รุ่นที่ทำงานที่ 3.3 V ได้ เช่นรุ่นที่ขายเป็น HC-SR04P หรือ RCWL-1601 ถ้าเลี้ยงด้วย 3.3 V สัญญาณ ECHO จะเป็น 3.3 V และไม่ต้องแบ่งแรงดัน ให้ดูสเปกของรุ่นที่ซื้อมาก่อน

การต่อขา

แผนผังวงจร HC-SR04 กับ ESP32 และ motor driver TB6612FNG ในตัวจำลอง
การต่อขาบน ESP32 DevKit V1 (จัดขาอัตโนมัติจากตัวจำลอง)
TB6612FNG
Motors
VM → แบต 7.4 V
VCC → 3V3
GND → GND
PWMA → GPIO25
AIN1 → GPIO27
AIN2 → GPIO14
PWMB → GPIO26
BIN1 → GPIO13
BIN2 → GPIO4
STBY → 3V3 (ต่อค้างไว้)
HC-SR04
Front sonar
VCC → 5V
TRIG → GPIO32
ECHO → GPIO34
GND → GND

ตัวตรวจวงจรของตัวจำลองเตือนเรื่องนี้ให้เองทุกครั้งที่ต่อ HC-SR04 กับบอร์ด 3.3 V และแท็บชิ้นส่วนจะใส่ตัวต้านทานให้ในรายการ

โค้ดวัดระยะ (Arduino IDE)

const int TRIG = 32;   // ใช้ขาตามตารางด้านบน
const int ECHO = 34;   // ผ่านตัวต้านทานแบ่งแรงดันแล้ว

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

// ระยะเป็น cm หรือ -1 ถ้าไม่มีเสียงสะท้อนภายใน 30 ms (ไกลเกินราว 5 m)
float readDistanceCm() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  unsigned long us = pulseIn(ECHO, HIGH, 30000);
  return us == 0 ? -1 : us / 58.0;
}

void loop() {
  Serial.println(readDistanceCm());
  delay(60);   // เว้นอย่างน้อย 60 ms ให้เสียงสะท้อนรอบก่อนหายไป
}

อย่าลืมเปลี่ยนเลขขาให้ตรงกับที่ต่อจริง ถ้าใช้ตัวจำลองช่วยจัดขา ให้ดูเลขจากตารางด้านบน หรือกด คัดลอก pins.h ในหน้า Wiring

ชิ้นส่วน

ชิ้นส่วนสำหรับ ESP32 DevKit V1
ชิ้นส่วนจำนวนราคาประมาณ
ESP32 DevKit V1 (30 ขา)1฿130–฿250
TB6612FNG motor driver1฿50–฿120
Ultrasonic HC-SR041฿30–฿60
ชุดแชสซี 2WD
มีมอเตอร์ TT 2 ตัว ล้อ 2 ล้อ และล้อ caster
1฿150–฿300
ถ่าน Li-ion 186502฿60–฿150
รางถ่าน 18650 แบบ 2 ก้อน (2S)1฿20–฿60
Buck converter 7.4 V → 5 V 3 A1฿30–฿90
สวิตช์เปิด-ปิด1฿5–฿20
สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น1฿30–฿60
ตัวต้านทาน 1 kΩ + 2 kΩ (แบ่งแรงดัน 5 V → 3.3 V)1฿2–฿10
แนะนำเพิ่ม
ที่ชาร์จถ่าน 186501฿100–฿250
รวมโดยประมาณ฿567–฿1,270

ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน

ลองในตัวจำลอง

ปุ่มด้านล่างเปิดหุ่นที่มี HC-SR04 ตัวเดียว ลองกด Run ในหน้า Code แล้วสังเกตว่าหุ่นมองไม่เห็นของที่อยู่เฉียงหน้า ซึ่งเป็นเหตุผลที่หุ่นหลบสิ่งกีดขวางส่วนใหญ่ใช้เซนเซอร์มากกว่าหนึ่งตัว (ดู หุ่นยนต์หลบสิ่งกีดขวาง)

เปิดหุ่น HC-SR04 ในตัวจำลอง →