ชมรมโดรน

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 เดียวกัน มันไม่มีจุดอ้างอิง ก็ตีความสัญญาณไม่ได้

ไฟเลี้ยงเซอร์โวแยก แต่ต้องใช้กราวด์ร่วมกับ Nanoแบตเตอรี่ให้ไฟ 5 ถึง 6 โวลต์แก่เซอร์โว สายสัญญาณจาก Nano ต้องมีกราวด์เส้นเดียวกันเป็นจุดอ้างอิงArduino Nanoขาสัญญาณ D11ไฟ 5–6 Vแยกสำหรับเซอร์โวเซอร์โวสาย 3 เส้น:สัญญาณ · + · GNDสัญญาณ PWM+5–6 VGND ร่วมไม่มีเส้น GND นี้ เซอร์โวไม่รู้ว่า "สูง" ของสัญญาณวัดจากไหน
ไฟบวกแยกกัน (เส้นแดง) แต่ GND (เส้นดำ) ต้องเป็นจุดเดียวกัน สายสัญญาณ (เส้นฟ้า) ออกจาก Nano ตรงไปเซอร์โว

อาการเมื่อกราวด์ไม่ร่วม: เซอร์โวสั่นเอง ขยับสุ่ม หรือไม่ขยับเลย ทั้งที่ค่าพัลส์ในโค้ดถูก

3. ไฟตก (brown-out)

ชิปทำงานได้เมื่อแรงดันไม่ต่ำกว่าเกณฑ์ ATmega328P บน Nano มีวงจรตรวจที่จะ รีเซ็ตตัวเอง เมื่อไฟตกต่ำกว่าเกณฑ์ (เรียก brown-out) ตัวเลขเกณฑ์ขึ้นกับค่าตั้งของบอร์ด ไม่มีในไฟล์โค้ดของชมรม แต่หลักการคือเมื่อแรงดันตกต่ำเกินไป ชิปจะเริ่มโปรแกรมใหม่จาก setup()

สาเหตุที่เจอกับโดรน: ตอนมอเตอร์ออกตัวหรือเซอร์โวหมุนแรงๆ ดึงกระแสมากพร้อมกัน แรงดันที่ใช้ร่วมกันตกแวบหนึ่ง

แรงดันไฟของบอร์ดตกตอนมอเตอร์ดึงกระแสแรงดัน 5 โวลต์ตกต่ำกว่าเกณฑ์ชั่วขณะ บอร์ดรีเซ็ตแล้วเริ่มโปรแกรมใหม่5 V4 V3 Vต่ำกว่าเส้นนี้ ชิปรีเซ็ตมอเตอร์ออกตัวโปรแกรมเริ่มใหม่จาก setup()เวลา →
แรงดัน 5 V ตกวูบเมื่อมอเตอร์ออกตัว ถ้าตกต่ำกว่าเส้นแดง ชิปรีเซ็ตแล้ว setup() รันใหม่ ภาพนี้เป็นภาพประกอบหลักการ ไม่ใช่ค่าที่วัดจากโดรน

วิธีสังเกตว่าเกิด brown-out: โค้ดที่เริ่มด้วย setup() ทำอะไรที่เห็นได้ เช่น ปิดประตูบอล close_all_ball_gate() ถ้าเห็นประตูกระตุกปิดเองกลางภารกิจ แปลว่าบอร์ดเพิ่งรีเซ็ต

แนวทางแก้ ลำดับจากถูกไปแพง

  1. แยกไฟเซอร์โวตามข้อ 1
  2. เปลี่ยนสายไฟที่บางหรือหลวม สายบางมีความต้านทาน กระแสสูงทำให้แรงดันตกที่ตัวสาย
  3. เพิ่มตัวเก็บประจุคร่อมสายไฟ + และ GND ใกล้เซอร์โว (ค่าที่ใช้กันทั่วไปคือหลายร้อยไมโครฟารัด ลองตามที่มีในชมรม)
  4. ชาร์จแบตให้เต็มก่อนบิน แบตใกล้หมดแรงดันตกง่ายกว่า คู่มือชมรมให้ชาร์จเมื่อต่ำกว่า 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 โค้ดทิ้งค่านั้นแล้วอ่านใหม่ ไม่เชื่อค่าเพี้ยน

ลองทำ

  1. ใช้มัลติมิเตอร์วัดแรงดันไฟเลี้ยงเซอร์โวตอนว่าง และตอนเซอร์โวออกแรง จดความต่าง ถ้าตกเกิน 0.5 V ถือว่ามาก
  2. ถอดสาย GND ที่ต่อระหว่าง Nano กับไฟเซอร์โวออกบนโต๊ะ (ไม่ได้ติดโดรน) แล้วดูว่าเซอร์โวทำอะไร แล้วต่อกลับ
  3. รัน test_release_the_ball() จาก Test_ball.ino ทีละท่อน บนโต๊ะ เพื่อเช็กว่าเซอร์โวสองตัวไปครบทุกท่า

พังตรงไหนบ่อย

  • ต่อไฟเซอร์โวจาก 5V ของบอร์ด บอร์ดรีเซ็ตเมื่อเซอร์โวขยับ
  • ลืมต่อ GND ร่วม เซอร์โวสั่น ขยับมั่ว
  • ขั้วกลับ เซอร์โวร้อนหรือเสียทันที เช็กสีสายก่อนต่อ
  • สายหลวมตอนสั่นสะเทือน อาการเกิดเฉพาะตอนบินแต่บนโต๊ะปกติ
  • ใช้แบตต่ำกว่า 11.1 V แรงดันตกง่ายกว่าปกติ

On this page