📘 ซีรีส์ออกแบบ IoT Product · EP.17/70 · บทที่ 3: ไฟเลี้ยง แบตเตอรี่ การสื่อสาร และต้นแบบแรก
ตอนนี้ตอบคำถามว่า ทำไมบอร์ด Wi-Fi ชอบรีเซ็ตเอง และต้องป้องกันขาเข้าไฟอย่างไร ต่อจาก EP.16 ที่เราเลือก regulator จากตาราง power budget ไปแล้ว
ทำไมบอร์ด Wi-Fi รีเซ็ตเอง
อาการคลาสสิกคือ บนโต๊ะทดสอบทำงานดี แต่พอติดตั้งจริงเครื่องรีเซ็ตเองแบบสุ่ม โดยเฉพาะ ตอนเชื่อม Wi-Fi หรือส่งข้อมูล สาเหตุส่วนใหญ่ไม่ใช่โค้ด แต่เป็น brownout (แรงดันตกลงชั่วขณะจนชิปทำงานต่อไม่ได้) ซึ่งมักเกิดจากสามอย่างซ้อนกัน
- กระแสพุ่งเป็นช่วงสั้น ๆ ตอนส่งสัญญาณ ตาม datasheet ของ Espressif ชิป ESP32-C3 ส่ง Wi-Fi แบบ 802.11b ที่กำลัง 21 dBm กินกระแสยอดราว 335 mA (วัดที่ 3.3V และ duty cycle 100%) ขณะที่ช่วงไม่ได้ส่งกินน้อยกว่านั้นมาก
- ตัวเก็บประจุไม่พอ regulator ตอบสนองไม่ทันกระแสที่กระโดดเร็ว หน้าที่จ่ายช่วงแรกจึงตกเป็นของตัวเก็บประจุใกล้ชิป ถ้าเล็กเกินหรือวางไกล แรงดันจะยุบ
- สายยาวหรือสายเล็ก สาย USB ยาวและบาง หรือขั้วต่อหลวม มีความต้านทานที่ทำให้แรงดันตกตามกระแส ยิ่งกระแสยอดสูง แรงดันยิ่งตกมาก
คู่มือ schematic checklist ของ Espressif ระบุว่าไฟ 3.3V ควรจ่ายได้ ไม่น้อยกว่า 500 mA ช่วงแรงดันใช้งานคือ 3.0–3.6V และแนะนำตัวเก็บประจุ อย่างน้อย 10 µF ที่จุดไฟเข้าหลัก พร้อม 0.1 µF ใกล้ขาไฟของชิป ส่วนในชิปเองมีวงจรตรวจแรงดันตก ซึ่งจะสั่งรีเซ็ตเมื่อแรงดันต่ำเกิน นี่คือที่มาของอาการรีเซ็ตเอง
หาสาเหตุให้ชัดก่อนแก้: อ่านเหตุผลการรีเซ็ตจากเฟิร์มแวร์หลังบูตแล้วบันทึกไว้ ถ้าขึ้นว่าเป็น brownout แปลว่าปัญหาอยู่ที่ไฟเลี้ยง และถ้ามีออสซิลโลสโคปให้จับแรงดัน 3.3V ตอนส่ง Wi-Fi จะเห็นหลุมแรงดันชัดเจน
วงจรป้องกันพื้นฐานที่ขาเข้า
ไฟจากนอกกล่องเชื่อไม่ได้เสมอ ขาเข้าของบอร์ดสินค้าจึงควรมีด่านป้องกันอย่างน้อยสามชั้น
- กันกลับขั้ว ผู้ใช้หรือช่างอาจต่อสายสลับขั้ว วิธีง่ายสุดคือไดโอดชอตต์กี (Schottky) อนุกรม แลกกับแรงดันตกราว 0.3–0.5V ถ้าแรงดันขาเข้าเหลือน้อยให้ใช้ P-MOSFET ต่อแบบกันกลับขั้ว ซึ่งแรงดันตกน้อยกว่ามาก
- TVS diode (ไดโอดดูดไฟกระชากชั่วขณะ) วางคร่อมขาเข้า ช่วยดูดพลังงานจากไฟกระชากหรือไฟฟ้าสถิตตอนเสียบสาย Espressif เองก็แนะนำให้มีไดโอดป้องกัน ESD ที่จุดไฟเข้าหลัก เลือกแรงดันทำงานของ TVS ให้สูงกว่าแรงดันใช้งานปกติเล็กน้อย
- ฟิวส์หรือ PTC (ฟิวส์รีเซ็ตตัวเองได้) ตัดกระแสเมื่อลัดวงจร ฟิวส์ขาดแล้วต้องเปลี่ยน ส่วน PTC เย็นลงแล้วกลับมาต่อเอง เหมาะกับเครื่องที่ติดตั้งไกลและลูกค้าเปลี่ยนฟิวส์เองไม่สะดวก
ลำดับที่นิยม: ขั้วต่อ → PTC → กันกลับขั้ว → TVS → ตัวเก็บประจุ → regulator
ลองใช้กับโปรเจกต์ตัวอย่าง: ตัวเฝ้าโรงเห็ด
ตัวเฝ้าโรงเห็ดรับ 5V จากอแดปเตอร์ที่ได้มาตรฐาน ผ่านด่านป้องกันข้างบน แล้วเข้าส่วนจัดการไฟที่ทำสองหน้าที่ คือชาร์จแบตตอนมีไฟบ้าน และสลับให้แบตจ่ายแทนทันทีเมื่อไฟบ้านหาย ทั้งสองทางเข้า Buck-Boost ตัวเดิมจาก EP.16 ชิปจึงได้ 3.3V นิ่งตลอด ส่วนชนิดแบตจะตัดสินใจใน EP.18
การตัดสินใจ: ใช้วงจรแบ่งแรงดันจากขา 5V ขาเข้ามาต่อขา GPIO หนึ่งขา เพื่อ ตรวจจับว่าไฟบ้านดับ เหตุผลคือถ้าไม่รู้ว่าไฟดับ เครื่องจะพยายามต่อ Wi-Fi ซ้ำ ๆ ทั้งที่ไฟดับทั้งบ้าน = เราเตอร์ดับด้วย เปลืองแบตไปเปล่า ๆ
เมื่อจับได้ว่าไฟดับ เครื่องจะบันทึกเวลาเริ่มไฟดับ หยุดพยายามต่อเน็ตถี่ ๆ แต่ยังวัดอุณหภูมิและความชื้นต่อตามรอบเดิม เก็บลงหน่วยความจำพร้อมเวลา พอไฟกลับและเน็ตกลับ ค่อยส่งข้อมูลย้อนหลังทั้งช่วงขึ้นคลาวด์
# pseudo-code รอบการทำงานเมื่อไฟบ้านดับ
if not mains_present():
if not on_battery:
log_event("mains_lost", now())
on_battery = True
store_reading(read_sensor(), now())
sleep_until_next_reading()
else:
if on_battery:
log_event("mains_back", now())
on_battery = False
if wifi_connected():
upload_backlog()
ส่วนการแจ้งเจ้าของฟาร์มแบบทันทีตอนไฟดับ เครื่องทำเองไม่ได้ จึงให้คลาวด์เป็นคนแจ้ง เมื่อไม่มีข้อมูลเข้าเกินเวลาที่ตั้ง ระบบจะส่ง LINE ว่า เครื่องเงียบ อาจไฟดับหรือเน็ตล่ม (กลไกฝั่งโปรโตคอลลงลึก EP.22)
กับดักที่เจอบ่อย: ทดสอบด้วยสาย USB สั้นและอแดปเตอร์คุณภาพดีบนโต๊ะ ทุกอย่างผ่าน แต่หน้างานใช้สายยาวหลายเมตรเดินจากบ้านไปโรงเรือน แรงดันตกตอนส่ง Wi-Fi จนรีเซ็ตวนไม่รู้จบ ทดสอบด้วยสายยาวและอแดปเตอร์แบบที่ลูกค้าจะใช้จริงเสมอ
เช็กลิสต์ก่อนไปตอนถัดไป
- ให้เฟิร์มแวร์บันทึกเหตุผลการรีเซ็ตทุกครั้งหลังบูต เพื่อแยก brownout ออกจากบั๊กโค้ด
- วางตัวเก็บประจุอย่างน้อย 10 µF ที่จุดไฟเข้า และ 0.1 µF ชิดขาไฟของชิปตามคู่มือผู้ผลิต
- วางด่านป้องกันขาเข้าให้ครบ: PTC กันกลับขั้ว และ TVS
- ทดสอบถอดปลั๊กกลางรอบวัด แล้วดูว่าเครื่องสลับไปแบต เก็บข้อมูลต่อ และส่งย้อนหลังได้ครบเมื่อไฟกลับ
บอร์ดที่รีเซ็ตเองส่วนใหญ่แก้ที่ไฟเลี้ยง ไม่ใช่ที่โค้ด และเครื่องที่ดีต้องรู้ตัวว่าไฟดับ เพื่อเก็บข้อมูลรอแทนที่จะเผาแบตไปกับการหาเน็ตที่ไม่มีอยู่
ตอนต่อไป — EP.18: แบตเตอรี่สำหรับ IoT: Li-ion, LiFePO4, ถ่าน AA หรือ Li-SOCl₂ เลือกแบบไหน
อยากให้ทีมช่วยออกแบบอุปกรณ์ IoT เฉพาะงานของคุณ ดูบริการได้ที่ /iot หรือปรึกษาฟรีที่ /consult และทัก LINE @spvtech
