> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/th/support/knowledge-base/mcu.md).

# ไมโครโปรเซสเซอร์ (MCU)

ไมโครคอนโทรลเลอร์ เฟิร์มแวร์ และ Bootloader คืออะไร

### MCU คืออะไร <a href="#mcu" id="mcu"></a>

MCU (Microcontroller Unit, ไมโครคอนโทรลเลอร์) คือหน่วยประมวลผลหลักบนบอร์ดตัวควบคุมการบิน ทำหน้าที่รันเฟิร์มแวร์ อ่านข้อมูลจากเซนเซอร์ คำนวณท่าทางการบินและเอาต์พุตควบคุม รวมถึงสื่อสารกับอุปกรณ์ต่อพ่วง เช่น GPS, เทเลเมทรี, ตัวรับสัญญาณ และ ESC

MCU สามารถมองได้ว่าเป็น "ศูนย์กลางการควบคุมแบบเรียลไทม์" ของระบบควบคุมการบินทั้งหมด ฟังก์ชันส่วนใหญ่ที่ผู้ใช้เห็นใน ArduPilot หรือเฟิร์มแวร์ตัวควบคุมการบินอื่นที่เข้ากันได้ เช่น การปรับเทียบเซนเซอร์ การคำนวณท่าทางการบิน เอาต์พุต PWM/DShot การตัดสิน Failsafe และการบันทึกข้อมูล ล้วนประสานงานและดำเนินการโดย MCU ในท้ายที่สุด

### MCU ทำหน้าที่อะไรบนตัวควบคุมการบิน <a href="#mcu--morakot" id="mcu--morakot"></a>

โดยทั่วไป MCU บนตัวควบคุมการบินจะรับผิดชอบงานต่อไปนี้:

* อ่านข้อมูลจากเซนเซอร์บนบอร์ด เช่น IMU บารอมิเตอร์ และแมกนีโตมิเตอร์
* รันลูปหลักของเฟิร์มแวร์ตัวควบคุมการบิน เพื่อประมาณท่าทางการบิน คำนวณตัวควบคุม และประมวลผลตรรกะภารกิจ
* จัดเตรียมอินเทอร์เฟซ เช่น UART, I2C, SPI และ CAN สำหรับเชื่อมต่อโมดูลภายนอก
* ควบคุมเอาต์พุตมอเตอร์ บัซเซอร์ LED และ I/O อื่น ๆ บนบอร์ด
* จัดการกระบวนการบูต Bootloader การอัปเดตเฟิร์มแวร์ และการเชื่อมต่อเพื่อดีบัก

สำหรับผู้ใช้ทั่วไป อาจไม่จำเป็นต้องควบคุม MCU โดยตรง แต่เมื่อท่านต้องการคอมไพล์เฟิร์มแวร์แบบกำหนดเอง ทำความเข้าใจการกำหนดขา แก้ไขปัญหาการสื่อสารผิดปกติ หรือแฟลชผ่าน ST-LINK แนวคิดพื้นฐานของ MCU จะมีความสำคัญมาก

### เหตุใดจึงควรทำความเข้าใจ MCU <a href="#mcu" id="mcu"></a>

การทำความเข้าใจ MCU ไม่ได้มีจุดประสงค์ให้ผู้ใช้ทุกคนต้องพัฒนาระดับล่าง แต่เพื่อให้สามารถระบุต้นเหตุของปัญหาได้รวดเร็วขึ้นในสถานการณ์ต่อไปนี้:

* ไม่สามารถแฟลชหรือบูตเฟิร์มแวร์ได้ตามปกติ
* อุปกรณ์ต่อพ่วง UART, I2C หรือ CAN บางตัวไม่ทำงาน
* เมื่อกำหนดค่าระดับบอร์ดเอง ต้องเทียบการกำหนดขาและการจัดสรรทรัพยากร
* เมื่อบอร์ดเข้าสู่กระบวนการ Bootloader, DFU หรือการแฟลชผ่าน ST-LINK ต้องตรวจสอบสถานะของ MCU

