เปิดกล่อง FRDM-MCXN947
ทาง Arrow Thailand กำลังจะจัด workshop ร่วมกับ TESA แนะนำไมโครคอนโทรลเลอร์ตระกูลใหม่ของค่าย NXP คือ ตระกูล MCX ที่มีฟีเจอร์ด้าน security และ network ที่ตอบโจทย์งานสาย Internet of Things เมื่อเทียบกับตระกูล LPC ข้อแตกต่างหลักน่าจะเป็นการเปลี่ยนส่วนคอร์เป็น ARM Cortex-M33 ที่มีกลไก memory protection มาด้วย
บอร์ดที่จะใช้ใน workshop ครั้งนี้คือ FRDM-MCXN947 ซึ่งเมื่อมองจาก portfolio จะเห็นว่าเอามาตอบโจทย์อุปกรณ์ IoT สเกลใหญ่หน่อย เพราะเลือก interface สำหรับ HMI และมีพอร์ท Ethernet มาด้วย แต่จุดเด่นที่เป็น key ของการใช้อักษร N นำหน้าหมายเลขรุ่นคือ neural processing unit (NPU) เพื่อเร่งความเร็วในการประมวลผล neural network ที่เป็น engine สำคัญของ machine learning และ AI เมื่อดูเทรนด์ในตลาดแล้ว NXP ก็จัด MCX N มาชนกับค่ายอื่นเพื่อตอบความต้องการของตลาดสำหรับอุปกรณ์ edge AI
แกะกล่องบอร์ด FRDM-MCXN947
ผมสนใจไมโครคอนโทรลเลอร์ในตระกูล MCX N ตรงที่รองรับ RTOS หลายค่าย รวมทั้ง RT-Thread ที่กำลังจะเซ็น MOU กับ TESA จึงอยากได้บอร์ดมาทดลองหน่อย ผมต้องขอบคุณทาง Arrow Thailand ที่ส่งบอร์ดมาให้ลอง จึงขอเอาประสบการณ์ในการใช้บอร์ดนี้ตั้งแต่เริ่มต้นมาเล่าให้ฟัง
บอร์ด FRDM-MCXN947 เป็นชุดพัฒนาที่ทาง NXP เตรียมไว้สำหรับให้ทดลองใช้ฟีเจอร์ต่างๆของตระกูล MCX N โดยตั้งราคาไว้ค่อนข้างถูก ($25) เมื่อเทียบกับฟีเจอร์ของทั้งชิพและตัวบอร์ดเอง ในกล่องเป็นเหมือนบอร์ดทดลองสมัยนี้คือ มีแค่ตัวบอร์ดและสาย USB C มาให้ ส่วนแผ่นพับในกล่องก็มีเนื้อหาแค่รายการของพอร์ทและขาสัญญาณต่างๆ ซึ่งมีเยอะมากเพราะตัวชิพเองเป็นแพคเกจแบบ BGA (หมดสิทธิบัดกรีเอง) แบบ 184 ขา ขนาดของบอร์ดใหญ่กว่าบอร์ด Arduino Mega นิดหน่อย โดยมี pin สำหรับบอร์ดเสริมมาทั้ง Arduino (ขยาย 2 แถวแบบ FRDM), mikroBus (ค่าย MIKROE) และ Pmod (ค่าย Digilent) เสียดายแต่ไม่มีหัวต่อ Grove ของค่าย SeeedStudio น่าจะเพราะไม่ได้สนใจอุปกรณ์จากค่ายจีน
ตัว MCX-N947 จัดเป็นพี่ใหญ่ของตระกูลเพราะมาด้วยสเปคที่จัดเต็มทั้งในแง่ของการมี ARM Cortex-M33 แบบ dual core ทำงานที่ 150 MHz มีส่วนเร่งความเร็วในการประมวลผลทั้ง DSP, NPU, DMA ในขณะที่กลุ่ม I/O ก็ให้มาครบ ซึ่งที่ผมชอบคือ ADC ความละเอียด 16 บิตที่สามารถแปลงแบบขนานด้วยอัตราสูงสุด 2 Msps ส่วนของ timer ก็แยก PWM และ encoder สำหรับงาน motor control มาให้เลย
จุดเด่นของตระกูล MCX N ในแง่ interface คือ พอร์ท Ethernet และส่วนเชื่อมต่อ HMI (จอภาพและกล้อง) ทาง NXP ได้ออก application note สาธิตการทดสอบบอร์ดนี้โดยเชื่อมต่อโมดูลกล้อง OV7670 กับหัวต่อ SmartDMA และจอ LCD-PAR-S035 กับหัวต่อ FlexIO แต่ในหน้าเว็บของบอร์ดยังไม่เห็น application note ของ Ethernet คงจะทยอยออกมาตามหลัง
บอร์ด FRDM-MCXN947 จะมีส่วน SWD debugger ของ NXP ที่เรียกว่า MCU-Link มาด้วย ซึ่งจะ compatible กับมาตรฐาน CMSIS-DAP ของ ARM ดังนั้นพอเสียบสาย USB-C กับพอร์ท USB ทางซ้ายของพอร์ท Ethernet ก็จะเห็นรายการของไดรเวอร์ MCU-Link แสดงในหน้าต่างของ Device Manager โดยไม่ต้องติดตั้งไดรเวอร์ของ MCU-Link (ผมเขียนโค้ดกับบอร์ด ARM หลายค่าย) นอกจากนี้ พอร์ทอนุกรมชื่อ USB Serial Device ก็จะแสดงขึ้นมาด้วย สำหรับคนที่เพิ่งจะมาลองเขียนโค้ดกับบอร์ด ARM คงจะต้องติดตั้งโปรแกรม LinkServer ของทางค่าย NXP ก่อน
ทดลองเขียนโค้ด
ไมโครคอนโทรลเลอร์ของ NXP สามารถพัฒนาได้ด้วยชุดเครื่องมือพัฒนาหลายค่าย เช่น MCUXpresso ของ NXP เอง, Keil MDK-ARM ของ ARM, หรือจะไปใช้ gcc ที่เป็นเครื่องมือแบบโอเพนซอร์สก็ได้
โปรแกรม MCUXpresso เป็นของค่าย NXP เองที่พัฒนาต่อยอดจากเครื่องมือโอเพนซอร์ส ได้แก่ gcc เป็น toolchain และ Eclipse เป็น IDE การใช้งานจะเริ่มจากการติดตั้ง SDK สำหรับบอร์ด FRDM-MCXN947 จากนั้นสามารถเลือกใช้ wizard ในการช่วยเตรียม config ต่างๆสำหรับกระบวนการเตรียม project และ build เฟิร์มแวร์
อีกตัวเลือกของ IDE คือ การใช้ MCUXpresso Extension สำหรับ Visual Studio Code ซึ่งหลังจากเลือกติดตั้ง Extension แล้วต้องมาทำตามขั้นตอนใน Welcome เพื่อติดตั้ง Toolchain และ Repository ของซอร์สโค้ดต่างๆเอง สำหรับคนที่ทำงานบน VS Code อาจจะคุ้นเคยรูปแบบของ IDE มากกว่าสไตล์ของ Eclipse ก็ได้ แม้จะวุ่นวายไปหน่อย คำเตือนคือ การติดตั้งเครื่องมือบางตัวจะต้องไปลงทะเบียนกับเว็บ NXP ก่อนด้วย email เพราะบางตัวที่ไม่โอเพนซอร์สจะต้อง accept ไลเซนส์
ผมเลือกติดตั้งเฉพาะตัวเลือกที่จำเป็นคือ MCUXpresso SDK Developer ซึ่งก็จะมาพร้อมกับ ARM GNU Toolchain, LinkServer (ส่วนเสริม debugger) และ MCUXpresso Config Tools (สำหรับตั้งค่าขาและฟีเจอร์ต่างๆ) ขั้นตอนถัดไปคือ การเตรียม software repository ที่รวมโค้ดต่างๆ (core, svd, rtos, middleware) โดยเลือกได้ว่าจะติดตั้งจาก github หรือจะติดตั้งแบบ local จากไฟล์ที่ดาวน์โหลด
หลังจากติดตั้ง SDK และ repository แล้ว เราจะสามารถเลือกสร้าง project ได้ 2 แบบคือ การ import โค้ดตัวอย่างจาก repository และโปรแกรม MCUXpresso Config Tools ที่จะสร้าง project จากเงื่อนไขของฮาร์ดแวร์ที่เราตั้งค่า ผมลองเลือกการสร้าง project ผ่าน MCUXpresso Config Tools เพราะอยากดูว่าจะแตกต่างจากค่ายอื่น เช่น STM32CubeMX อย่างไร ความรู้สึกแรกคือ ตาลายเมื่อเห็นรายการของกลุ่มขาและฟังก์ชัน เพราะการเป็นแพคเกจ BGA ที่แตกต่างจากกลุ่ม SMT เช่น LQFP ที่ขาจะออกมาข้างๆพอให้นับหมายเลขได้
ตัวเลือกของ toolchain อีก 1 ค่ายคือ Keil MDK-ARM ของ ARM เอง ซึ่งจะสามารถเลือกติดตั้ง pack ของ MCX-N947 ได้ พอเอาโค้ดตัวอย่าง LED blink สำหรับ Keil µVision (ตัวเลือก Keil Studio จะเป็นรุ่นที่ใช้ใน VS Code) มาลอง ก็สามารถ build และ flash ลงบอร์ดได้เลย
ตอนทดลองสร้าง project จาก เองจะงงหน่อย เพราะติด error ไปหลายรายการทั้งในส่วนของการ compile ไม่ผ่าน ซึ่งพอเพิ่ม SDK Drivers ก็พ้นจาก error แต่ไปเจอ error จาก linker ที่แจ้งว่าไม่ได้ประกาศ memory section แทน เลยต้องกลับไปดูใน setting ของโค้ด LED blink จึงเห็นว่ามีการตั้งค่าหลายอย่าง เช่น SDK driver, memory, compiler และ linker ที่มีรายละเอียดค่อนข้างเยอะ ดังนั้น หากใครที่ต้องการ ARM compiler ที่น่าจะสร้างโค้ดได้ดีกว่า gcc อาจต้องเริ่มจากโค้ดตัวอย่างก่อนจะดีกว่า
NPU ใน MCU?
NPU ที่อยู่ใน MCX-N947 คือ eIQ Neutron เป็น proprietary ของ NXP เอง โดยประกอบด้วย pipe แบบขนาน 4 ชุดของตัว MAC (Multiply-And-Accumulate) แบบ INT8 จำนวน 4 ตัว ตัว NPU นี้เมื่อทำงานที่ความถี่ 150 MHz จะได้ขีดความสามารถ 4.8 GOPS (giga-operation per second) ข้อจำกัดหลักของการใช้ eIQ Neutron คือ การรองรับเฉพาะ operation (เช่น convolution, sigmoid, softmax, …) ที่เป็นแบบ INT8 เท่านั้น ทำให้ model ที่จะมาใช้ได้กับ NPU ตัวนี้ต้อง quantize, pruning และ validate ในแง่ accuracy ก่อน สำหรับ performance ตอนทำงานจริงจะขึ้นอยู่กับขนาดและความซับซ้อน model เช่น หากใช้ MobileNetV1 ที่ quantize เป็น INT8 กับข้อมูลรูปความละเอียด 224x224 ต้องการการคำนวณประมาณ 1.2 GOps เมื่อนำมาคิดเทียบกับ 4.8 GOPS ก็จะได้ประมาณ 4 frame/sec ตัวเลขนี้ถือว่าน่าสนใจเพราะ Raspberry Pi 3 (ARM Cortex-A53) แบบ CPU only จะได้ประมาณ 1–2 frame/sec เท่านั้น
NXP เตรียมโปรแกรม eIQ Toolkit สำหรับพัฒนาซอฟต์แวร์ที่ใช้ NPU โดยรองรับทั้งการสร้าง model ใหม่ หรือจะแปลงจาก model ในรูปแบบ ONNX และ TensorFlow Lite ให้เป็น model แบบ Neutron ที่ใช้กับ NPU ได้
ตอนลองเลือกสร้าง model ใหม่แต่เจอเฉพาะกลุ่ม vision ซึ่งยังทำอะไรไม่ได้ เพราะไม่มีโมดูลกล้อง OV7670 เลยไปลอง browse หาโค้ดตัวอย่างด้วย SDK Import Wizard ใน MCUXpresso IDE แล้วเจอโค้ดตัวอย่างสำหรับ model แบบ CIFAR-10 ที่เป็น vision classifier สำหรับรูปภาพขนาดเล็ก (32x32) เลยขอเอามาลอง build ดูการทำงานก่อน
พอเลือก tflm_cifar10 ในกลุ่ม eiq_examples แล้ว MCUXpresso ก็นำเข้า project เข้ามาใน workspace แล้วก็ build และ debug ได้เลย การแสดงผลจะผ่าน serial port ซึ่งในโค้ดจะใช้ UART เชื่อมผ่าน MCU-Link จึงสามารถทดสอบได้เลย โดยไม่ต้องสลับสาย USB ผลของการ inference ก็ถือว่า ok สำหรับเวลา 6 มิลลิวินาที โดยใช้ข้อมูลรูปที่ฝังลงในโค้ดเลย
終わりに (ในตอนท้าย)
ผมเขียนบทความนี้เพื่อแนะนำบอร์ด FRDM-MCXN947 แบบเบื้องต้นก่อน ซึ่งประสบการณ์โดยรวมคือ หากใช้ MCUXpresso ที่เป็น IDE ของ NXP เอง น่าจะง่ายหน่อยในการเริ่ม ส่วนฟีเจอร์ของ eIQ Neutron จากโค้ดตัวอย่างที่สาธิตด้วย model แบบ CIFAR-10 ก็ถือว่า ok หากจะมาใช้เป็น edge AI พอดีเวลาที่เขียนบทความนี้ค่อนข้างจำกัดเพราะอยู่ในช่วงมาสัมมนาของภาควิชาฯ เลยยังไม่ได้เจาะในมุมมองอื่นๆ เช่น ความแม่นยำของ model หรือการปรับไปใช้ custom model และก็คงต้องศึกษาเพิ่มเติมในส่วนการสร้าง model สำหรับเซ็นเซอร์แบบอื่นด้วย
สำหรับใครที่สนใจและอยากลองบอร์ดนี้ว่าจะเอามาใช้กับงานตัวเองได้ไหม ก็ขอประชาสัมพันธ์กิจกรรม workshop ที่ร่วมกันระหว่าง TESA x Arrow Thailand x NIA ในวันที่ 28 สิงหาคม 2567 โดยจะจัดที่ห้องอบรม สำนักงานนวัตกรรมแห่งชาติ ถนนโยธี ซึ่งเดินทางไม่ยากเพราะลงที่สถานี BTS อนุสาวรีย์ชัยสมรภูมิ