สร้างหุ่นยนต์หาแสงด้วย ESP32: หัวหมุนตามแสงด้วย LDR 2 ตา
หุ่นยนต์ 2 ล้อที่หันหน้าหาแสงด้วย LDR สองตาบนหัว servo แล้ววิ่งเข้าหาแสงพร้อมหลบสิ่งกีดขวาง มีวงจร ESP32 ตารางขา รายการชิ้นส่วน และโปรแกรมที่ลองในตัวจำลองได้
หุ่นตัวนี้หันหน้าตามแสงได้เหมือนหุ่นตั้งโต๊ะ แล้ววิ่งเข้าหาแหล่งแสงโดยอ้อมสิ่งกีดขวางที่ขวางทาง เป็นโปรเจกต์ที่ได้ฝึกครบทั้งการอ่านเซนเซอร์ analog, ขับ servo, ขับมอเตอร์ และเขียนลำดับการตัดสินใจ ทุกอย่างในบทความนี้ลองในตัวจำลองได้ก่อนซื้อของจริง
หุ่นตัวนี้ทำงานอย่างไร
- หัวหาทิศของแสง บนหัวมี LDR สองตัวหันเฉียงซ้ายและขวา ±20° servo SG90 หมุนหัวไปทางตาที่สว่างกว่า จนสองตาอ่านค่าใกล้กัน ตอนนั้นหัวชี้ไปที่แสงพอดี
- ตัวรถหมุนตามหัว มุมของหัวเทียบกับตัวรถคือทิศของแสง ตัวรถจึงหมุนตามมุมนั้นแล้ววิ่งไปข้างหน้าทีละช่วงสั้นๆ
- หลบสิ่งกีดขวาง sonar ด้านหน้าบอกระยะของที่อยู่ตรงหน้า IR ที่หันเฉียง ±35° บอกว่าฝั่งไหนโล่งกว่า IR ข้างตัว ±90° จับของที่กำลังจะเฉี่ยวด้านข้าง และ bumper หน้า-หลังเป็นด่านสุดท้ายเมื่อชนจริง
- หยุดเมื่อถึง เมื่อค่าแสงขึ้นถึงราว 78 % หุ่นหยุดและแสดงหน้ายิ้ม
ตาที่หันเฉียง ±20° รับแสงได้น้อยกว่า sensor ที่หันตรงราว 9 % ตอนอยู่ใกล้ไฟจึงอ่านได้ประมาณ 80 % เท่านั้น ในห้องจริงค่าที่อ่านได้ขึ้นกับแสงรอบข้างด้วย ให้วัดค่าตอนหุ่นอยู่หน้าไฟก่อน แล้วตั้งเป้าต่ำกว่านั้นเล็กน้อย
ชิ้นส่วน
| ชิ้นส่วน | จำนวน | ราคาประมาณ |
|---|---|---|
| ESP32 DevKit V1 (30 ขา) | 1 | ฿130–฿250 |
| TB6612FNG motor driver | 1 | ฿50–฿120 |
| Ultrasonic HC-SR04 | 1 | ฿30–฿60 |
| โมดูลวัดแสง LDR (มีขา AO) | 2 | ฿15–฿40 |
| Micro switch แบบมีก้าน (bumper) | 2 | ฿5–฿20 |
| Sharp GP2Y0A21 IR 10–80 cm ซื้อพร้อมสาย JST 3 ขา | 4 | ฿150–฿300 |
| Servo SG90 | 1 | ฿40–฿80 |
| IPS TFT ST7789 1.3" 240×240 | 1 | ฿120–฿250 |
| ชุดแชสซี 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 |
| รวมโดยประมาณ | ฿1,367–฿2,920 | |
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน
เลือก ESP32 เพราะมีขา analog พอสำหรับ LDR 2 ตัวกับ IR 4 ตัว และมี PWM สำหรับมอเตอร์กับ servo จอ ST7789 ใช้แสดงใบหน้าของหุ่น ถ้าอยากประหยัดใช้ OLED SSD1306 แทนได้ (เปลี่ยนในหน้า Robot Body ของตัวจำลอง)
วงจรและการต่อขา
| TB6612FNG Motors | VM → แบต 7.4 VVCC → 3V3GND → GNDPWMA → GPIO25AIN1 → GPIO13AIN2 → GPIO4PWMB → GPIO26BIN1 → GPIO19BIN2 → GPIO21STBY → 3V3 (ต่อค้างไว้) |
|---|---|
| HC-SR04 Front sonar | VCC → 5VTRIG → GPIO22ECHO → GPIO14GND → GND |
| LDR Left eye LDR | VCC → 3V3GND → GNDAO → GPIO32 |
| LDR Right eye LDR | VCC → 3V3GND → GNDAO → GPIO33 |
| Microswitch Front bumper | COM → GNDNO → GPIO16 |
| GP2Y0A21 IR front-left | VCC → 5VGND → GNDVO → GPIO34 |
| GP2Y0A21 IR front-right | VCC → 5VGND → GNDVO → GPIO35 |
| GP2Y0A21 IR left side | VCC → 5VGND → GNDVO → GPIO36 |
| GP2Y0A21 IR right side | VCC → 5VGND → GNDVO → GPIO39 |
| Microswitch Rear bumper | COM → GNDNO → GPIO17 |
| SG90 Head servo | GND → GNDVCC → 5VPWM → GPIO27 |
| ST7789 Face Display | GND → GNDVCC → 3V3SCL → GPIO18SDA → GPIO23RES → GPIO5DC → GPIO15BLK → 3V3 (ต่อค้างไว้) |
ไฟเลี้ยงมาจากถ่าน 18650 สองก้อน (7.4 V) ต่อเข้า VM ของ TB6612FNG ตรงๆ เพื่อขับมอเตอร์ และผ่าน buck converter ลงเป็น 5 V เลี้ยงบอร์ดกับเซนเซอร์ กระแสของมอเตอร์จึงไม่ผ่าน regulator
สิ่งที่ตัวตรวจวงจรเตือน
- ! D5 เป็นขา strapping ของ ESP32: อุปกรณ์ที่ดึงขานี้ตอนบูตอาจทำให้บูตไม่ขึ้น
- ! D15 เป็นขา strapping ของ ESP32: อุปกรณ์ที่ดึงขานี้ตอนบูตอาจทำให้บูตไม่ขึ้น
- ! Front sonar ECHO ส่งสัญญาณ 5 V เข้าขา 3.3 V: ใส่ตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ
- ECHO ของ HC-SR04 เป็นสัญญาณ 5 V ต้องผ่านตัวต้านทานแบ่งแรงดันก่อนเข้า ESP32 ดูวิธีต่อใน ต่อ HC-SR04 กับ ESP32
- D5 และ D15 เป็นขา strapping ที่ ESP32 อ่านตอนบูต ในวงจรนี้ต่อกับขา RES และ DC ของจอ ซึ่งปกติไม่ดึงระดับไฟตอนบูต ถ้าบอร์ดบูตไม่ขึ้นหรืออัปโหลดโค้ดไม่ได้ ให้ย้ายสองขานี้ไปขาอื่นในตารางการต่อขาของตัวจำลอง
- ขา analog เต็มแล้ว LDR 2 ตัวกับ IR 4 ตัวใช้ขา ADC1 ครบทั้ง 6 ขาที่บอร์ดมี ถ้าจะเพิ่มเซนเซอร์ analog อีกต้องอ่าน ทำไม ESP32 อ่าน analog ไม่ได้ตอนเปิด WiFi ก่อน
โปรแกรม
โปรแกรมในตัวจำลองเขียนด้วย JavaScript ผ่าน library rover ด้านล่างเป็นแกนของโปรแกรมแบบย่อ
ตัวเต็มอยู่ในหน้า Code (เปิดจากปุ่มด้านบนแล้วกด Run) ซึ่งเลือกฝั่งที่จะอ้อมด้วย IR และใช้ฝั่งเดิมต่อหลายครั้ง ไม่ให้หุ่นสลับซ้ายขวาวนอยู่ที่เดิม
await rover.module('head', true);
await rover.trackLight(true); // หัวเริ่มหันหาแสงเอง
await wait(2.5);
while (rover.light() < 78) {
const bearing = rover.headAngle(); // มุมหัว = ทิศของแสง
if (Math.abs(bearing) > 5) await rover.turn(bearing);
if ((rover.distance() ?? 999) < 30) { // มีของขวางหน้า
await rover.backward(0.4);
await rover.turn(70);
await rover.forward(1);
continue;
}
await rover.forward(0.5);
}
rover.face('happy', 'เจอแสงแล้ว!');
จากซิมไปของจริง
- เปิดหน้า Wiring ของตัวจำลอง กด ⬇ เฟิร์มแวร์ .ino จะได้สเก็ตช์ Arduino ที่ใช้ขาตามตารางด้านบน
มีทั้งการขับล้อ อ่านเซนเซอร์ หัวหันหาแสง และโหมด AUTO ที่หาแสงพร้อมหลบสิ่งกีดขวาง (สั่ง
AUTO 1ทาง Serial Monitor ที่ 115200) - ประกอบและทดสอบทีละส่วน: ล้อก่อน (
F 1,L 1) แล้วอ่านเซนเซอร์ด้วยREADแล้วค่อยลองหัว (TRACK 1) - ถ้าหัวหมุนหนีแสงแทนที่จะหันหา ให้กลับค่า
HEAD_DIRถ้าค่าแสงกลับทาง (มืดแล้วค่าสูง) ให้ตั้งLIGHT_DARK_IS_HIGHทั้งสองค่าอยู่ในส่วน Settings ต้นไฟล์
ผลทดสอบในตัวจำลอง
- หัวหันหาไฟที่อยู่นิ่งได้ตรงทิศ และตามไฟที่เคลื่อนรอบหุ่น 20 °/วินาที คลาดเฉลี่ยราว 5°
- โปรแกรมตัวอย่างไปถึงไฟได้ 2 จาก 3 ตำแหน่งที่ทดสอบโดยไม่ชนเลย ตำแหน่งที่ไม่ถึงคือไฟที่อยู่ในซอกระหว่างเสากับมุมกำแพง ซึ่งหุ่นหยุดห่างออกมา เพราะเข้าไปในซอกไม่ได้
ลองย้ายไฟไปไว้หลังสิ่งกีดขวางในตัวจำลอง แล้วดูว่าหุ่นอ้อมไปได้หรือไม่ เป็นวิธีที่ดีในการหาจุดอ่อนของโปรแกรมก่อนสร้างจริง