ตัวอย่าง: หากท่านสามารถเชื่อมต่อกับตัวควบคุมการบินผ่าน Mission Planner หรือเครื่องมืออื่นได้ แต่ GPS ไม่มีข้อมูล ปัญหาอาจไม่ใช่ "เฟิร์มแวร์เสีย" แต่อาจเป็นเพราะต่อ GPS ผิด UART ตั้งค่าพารามิเตอร์พอร์ตอนุกรมผิด หรือทรัพยากรขาของ MCU ที่ UART นั้นใช้ไม่ได้กำหนดค่าอย่างถูกต้อง

### ความแตกต่างระหว่าง MCU, CPU และ SoC ของตัวควบคุมการบิน <a href="#mcucpu--soc" id="mcucpu--soc"></a>

ในเอกสารเกี่ยวกับตัวควบคุมการบิน MCU หมายถึงไมโครคอนโทรลเลอร์ที่มีความสามารถในการควบคุมแบบเรียลไทม์ โดยทั่วไปจะรวมแกนประมวลผล Flash, RAM และอินเทอร์เฟซต่อพ่วงหลายชนิดไว้ในชิปเดียว

MCU แตกต่างจาก CPU ที่พบทั่วไปในคอมพิวเตอร์ตั้งโต๊ะหรือแพลตฟอร์มประมวลผลระดับสูง CPU มักพึ่งพาหน่วยความจำภายนอกและระบบปฏิบัติการ เหมาะสำหรับการคำนวณระดับสูง ส่วน MCU ให้ความสำคัญกับความเป็นเรียลไทม์ ความหน่วงต่ำ พฤติกรรมที่คาดการณ์ได้ และการควบคุม I/O ของฮาร์ดแวร์โดยตรง ซึ่งเป็นเหตุผลที่ตัวควบคุมการบินเลือกใช้ MCU เป็นตัวควบคุมหลัก

### ในระบบควบคุมการบิน MCU เชื่อมต่อกับอุปกรณ์ใดบ้าง <a href="#mcu" id="mcu"></a>

โดยทั่วไป MCU จะไม่ทำงานเพียงลำพัง แต่จะทำงานร่วมกับอุปกรณ์ต่อพ่วงหลายชนิดเพื่อสร้างระบบที่สมบูรณ์

อุปกรณ์ที่เชื่อมต่อโดยทั่วไป ได้แก่:

* IMU: ส่งข้อมูลความเร่งและความเร็วเชิงมุมผ่าน SPI หรือ I2C
* บารอมิเตอร์ แมกนีโตมิเตอร์: ให้ข้อมูลความสูงและทิศทาง
* โมดูล GPS / เข็มทิศ: มักเชื่อมต่อผ่าน UART, I2C หรือ CAN
* ตัวรับสัญญาณ RC: รับสัญญาณควบคุมผ่านอินเทอร์เฟซ เช่น SBUS, CRSF, IBUS
* ESC: ส่งคำสั่งควบคุมมอเตอร์ผ่านโปรโตคอล เช่น PWM, DShot
* การเชื่อมต่อสถานีควบคุมภาคพื้นดิน: สื่อสารกับ Mission Planner / QGroundControl ผ่าน USB หรือ UART เทเลเมทรี

นี่คือเหตุผลที่จำนวนอุปกรณ์ต่อพ่วงของ MCU การจัดสรรพอร์ตสื่อสาร และการวางแผนทรัพยากร เช่น DMA/Timer จะส่งผลโดยตรงต่อจำนวนฟังก์ชันที่บอร์ดตัวควบคุมการบินรองรับได้และความสามารถในการขยาย

### Bootloader และเฟิร์มแวร์หลัก <a href="#bootloader" id="bootloader"></a>

เมื่อสร้างบอร์ด ArduPilot แบบกำหนดเอง ห้ามข้ามขั้นตอนการคอมไพล์และการแฟลช Bootloader หลังจากนั้นจึงเป็นการกำหนดค่าและคอมไพล์เฟิร์มแวร์หลัก

สามารถเข้าใจ Bootloader ได้ว่าเป็น "โปรแกรมเริ่มต้นขนาดเล็กที่ทำงานก่อนหลังเปิดเครื่อง" โดยทั่วไปมีหน้าที่ดังนี้:

