หุ่นยนต์หลบสิ่งกีดขวางด้วย HC-SR04 และ IR Sharp บน ESP32
ทำไม ultrasonic ตัวเดียวไม่พอสำหรับหุ่นหลบสิ่งกีดขวาง และวิธีใช้ IR หันเฉียง ±35° เลือกทางเลี่ยง พร้อมวงจร ESP32 รายการชิ้นส่วน และโปรแกรมที่ลองในตัวจำลองได้
หุ่นหลบสิ่งกีดขวางเป็นโปรเจกต์แรกของหลายคน วิธีที่พบบ่อยคือติด HC-SR04 ไว้ด้านหน้าตัวเดียว ซึ่งใช้ได้กับกำแพงที่อยู่ตรงหน้า แต่หุ่นมักชนขอบโต๊ะ ขาเก้าอี้ หรือของที่อยู่เฉียงหน้า บทความนี้เพิ่ม IR อีกสองตัวหันเฉียงซ้ายขวา เพื่อให้หุ่นรู้ว่าควรเลี้ยวไปทางไหน
เปิดหุ่นหลบสิ่งกีดขวางในตัวจำลอง →
ทำไม sonar ตัวเดียวไม่พอ
- มองเห็นแคบ HC-SR04 วัดได้ดีเฉพาะของที่อยู่ค่อนข้างตรงหน้า ของที่อยู่เฉียงอาจไม่สะท้อนเสียงกลับมา
- ไม่บอกทิศ รู้แค่ว่ามีของอยู่ข้างหน้า แต่ไม่รู้ว่าเลี้ยวซ้ายหรือขวาดีกว่า หุ่นจึงมักเลี้ยวทางเดิมเสมอแล้ววนติดมุม
- ผิวเอียงสะท้อนเสียงออกไปทางอื่น กำแพงที่หุ่นวิ่งเข้าหาในมุมตื้นอาจวัดไม่เจอเลย
ชุดเซนเซอร์
| เซนเซอร์ | ตำแหน่ง | หน้าที่ |
|---|---|---|
| HC-SR04 | หน้าตรง | ระยะของที่อยู่ตรงหน้า วัดได้ไกล |
| Sharp GP2Y0A21 × 2 | หน้าซ้าย −35° และหน้าขวา +35° | บอกว่าฝั่งไหนโล่งกว่า และจับของที่อยู่เฉียง |
| Micro switch | กันชนหน้า | ด่านสุดท้ายเมื่อชนจริง |
ลำดับการตัดสินใจ
- วิ่งไปข้างหน้าที่กำลังมอเตอร์ 60 %
- ถ้า sonar วัดได้ใกล้กว่า 35 cm หรือกันชนถูกกด ให้หยุดแล้วถอยหลัง 0.4 วินาที
- เทียบระยะจาก IR ซ้ายกับขวา แล้วหมุน 70° ไปทางที่โล่งกว่า
- วิ่งต่อ
const list = Object.entries(rover.sensors());
const ir = side => list.filter(([, s]) => s.type === 'ir' && s.name.toLowerCase().includes(side)).map(([id]) => id);
const left = ir('left'), right = ir('right');
rover.drive(0.6);
while (true) {
if ((rover.distance() ?? 999) < 35 || rover.bumped()) {
rover.stop();
await rover.backward(0.4);
// หมุนไปฝั่งที่โล่งกว่า
const l = Math.min(999, ...left.map(rover.read)), r = Math.min(999, ...right.map(rover.read));
await rover.turn(l > r ? -70 : 70);
rover.drive(0.6);
}
await wait(0.05);
}
โปรแกรมนี้คือตัวอย่าง “เดินเล่นหลบสิ่งกีดขวาง” ในหน้า Code ของตัวจำลอง ลองแก้ระยะ 35 cm หรือมุม 70° แล้วดูว่าหุ่นติดมุมน้อยลงหรือไม่
ชิ้นส่วน
| ชิ้นส่วน | จำนวน | ราคาประมาณ |
|---|---|---|
| ESP32 DevKit V1 (30 ขา) | 1 | ฿130–฿250 |
| TB6612FNG motor driver | 1 | ฿50–฿120 |
| Ultrasonic HC-SR04 | 1 | ฿30–฿60 |
| Sharp GP2Y0A21 IR 10–80 cm ซื้อพร้อมสาย JST 3 ขา | 2 | ฿150–฿300 |
| Micro switch แบบมีก้าน (bumper) | 1 | ฿5–฿20 |
| OLED SSD1306 0.96" I²C | 1 | ฿80–฿150 |
| ชุดแชสซี 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 |
| รวมโดยประมาณ | ฿952–฿2,040 | |
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน
การต่อขา
| TB6612FNG Motors | VM → แบต 7.4 VVCC → 3V3GND → GNDPWMA → GPIO25AIN1 → GPIO27AIN2 → GPIO14PWMB → GPIO26BIN1 → GPIO13BIN2 → GPIO4STBY → 3V3 (ต่อค้างไว้) |
|---|---|
| HC-SR04 Front sonar | VCC → 5VTRIG → GPIO19ECHO → GPIO34GND → GND |
| GP2Y0A21 IR front-left | VCC → 5VGND → GNDVO → GPIO32 |
| GP2Y0A21 IR front-right | VCC → 5VGND → GNDVO → GPIO33 |
| Microswitch Front bumper | COM → GNDNO → GPIO18 |
| SSD1306 Face Display | GND → GNDVCC → 3V3SCL → GPIO22SDA → GPIO21 |
- ! Front sonar ECHO ส่งสัญญาณ 5 V เข้าขา 3.3 V: ใส่ตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ
ข้อควรรู้เมื่อใช้ IR Sharp ของจริง
- ค่าไม่เป็นเส้นตรง GP2Y0A21 ให้แรงดันสูงเมื่อของอยู่ใกล้และลดลงแบบโค้งเมื่อไกลออกไป ต้องแปลงด้วยตารางจาก datasheet หรือสูตรประมาณ แล้ววัดเทียบกับไม้บรรทัดอีกครั้ง
- ใกล้กว่าราว 10 cm ค่าจะกลับทาง ของที่ชิดมากจะอ่านได้เหมือนอยู่ไกล ติดเซนเซอร์ให้ลึกเข้ามาจากขอบหุ่นเล็กน้อยจะช่วยได้
- กินกระแสเป็นจังหวะ ใส่ตัวเก็บประจุ 10 µF ขึ้นไปคร่อม VCC กับ GND ใกล้ตัวเซนเซอร์ ค่าที่อ่านจะนิ่งขึ้น
- เซนเซอร์เลี้ยงด้วย 5 V แต่สัญญาณออกไม่เกินราว 3.1 V จึงต่อเข้าขา ADC ของ ESP32 ได้ตรงๆ ให้ใช้ขา ADC1 (ดู ADC1 กับ ADC2)
ต่อยอด
เมื่อหุ่นหลบของได้แล้ว ลองเพิ่มหัวหมุนกับ LDR ให้หุ่นมีเป้าหมาย ดู หุ่นยนต์หาแสง หรือให้ AI ตัดสินใจแทนโปรแกรม ดู ให้ AI ขับหุ่นผ่าน MCP