ต่อ HC-SR04 กับ ESP32 ให้ถูก: แบ่งแรงดันขา ECHO จาก 5 V เหลือ 3.3 V
HC-SR04 ใช้ไฟ 5 V และส่งสัญญาณ ECHO กลับมา 5 V แต่ขา ESP32 รับได้แค่ 3.3 V วิธีต่อตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ พร้อมโค้ดวัดระยะ
HC-SR04 เป็นเซนเซอร์วัดระยะที่ราคาถูกและใช้กันมากที่สุดในหุ่นยนต์มือใหม่ แต่เมื่อใช้กับ ESP32 มีจุดที่คนพลาดบ่อย คือขา ECHO ส่งสัญญาณกลับมาที่ 5 V ในขณะที่ขา GPIO ของ ESP32 ออกแบบมาสำหรับ 3.3 V ต่อตรงอาจทำงานได้ช่วงหนึ่ง แต่เสี่ยงทำให้ขานั้นเสียในระยะยาว
HC-SR04 ทำงานอย่างไร
- บอร์ดส่งพัลส์ HIGH ยาว 10 ไมโครวินาทีเข้าขา
TRIG - เซนเซอร์ยิงคลื่นเสียง 40 kHz ออกไป แล้วตั้งขา
ECHOเป็น HIGH ค้างไว้จนได้ยินเสียงสะท้อนกลับ - ความยาวของพัลส์ 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
การต่อขา
| TB6612FNG Motors | VM → แบต 7.4 VVCC → 3V3GND → GNDPWMA → GPIO25AIN1 → GPIO27AIN2 → GPIO14PWMB → GPIO26BIN1 → GPIO13BIN2 → GPIO4STBY → 3V3 (ต่อค้างไว้) |
|---|---|
| HC-SR04 Front sonar | VCC → 5VTRIG → GPIO32ECHO → GPIO34GND → GND |
- ! Front sonar ECHO ส่งสัญญาณ 5 V เข้าขา 3.3 V: ใส่ตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ
ตัวตรวจวงจรของตัวจำลองเตือนเรื่องนี้ให้เองทุกครั้งที่ต่อ 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 (30 ขา) | 1 | ฿130–฿250 |
| TB6612FNG motor driver | 1 | ฿50–฿120 |
| Ultrasonic HC-SR04 | 1 | ฿30–฿60 |
| ชุดแชสซี 2WD มีมอเตอร์ TT 2 ตัว ล้อ 2 ล้อ และล้อ caster | 1 | ฿150–฿300 |
| ถ่าน Li-ion 18650 | 2 | ฿60–฿150 |
| รางถ่าน 18650 แบบ 2 ก้อน (2S) | 1 | ฿20–฿60 |
| Buck converter 7.4 V → 5 V 3 A | 1 | ฿30–฿90 |
| สวิตช์เปิด-ปิด | 1 | ฿5–฿20 |
| สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น | 1 | ฿30–฿60 |
| ตัวต้านทาน 1 kΩ + 2 kΩ (แบ่งแรงดัน 5 V → 3.3 V) | 1 | ฿2–฿10 |
| แนะนำเพิ่ม | ||
| ที่ชาร์จถ่าน 18650 | 1 | ฿100–฿250 |
| รวมโดยประมาณ | ฿567–฿1,270 | |
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน
ลองในตัวจำลอง
ปุ่มด้านล่างเปิดหุ่นที่มี HC-SR04 ตัวเดียว ลองกด Run ในหน้า Code แล้วสังเกตว่าหุ่นมองไม่เห็นของที่อยู่เฉียงหน้า ซึ่งเป็นเหตุผลที่หุ่นหลบสิ่งกีดขวางส่วนใหญ่ใช้เซนเซอร์มากกว่าหนึ่งตัว (ดู หุ่นยนต์หลบสิ่งกีดขวาง)