4. ไฟเลี้ยง กราวด์ร่วม และไฟตก
ทำไมเซอร์โวต้องมีไฟแยกแต่กราวด์ต้องต่อถึงกัน และอาการบอร์ดรีเซ็ตเองตอนมอเตอร์ออกตัว
อาการที่ชมรมเจอบ่อยที่สุดตอนทำกลไก ไม่ใช่โค้ดผิด แต่เป็น ไฟ โค้ดคอมไพล์ผ่าน อัปโหลดได้ ลองบนโต๊ะดี พอติดตั้งบนโดรนเซอร์โวไม่ขยับ หรือบอร์ดรีเซ็ตเอง หน้านี้อธิบายสาเหตุสามข้อ
1. เซอร์โวต้องมีไฟเลี้ยงแยก
คู่มือชมรมระบุว่าเซอร์โวใช้แรงดัน 4.8–6.0 V และ ห้ามดึงไฟจากขา 3.3 V ของ Arduino เหตุผลคือกระแส ขา I/O ของ Nano ตัวเดียวจ่ายกระแสได้ราว 20 mA ตามสเปกชิป ส่วนเซอร์โวตอนออกแรงดึงกระแสเป็นร้อยมิลลิแอมป์ ถ้าต่อไฟจากบอร์ดแรงดันบอร์ดจะตกทันที (ดูข้อ 3)
- สายสัญญาณ ต่อกับขา PORT ของ Nano (เช่น PORT3) สายนี้กินกระแสแค่นิดเดียว
- สายไฟบวก ต่อกับแหล่งไฟ 5–6 V ที่แยกมา
- สาย GND ต่อกับแหล่งไฟนั้น และต้องต่อถึงกราวด์ของ Nano ด้วย (ดูข้อ 2)
ตัวอย่างชีวิตจริง: เสียบเครื่องใช้ไฟฟ้ากำลังสูงในปลั๊กพ่วงเล็ก
พัดลมตัวเล็กกับโคมไฟเสียบปลั๊กพ่วงเดียวกันได้ แต่เสียบหม้อหุงข้าวร่วมเข้าไป ไฟทั้งชุดตกหรือเบรกเกอร์ตัด เซอร์โวคือหม้อหุงข้าวของวงจรนี้ ให้มันมีปลั๊กของตัวเอง
2. กราวด์ร่วม (common ground)
พอแยกไฟเซอร์โวออกจาก Nano จะมีคนคิดว่า "งั้นก็แยกกันเลย" ไม่ใช่ ต้องต่อ GND ของสองฝั่งเข้าด้วยกัน เพราะแรงดันเป็นการวัด "สูงกว่าอะไร" เสมอ สัญญาณ 5 V จาก Nano หมายถึง "สูงกว่า GND ของ Nano อยู่ 5 V" ถ้าเซอร์โวไม่มี GND เดียวกัน มันไม่มีจุดอ้างอิง ก็ตีความสัญญาณไม่ได้
อาการเมื่อกราวด์ไม่ร่วม: เซอร์โวสั่นเอง ขยับสุ่ม หรือไม่ขยับเลย ทั้งที่ค่าพัลส์ในโค้ดถูก
3. ไฟตก (brown-out)
ชิปทำงานได้เมื่อแรงดันไม่ต่ำกว่าเกณฑ์ ATmega328P บน Nano มีวงจรตรวจที่จะ รีเซ็ตตัวเอง เมื่อไฟตกต่ำกว่าเกณฑ์ (เรียก brown-out) ตัวเลขเกณฑ์ขึ้นกับค่าตั้งของบอร์ด ไม่มีในไฟล์โค้ดของชมรม แต่หลักการคือเมื่อแรงดันตกต่ำเกินไป ชิปจะเริ่มโปรแกรมใหม่จาก setup()
สาเหตุที่เจอกับโดรน: ตอนมอเตอร์ออกตัวหรือเซอร์โวหมุนแรงๆ ดึงกระแสมากพร้อมกัน แรงดันที่ใช้ร่วมกันตกแวบหนึ่ง
วิธีสังเกตว่าเกิด brown-out: โค้ดที่เริ่มด้วย setup() ทำอะไรที่เห็นได้ เช่น ปิดประตูบอล close_all_ball_gate() ถ้าเห็นประตูกระตุกปิดเองกลางภารกิจ แปลว่าบอร์ดเพิ่งรีเซ็ต
แนวทางแก้ ลำดับจากถูกไปแพง
- แยกไฟเซอร์โวตามข้อ 1
- เปลี่ยนสายไฟที่บางหรือหลวม สายบางมีความต้านทาน กระแสสูงทำให้แรงดันตกที่ตัวสาย
- เพิ่มตัวเก็บประจุคร่อมสายไฟ + และ GND ใกล้เซอร์โว (ค่าที่ใช้กันทั่วไปคือหลายร้อยไมโครฟารัด ลองตามที่มีในชมรม)
- ชาร์จแบตให้เต็มก่อนบิน แบตใกล้หมดแรงดันตกง่ายกว่า คู่มือชมรมให้ชาร์จเมื่อต่ำกว่า 11.1 V (แบต 3S LiPo)
รบกวนจากการสลับแรง
เซอร์โวเป็นมอเตอร์ มันสร้างสัญญาณรบกวนเข้าสายอื่นได้ โดยเฉพาะสาย I2C ที่คุยกับ FC ถ้าอ่านความสูงได้ค่า 0 เป็นช่วงๆ ลองดูว่าเกิดตอนเซอร์โวหมุนหรือไม่ ชมรมมีโค้ดป้องกันในทางซอฟต์แวร์ ตัวอย่างใน shooting.ino
// shooting.ino (reach_height_shoot_stable)
uint16_t h = read_height_cm();
if (h == 0 || h > 300) {
stableSince = 0;
continue;
}ถ้าค่าที่อ่านได้เป็น 0 หรือเกิน 300 cm โค้ดทิ้งค่านั้นแล้วอ่านใหม่ ไม่เชื่อค่าเพี้ยน
ลองทำ
- ใช้มัลติมิเตอร์วัดแรงดันไฟเลี้ยงเซอร์โวตอนว่าง และตอนเซอร์โวออกแรง จดความต่าง ถ้าตกเกิน 0.5 V ถือว่ามาก
- ถอดสาย GND ที่ต่อระหว่าง Nano กับไฟเซอร์โวออกบนโต๊ะ (ไม่ได้ติดโดรน) แล้วดูว่าเซอร์โวทำอะไร แล้วต่อกลับ
- รัน
test_release_the_ball()จากTest_ball.inoทีละท่อน บนโต๊ะ เพื่อเช็กว่าเซอร์โวสองตัวไปครบทุกท่า
พังตรงไหนบ่อย
- ต่อไฟเซอร์โวจาก 5V ของบอร์ด บอร์ดรีเซ็ตเมื่อเซอร์โวขยับ
- ลืมต่อ GND ร่วม เซอร์โวสั่น ขยับมั่ว
- ขั้วกลับ เซอร์โวร้อนหรือเสียทันที เช็กสีสายก่อนต่อ
- สายหลวมตอนสั่นสะเทือน อาการเกิดเฉพาะตอนบินแต่บนโต๊ะปกติ
- ใช้แบตต่ำกว่า 11.1 V แรงดันตกง่ายกว่าปกติ