ESP32 อัปโหลดโค้ดไม่ได้ (Failed to connect) แก้ทีละขั้น
ESP32 ขึ้น Failed to connect ตอนอัปโหลด ไล่เช็กทีละขั้น ทั้งสาย USB, driver CP2102 / CH340, ปุ่ม BOOT และขา strapping ที่ทำให้อัปโหลดไม่ได้
ข้อความ Failed to connect to ESP32 แปลว่าโปรแกรมอัปโหลดคุยกับชิปไม่ได้ สาเหตุที่พบบ่อยที่สุดเรียงตามลำดับคือ
สาย USB ส่งข้อมูลไม่ได้, ไม่มี driver, ชิปไม่เข้าโหมดอัปโหลด (แก้ด้วยการกดปุ่ม BOOT ค้าง)
และอุปกรณ์ที่ต่อไว้กับขา strapping ทำตามขั้นตอนด้านล่างทีละข้อ ส่วนใหญ่จะเจอสาเหตุภายใน 5 นาที
ข้อความ error ที่เจอบ่อย
| ข้อความ | มักเกิดจาก |
|---|---|
Failed to connect to ESP32: Timed out waiting for packet header | ชิปไม่เข้าโหมดอัปโหลด (ขั้นที่ 4) หรืออุปกรณ์ดึงขา strapping (ขั้นที่ 5) |
Wrong boot mode detected (0x13)! The chip needs to be in download mode. | ชิปบูตเข้าโปรแกรมปกติแทนโหมดอัปโหลด: กด BOOT ค้าง (ขั้นที่ 4) |
Could not open COM3, the port doesn't exist หรือ No such file or directory: /dev/ttyUSB0 | เลือกพอร์ตผิด หรือคอมพิวเตอร์มองไม่เห็นบอร์ด (ขั้นที่ 1–2) |
Access is denied / port is busy | โปรแกรมอื่นเปิดพอร์ตค้างไว้ (ขั้นที่ 3) |
1. คอมพิวเตอร์เห็นบอร์ดไหม
ถอดแล้วเสียบ USB ใหม่ ดูว่ามีพอร์ตใหม่โผล่ขึ้นมาหรือไม่
- Windows เปิด Device Manager → Ports (COM & LPT) ควรมี Silicon Labs CP210x หรือ USB-SERIAL CH340 พร้อมหมายเลข COM
- macOS สั่ง
ls /dev/cu.*ควรมีcu.usbserial-…หรือcu.SLAB_USBtoUART - Linux สั่ง
ls /dev/ttyUSB* /dev/ttyACM*ถ้าเห็นพอร์ตแต่อัปโหลดไม่ได้ ให้เพิ่มผู้ใช้เข้ากลุ่มdialout
ถ้าไม่มีพอร์ตใหม่เลย และไฟ LED บนบอร์ดติด แปลว่าบอร์ดได้ไฟแต่ไม่ได้ข้อมูล: ไปขั้นที่ 2
2. สาย USB และ driver
- สาย USB ที่ชาร์จได้อย่างเดียว สายแถมของพาวเวอร์แบงก์หรือพัดลมจำนวนมากไม่มีเส้นข้อมูล ลองเปลี่ยนเป็นสายที่เคยใช้ส่งไฟล์กับมือถือได้ สาเหตุข้อนี้พบบ่อยที่สุดและเสียเวลาหามากที่สุด
- ดูชิป USB บนบอร์ด ชิปตัวเล็กข้างหัว USB จะเขียนว่า
CP2102(หรือ CP2104) หรือCH340/CH9102ติดตั้ง driver ให้ตรงรุ่น: CP210x จากเว็บ Silicon Labs, CH340 / CH9102 จากเว็บ WCH แล้วถอดเสียบใหม่ - พอร์ต USB ของคอมพิวเตอร์ ลองเสียบตรงที่เครื่อง ไม่ผ่าน hub หรือสายต่อยาว
3. เลือกบอร์ดและพอร์ตใน Arduino IDE
- Tools → Board → ESP32 Dev Module สำหรับบอร์ด ESP32 DevKit V1 ทั่วไป
- Tools → Port → เลือกพอร์ตที่เพิ่งโผล่ในขั้นที่ 1
- ปิด Serial Monitor หรือโปรแกรมอื่นที่เปิดพอร์ตเดียวกันไว้ (เช่น PuTTY, Cura หรือหน้าต่าง Arduino IDE อีกหน้าต่าง)
- ถ้าอัปโหลดได้ครึ่งทางแล้วหลุด ลด Tools → Upload Speed เป็น 115200
4. กดปุ่ม BOOT ค้างตอน "Connecting..."
ESP32 จะเข้าโหมดอัปโหลดได้เมื่อขา GPIO 0 เป็น LOW ตอนรีเซ็ต ปกติวงจร auto-reset บนบอร์ดจัดการให้ แต่บอร์ดราคาถูกหลายรุ่นทำงานไม่ทันจังหวะ ให้ทำแบบนี้:
- กด Upload แล้วรอจนเห็น
Connecting........_____ - กดปุ่ม BOOT (บางบอร์ดเขียนว่า IO0) ค้างไว้
- ปล่อยเมื่อเห็นเปอร์เซ็นต์
Writing at 0x…เริ่มขึ้น - อัปโหลดเสร็จแล้วกดปุ่ม EN (RST) หนึ่งครั้งเพื่อรันโปรแกรม
EN กับ GND (ขาลบลง GND)
จะหน่วงจังหวะรีเซ็ตให้ช้าลงพอที่บอร์ดจะเข้าโหมดอัปโหลดเองได้ ไม่ต้องกดปุ่มอีก5. ขา strapping: ต่อของไว้แล้วอัปโหลดไม่ได้
ถ้าบอร์ดเปล่าอัปโหลดได้ แต่พอต่อเข้ากับวงจรหุ่นแล้วอัปโหลดไม่ได้ ให้สงสัยขา strapping ขาเหล่านี้ถูกอ่านค่าตอนบูตเพื่อเลือกโหมดการทำงาน อุปกรณ์ที่ดึงขาเป็น HIGH หรือ LOW ค้างไว้จึงเปลี่ยนโหมดได้
| ขา | ต้องเป็นอะไรตอนบูต | ถ้ามีอุปกรณ์ดึงไว้ |
|---|---|---|
| GPIO 0 | LOW = โหมดอัปโหลด, HIGH = รันโปรแกรม | ปุ่มหรือเซนเซอร์ที่ดึงขาไว้ทำให้บูตผิดโหมดตลอด |
| GPIO 2 | LOW หรือปล่อยลอยตอนอัปโหลด | อุปกรณ์ที่ดึงเป็น HIGH ทำให้เข้าโหมดอัปโหลดไม่ได้ |
| GPIO 12 (MTDI) | LOW | ถ้าเป็น HIGH ชิปตั้งแรงดัน flash เป็น 1.8 V แล้วบูตไม่ขึ้น หรืออ่าน flash ผิด |
| GPIO 15 (MTDO) | HIGH (มี pull-up ในตัว) | ถ้าถูกดึง LOW ข้อความตอนบูตจะหายไป และบางกรณีกระทบการอัปโหลด |
| GPIO 5 | HIGH (มี pull-up ในตัว) | มักไม่เป็นปัญหากับบอร์ด DevKit แต่ควรเลี่ยงอุปกรณ์ที่ดึงเป็น LOW |
| GPIO 1, 3 (TX0, RX0) | ใช้เป็นสาย Serial ของ USB | อุปกรณ์ที่ต่อไว้ชนกับข้อมูลที่อัปโหลด: ห้ามใช้ขานี้กับเซนเซอร์ |
วิธีทดสอบเร็วที่สุด: ถอดสายที่ต่อกับขาเหล่านี้ออกทั้งหมด อัปโหลดให้ได้ก่อน แล้วค่อยย้ายอุปกรณ์ไปขาอื่น ขาที่ปลอดภัยสำหรับใช้ทั่วไปบน DevKit คือ GPIO 4, 13, 14, 16–19, 21–23, 25–27, 32, 33 และ GPIO 34–39 สำหรับ input อย่างเดียว (GPIO 6–11 ต่อกับ flash ภายในอยู่แล้ว ห้ามใช้)
ตัวจำลองตรวจข้อนี้ให้ในหน้า Wiring ตัวอย่างนี้คือหุ่นหาแสงที่มีเซนเซอร์และจอเยอะจนต้องใช้ขา strapping สองขา:
- ! D5 เป็นขา strapping ของ ESP32: อุปกรณ์ที่ดึงขานี้ตอนบูตอาจทำให้บูตไม่ขึ้น
- ! D15 เป็นขา strapping ของ ESP32: อุปกรณ์ที่ดึงขานี้ตอนบูตอาจทำให้บูตไม่ขึ้น
- ! Front sonar ECHO ส่งสัญญาณ 5 V เข้าขา 3.3 V: ใส่ตัวต้านทานแบ่งแรงดัน 1 kΩ / 2 kΩ
ดูคำเตือนขา strapping ในตัวจำลอง →
6. ยังไม่ได้อีก
- ถอดแบตและมอเตอร์ออก ไฟตกตอนอัปโหลดทำให้หลุดกลางทางได้ ถ้ามอเตอร์หรือ servo ต่ออยู่กับไฟ USB อ่าน ESP32 รีเซ็ตเองตอนมอเตอร์หมุน
- ล้าง flash โค้ดเดิมที่ทำให้บอร์ดรีบูตวนอาจขวางการเชื่อมต่อ สั่ง
esptool.py --chip esp32 erase_flash(กด BOOT ค้างไว้ระหว่างสั่ง) แล้วอัปโหลดใหม่ - บอร์ด ESP32-CAM ไม่มีชิป USB บนบอร์ด ต้องใช้บอร์ดอัปโหลด ESP32-CAM-MB หรือ USB-serial แยก และต่อ GPIO 0 ลง GND ตอนอัปโหลด
- ลองบอร์ดอีกตัว ถ้าทุกขั้นผ่านแล้วยังไม่ได้ และบอร์ดเคยโดนไฟเกินมา ชิป USB หรือ ESP32 อาจเสียแล้ว
ชิ้นส่วน
บอร์ดในบทความนี้คือ ESP32 DevKit V1 แบบ 30 ขา ซึ่งเป็นบอร์ดที่ตัวจำลองใช้ จัดขาให้เลี่ยงขา strapping ไว้ก่อนเสมอ:
| ชิ้นส่วน | จำนวน | ราคาประมาณ | ร้าน |
|---|---|---|---|
| ESP32 DevKit V1 (30 ขา) | 1 | ฿130–฿250 | Shopee |
| TB6612FNG motor driver | 1 | ฿50–฿120 | Shopee |
| ชุดแชสซี 2WD มีมอเตอร์ TT 2 ตัว ล้อ 2 ล้อ และล้อ caster | 1 | ฿150–฿300 | Shopee |
| ถ่าน Li-ion 18650 | 2 | ฿60–฿150 | Shopee |
| รางถ่าน 18650 แบบ 2 ก้อน (2S) | 1 | ฿20–฿60 | Shopee |
| Buck converter 7.4 V → 5 V 3 A | 1 | ฿30–฿90 | Shopee |
| สวิตช์เปิด-ปิด | 1 | ฿5–฿20 | Shopee |
| สายจัมเปอร์ ผู้-ผู้ / ผู้-เมีย ชุด 40 เส้น | 1 | ฿30–฿60 | Shopee |
| แนะนำเพิ่ม | |||
| ที่ชาร์จถ่าน 18650 | 1 | ฿100–฿250 | Shopee |
| รวมโดยประมาณ | ฿535–฿1,200 | ||
ราคาประมาณการ ณ 2026-10-31 ยังไม่ได้ตรวจกับร้าน · บางลิงก์เป็นลิงก์ affiliate (อ่านเพิ่ม)