* กำหนดสถานะเริ่มต้นของฮาร์ดแวร์ขั้นพื้นฐานที่สุด
* จัดเตรียมช่องทางสำหรับแฟลชเฟิร์มแวร์
* ตัดสินใจว่าจะกระโดดไปรันเฟิร์มแวร์ตัวควบคุมการบินหลักหรือไม่

เมื่อบอร์ดไม่สามารถเข้าสู่เฟิร์มแวร์หลักได้ตามปกติ แนวทางแก้ไขปัญหาทั่วไปคือ ตรวจสอบก่อนว่ามี Bootloader อยู่หรือไม่ ระบบสามารถตรวจพบ USB/DFU ได้หรือไม่ และจำเป็นต้องแฟลชใหม่ผ่าน ST-LINK หรือไม่

### ทรัพยากรของ MCU ที่นักพัฒนาควรให้ความสนใจ <a href="#mcu" id="mcu"></a>

หากการใช้งานของท่านไม่ได้มีเพียงการตั้งค่าการบิน แต่ต้องดูแลการรองรับระดับบอร์ดของเฟิร์มแวร์ระบบบินอัตโนมัติ (Autopilot) หรือเฟิร์มแวร์แบบกำหนดเอง แนะนำให้ทำความเข้าใจทรัพยากรของ MCU ต่อไปนี้เป็นหลัก:

* Flash: เก็บอิมเมจของ Bootloader และเฟิร์มแวร์หลัก
* RAM: ข้อมูลขณะทำงาน บัฟเฟอร์ และพื้นที่สแตกของงาน
* UART: การเชื่อมต่อ GPS เทเลเมทรี ตัวรับสัญญาณ หรือคอมพิวเตอร์ภายนอก
* SPI / I2C: การสื่อสารกับเซนเซอร์บนบอร์ดและอุปกรณ์ต่อพ่วงภายนอก
* Timer / เอาต์พุต PWM: การควบคุมมอเตอร์ เซอร์โว บัซเซอร์ ฯลฯ
* USB / DFU / SWD: สำหรับการแฟลช การดีบัก และการกู้คืน

ในกระบวนการพอร์ตระดับบอร์ดของ ArduPilot ทรัพยากรเหล่านี้จะสะท้อนอยู่ในการตั้งค่า hwdef และนิยามบอร์ด ดังนั้น MCU จึงไม่ใช่เพียงชื่อฮาร์ดแวร์ แต่เป็นรากฐานหลักของการรองรับระดับบอร์ดทั้งหมด

### ควรพิจารณาสเปกของ MCU อย่างไร <a href="#morakot--mcu" id="morakot--mcu"></a>

สำหรับผู้ใช้ทั่วไป สิ่งสำคัญที่สุดของสเปก MCU ไม่ใช่ "ชื่อรุ่น" แต่คือ MCU นั้นเพียงพอที่จะรองรับความต้องการของภารกิจและการกำหนดค่าอุปกรณ์ต่อพ่วงของท่านหรือไม่

สามารถทำความเข้าใจได้ดังนี้:

| หัวข้อที่ควรพิจารณา     | ความหมายต่อผู้ใช้                                                                                      |
| ----------------------- | ------------------------------------------------------------------------------------------------------ |
| ความสามารถในการประมวลผล | ส่งผลต่อความเผื่อในการควบคุมความถี่สูง การกรองสัญญาณ การนำทาง และการทำงานพร้อมกันของฟังก์ชันที่ซับซ้อน |
| ความจุหน่วยความจำ       | ส่งผลต่อพื้นที่สำหรับฟังก์ชันของเฟิร์มแวร์ การบันทึกข้อมูล และความสามารถในการขยายในอนาคต               |
| จำนวน UART / CAN        | ส่งผลต่อจำนวน GPS เทเลเมทรี ตัวรับสัญญาณ หรืออุปกรณ์ต่อพ่วง DroneCAN ที่เชื่อมต่อพร้อมกันได้           |
| ทรัพยากร SPI / I2C      | ส่งผลต่อการกำหนดค่าเซนเซอร์และความยืดหยุ่นของโมดูลภายนอก                                               |
| วิธีการแฟลชและดีบัก     | ส่งผลต่อความสะดวกในการอัปเกรดเฟิร์มแวร์ การกู้คืน และการพัฒนาบำรุงรักษา                                |

### เมื่อใดจึงต้องจัดการกับ MCU โดยตรง <a href="#mcu" id="mcu"></a>

ในกระบวนการประกอบและจูนตามปกติ ผู้ใช้ไม่จำเป็นต้องควบคุม MCU โดยตรง

แต่ในกรณีต่อไปนี้ มักจะต้องเกี่ยวข้องกับงานที่เกี่ยวกับ MCU มากขึ้น:

1. เมื่อต้องคอมไพล์เฟิร์มแวร์ใหม่
2. เมื่อเฟิร์มแวร์เสียหาย ระบบไม่สามารถตรวจพบ USB ได้ตามปกติ และต้องกู้คืนด้วยการแฟลชผ่าน ST-LINK
3. เมื่อต้องตรวจสอบว่าอุปกรณ์ต่อพ่วงตัวหนึ่งเชื่อมต่อกับขา UART / SPI / I2C ชุดใดกันแน่
4. เมื่อต้องปรับแต่งระดับบอร์ด ตัดทอนฟังก์ชัน หรือดีบัก

### ความเข้าใจผิดที่พบบ่อย <a href="#undefined" id="undefined"></a>

**ความเข้าใจผิดที่ 1: MCU ยิ่งใหม่ ตัวควบคุมการบินยิ่งดีเสมอ**\
ไม่เสมอไป ประสิทธิภาพของตัวควบคุมการบินยังขึ้นอยู่กับการจ่ายไฟระดับบอร์ด การกำหนดค่าเซนเซอร์ คุณภาพการเดินสาย ความสมบูรณ์ของการรองรับเฟิร์มแวร์ และการวางแผน I/O

**ความเข้าใจผิดที่ 2: เพียงแฟลชเฟิร์มแวร์ได้ อุปกรณ์ต่อพ่วงทั้งหมดก็จะใช้งานได้แน่นอน**\
ไม่เสมอไป การที่อุปกรณ์ต่อพ่วงจะทำงานได้ตามปกติหรือไม่ ยังขึ้นอยู่กับว่าการแมปขาของ MCU การจัดสรรพอร์ตสื่อสาร การตั้งค่าพารามิเตอร์ และวิธีการต่อสายสอดคล้องกันหรือไม่

**ความเข้าใจผิดที่ 3: ปัญหาของ MCU ต้องถอดบอร์ดจึงจะรู้**\
ปัญหาจำนวนมากสามารถวินิจฉัยเบื้องต้นได้ก่อนจากสถานะเซนเซอร์บนสถานีควบคุมภาคพื้นดิน การตั้งค่าพอร์ตอนุกรม พฤติกรรมขณะบูต และโหมดการแฟลช

### ข้อควรระวัง <a href="#undefined" id="undefined"></a>

**ข้อควรระวัง:** ก่อนยืนยันการต่อสาย การจ่ายไฟ และเวอร์ชันเฟิร์มแวร์ อย่าเพิ่งตัดสินว่า MCU เสีย เมื่อตัวควบคุมการบินบูตไม่ได้ เชื่อมต่อไม่ได้ หรือเซนเซอร์ผิดปกติ สาเหตุที่พบบ่อยอาจเป็นการจ่ายไฟไม่เสถียร การต่อสายผิด หรือการตั้งค่าพารามิเตอร์ไม่ตรงกัน

**ข้อควรระวัง:** หากต้องใช้ ST-LINK, SWD หรือทำการแฟลชระดับล่าง โปรดเตรียมข้อมูลจุดเชื่อมต่อ เงื่อนไขแรงดันไฟฟ้า และเอกสารขั้นตอนที่เกี่ยวข้องก่อน เพื่อหลีกเลี่ยงความเสี่ยงเพิ่มเติมต่อบอร์ดในกรณีที่ต่อสายผิด
