แนวทางการเรียนรู้: Embedded Systems — Microcontroller Programming

<rawat.s>
4 min readJan 27, 2020

--

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

การออกแบบและพัฒนา “ระบบสมองกลฝังตัว” (Embedded System Design & Development) โดยส่วนใหญ่แล้ว ก็จะเกี่ยวข้องกับการใช้งานไมโครคอนโทรลเลอร์ (Microcontrollers หรือ MCUs) และถ้าเราจะเริ่มต้นเรียนรู้การเขียนโปรแกรมไมโครคอนโทรลเลอร์ ลองมาดูตัวอย่างประเด็นในการพิจารณาและเป็นแนวทางสำหรับผู้ที่เริ่มต้น

  1. การเลือกไมโครคอนโทรลเลอร์ (Selection of MCU Devices)
  2. การเลือกภาษาคอมพิวเตอร์และเครื่องมือสำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ (Selection of Programming Languages and Tools)
  3. การเลือกบอร์ดไมโครคอนโทรลเลอร์สำหรับการทดลองใช้งาน (Selection of Microcontroller Development or Evaluation Boards)
  4. แหล่งความรู้ (Sources of Knowledge)

การเลือกไมโครคอนโทรลเลอร์ (Selection of MCU Devices)

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถ้าจะเลือกตามสถาปัตยกรรมของซีพียู (CPU Architecture) ของไมโครคอนโทรลเลอร์ ก็มีตัวอย่างเลือกอย่างเช่น

  • ตระกูล ARM Cortex-M Series: เป็นสถาปัตยกรรมของซีพียูที่มีขนาด 32 บิต และออกแบบโดยบริษัท ARM Ltd. และแบ่งออกได้เป็นหลายตระกูลย่อย เช่น Cortex-M0/M0+, Cortex M3, Cortex-M4F และ Cortex-M7 เป็นต้น ในปัจจุบันก็มีหลายบริษัทที่ได้เลือกใช้ซีพียูของบริษัท ARM นำไปออกแบบและผลิตชิปไมโครคอนโทรลเลอร์ เช่น STMicroelectronics, NXP/Freescale, Nordic Semiconductors, Texas Instruments (TI), Atmel, Cypress Semiconductor เป็นต้น และถือว่าเป็นกลุ่มใหญ่ในตลาดปัจจุบัน
  • ตระกูล RISC-V: มีสถาปัตยกรรมทั้งแบบซีพียูแบบ 32 บิต และ 64 บิต และถือว่าเป็น Open-source CPU Instruction Set Architecture (ISA) มีจุดเริ่มต้นโดยทีมนักพัฒนาจากมหาวิทยาลัย Univ. of California, Berkeley, USA และบริหารจัดการโดย RISC-V Foundation ปัจจุบันก็เริ่มมีบริษัทที่ได้ออกแบบและผลิตชิปไมโครคอนโทรลเลอร์โดยใช้ RISC-V Core (32 บิต) เช่น บริษัท SiFive Inc. (USA) และ GigaDevice (China) เป็นต้น
  • ไมโครคอนโทรลเลอร์ของบริษัท Atmel / Microchip: ได้แก่ AVR (TinyAVR, megaAVR, XMEGA) ซึ่งเป็นไมโครคอนโทรลเลอร์ที่ใช้ซีพียูขนาด 8 บิต และได้รับความนิยมจนถึงปัจจุบัน เนื่องจาก ชิป AVR นี้ได้มีการนำไปใช้เป็นตัวประมวผลสำหรับบอร์ด Arduino ในยุคแรก ๆ เช่น Uno, Nano, Leonardo, MEGA2560 เป็นต้น
  • ไมโครคอนโทรลเลอร์ของบริษัท Texas Instruments เช่น MSP430 (16-bit) เป็นต้น แต่ถ้าเป็น 32 บิต ก็จะเลือกใช้ตระกูล ARM Cortex-M Series รวมถึงตัวเลือกแบบ SoC ที่มีตัวซีพียูและได้รวมวงจรสื่อสารไร้สายหลายย่านความถี่ (Sub-1GHz และ 2.4GHz) เอาไว้ด้วย
  • ไมโครคอนโทรลเลอร์ของบริษัท Microchip เช่น PIC10F, PIC12F, PIC16F, PIC18F (8-bit), PIC24F, dsPIC30F / dsPIC33F (16-bit), PIC32 MM/MX/MZ (32-bit) เป็นต้น
  • ESP8266ES และ ESP32-S (Tensilica Xtensa CPU Cores) ที่ใช้ซีพียู 32 บิต และผู้ออกแบบและผลิตชิปคือ บริษัท Espressif Systems ในประเทศจีน และได้รับความนิยมอย่างมากในปัจจุบัน เนื่องจากมีราคาไม่แพง เป็นชิปที่รองรับการสื่อสารไร้สายคลื่น 2.4GHz เช่น WiFi และ Bluetooth เหมาะสำหรับงานด้าน IoT
ตัวอย่างบอร์ดไมโครคอนโทรลเลอร์ที่สามารถเสียบขาลงบนเบรดบอร์ดได้

จากที่ได้ยกตัวอย่างไป เราจะเห็นได้ว่า มีตัวเลือกค่อนข้างมากเลย ถ้าเราตัดสินใจเลือกใช้ไมโครคอนโทรลเลอร์ตามสถาปัตยกรรมของซีพียู และตระกูลของไมโครคอนโทรลเลอร์ได้แล้ว ยังมีประเด็นให้ต้องพิจารณาอีก เช่น

  • การเลือกขนาดหน่วยความจำภายใน (On-chip Memory Capacity) ทั้งแบบ Flash และแบบ SRAM ให้เหมาะสมกับการนำไปใช้งาน ซึ่งก็ขึ้นอยู่กับความซับซ้อนของเฟิร์มแวร์ (Firmware) ที่จะต้องพัฒนาและนำไปใช้กับไมโครคอนโทรลเลอร์เป้าหมาย
  • ความเร็วสูงสุดในการประมวลผล (max. CPU Frequency) ถ้าจะเน้นการใช้งานที่ต้องการความเร็วในการประมวลผลสูง เช่น การประมวลสัญญาณดิจิทัล (Digital Signal Processing: DSP) หรืองานด้าน Embeded Machine Learning (eML) / TinyML สำหรับ Edge ML/AI หรือ AIoT เป็นต้น ความสามารถในการทำงานแบบ DMA (Direct Memory Access) เพื่อช่วยในการสื่อสารและถ่ายโอนข้อมูลระหว่างส่วนต่าง ๆ ภายในชิปได้อย่างรวดเร็ว ก็เป็นประเด็นที่ควรพิจารณา
  • การใช้กำลังไฟฟ้าต่ำในการทำงาน (Lower Power Consumption) ถ้าจะเน้นการทำงานที่ประหยัดพลังงาน เข้าสู่ Sleep Mode ใช้ปริมาณกระแสไฟฟ้าในระดับไมโครแอมป์ (uA)
  • การเชื่อมต่อกับอุปกรณ์อื่น ๆ ภายนอก เช่น การเชื่อมต่อกับชิปหน่วยความจำภายนอกที่จะต้องใช้ขา I/O จำนวนมาก หรือ การเชื่อมต่อแบบบัสในรูปแบบต่าง ๆ เช่น USART, I2C, SPI, CAN, USB และ Ethernet เป็นต้น
  • การรองรับการสื่อสารแบบไร้สายด้วยคลื่นวิทยุ เช่น Wi-Fi, Bluetooth (BLE, Bluetooth Mesh), IEEE 802.15.4/ZigBee, OpenThread เป็นต้น โดยเฉพาะอย่างยิ่งในยุค IoT และโดยทั่วไป เราก็เรียกชิปประเภทนี้ว่า SoC ซึ่งเป็นไมโครคอนโทรลเลอร์ที่ได้รวมวงจรสื่อสารไร้สายไว้ในชิปเดียวกัน

การเลือกภาษาคอมพิวเตอร์และเครื่องมือสำหรับการเขียนโปรแกรมไมโครคอนโทรลเลอร์ (Selection of Programming Languages and Tools)

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ภาษาคอมพิวเตอร์ระดับสูง (High-Level Programming Languages) ที่ได้มีการนำมาใช้สำหรับเขียนโปรแกรมไมโครคอนโทรลเลอร์ในปัจจุบัน นอกเหนือจากภาษา C/C++ แล้วก็ยังมีภาษาประเภท Scripting Languages แต่จะเน้นใช้งานสำหรับ MCU ขนาด 32 บิต เป็นหลัก

  • Embedded C/C++
  • Arduino C/C++
  • MicroPython / CircuitPython (Python3 for microcontrollers)
  • Espruino (JavaScript for microcontrollers)
  • Microsoft MakeCode / Static Type Script (STS)
  • Lua scripting language
  • TinyGo (Golang for microcontrollers)
  • Rust for microcontrollers
  • C# for .NET Micro framework (NETMF)

โดยทั่วไปแล้ว เราก็จะใช้ภาษา (Embedded) C/C++ ในการเขียนโปรแกรมสำหรับไมโครคอนโทรลเลอร์ แต่ก็ยังมีภาษาอื่นให้เลือกใช้ แต่ก็ใช่ว่าจะใช้กับไมโครคอนโทรลเลอร์ใด ๆ ก็ได้ ยกตัวอย่างเช่น ภาษาในกลุ่ม Scripting Languages ผู้พัฒนาอาจจะทำให้รองรับเฉพาะไมโครคอนโทรลเลอร์บางตระกูลเท่านั้น

การเลือกใช้ภาษาในกลุ่ม Scripting Languages แทนการใช้ภาษา C/C++ สำหรับผู้ที่เริ่มต้น ก็น่าสนใจไม่น้อย หลายคนอาจเริ่มต้นเรียนรู้โดยใช้ภาษาอื่นที่ไม่ใช่ C/C++ อาจเป็น Python หรือ JavaScript / Node.js ดังนั้นถ้ามีพื้นฐานความรู้และทักษะในการใช้ภาษาในกลุ่ม Scripting Languages มาบ้างแล้ว ก็อาจจะช่วยในการเรียนรู้หลักการทำงานของไมโครคอนโทรลเลอร์และฮาร์ดแวร์ได้เร็ว

ในส่วนของเครื่องมือสำหรับการพัฒนา (Development Tools) แบ่งออกได้เป็นหลายประเภท ทั้งซอฟต์แวร์และฮาร์ดแวร์ ได้แก่

  • C/C++ Toolchain เช่น GCC toolchain for ARM processors (Open-Source) นอกเหนือจาก Compiler แล้ว ก็รวมถึง Build Tools ต่าง ๆ ที่ใช้งานในลักษณะ Command-line (เช่น CMake / Makefile)
  • Offline IDE (Integrated Development Environment) เช่น Eclipse-based IDE หรืออื่น ๆ ที่พัฒนาโดยผู้ผลิต หรือเป็น Open-Source เช่น PlatformIO และ Visual Studio Code (VSCode) เป็นต้น
  • Cloud-based IDE: ในปัจจุบันเริ่มมีการให้บริการผ่าน Web browser ในลักษณะนี้ เช่น TI CCS (Cloud-based), Arduino Create และ ARM mbed Online Compiler เป็นต้น
  • Device Programmer / On-chip Debugger (Hardware & Software): เกี่ยวข้องกับการอัปโหลดโปรแกรม .hex/.bin ไปยังบอร์ดไมโครคอนโทรลเลอร์ (เขียนข้อมูลลงใน Program Flash Memory) และรวมถึงการดีบัก (Debug) ทดสอบการทำงานของโปรแกรมขณะที่ทำงานโดยใช้ฮาร์ดแวร์จริง แต่ต้องใช้อุปกรณ์ เช่น JTAG / SWD Debug Probe หรือ In-Circuit Debugger ของแต่ละผู้ผลิตไมโครคอนโทรลเลอร์ที่แตกต่างกันไป
  • Virtual Prototyping / Simulation-based Environment: เป็นซอฟต์แวร์จำลองการทำงานของไมโครคอนโทลเลอร์ในระดับชุดคำสั่ง (Cycle-Accurate Instruction Set Simulator: ISS) และอาจรวมถึงวงจรอิเล็กทรอนิกส์ต่าง ๆ ที่นำมาต่อวงจรใช้งานร่วมกัน โดยยังไม่ต้องใช้ฮาร์ดแวร์จริง ก็สามารถทดสอบหรือตรวจสอบความถูกต้องในการทำงานของโค้ดได้
  • Bootloaders / Libraries / HALs (Hardware Abstraction Layers) / APIs: เป็นส่วนที่จะช่วยใช้นักพัฒนาหรือโปรแกรมเมอร์ทำงานได้ง่ายขึ้น
  • RTOS (Real-Time Operating System): ระบบปฏิบัติการเวลาจริง หรือ (หรือ แบบทันที) มีทั้งแบบ Commercial (เช่น ARM-Keil RTX) และ Open-Source (เช่น AWS FreeRTOS และ ARM-mbed OS) และเป็นอีกหนึ่งตัวเลือกที่ควรได้เรียนรู้ เพราะการใช้งาน RTOS ในการพัฒนาระบบสมองกลฝังตัวที่มีความซับซ้อนสูง อาจช่วยให้นักพัฒนาเขียนโค้ดและจัดการได้ง่ายขึ้น และทำให้ระบบสามารถทำงานได้อย่างมีประสิทธิภาพและตอบสนองได้ทันเวลา

การเลือกบอร์ดไมโครคอนโทรลเลอร์สำหรับการทดลองใช้งาน (Selection of Microcontroller Development or Evaluation Boards)

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เมื่อได้พิจารณาเลือกตัวอุปกรณ์หรือ MCU Device แล้ว ถัดไปก็คงจะต้องเลือกบอร์ดไมโครคอนโทรลเลอร์มาฝึกเขียนโปรแกรม ให้ลองสำรวจหรือสืบค้นจากอินเทอร์เน็ต เพื่อดูว่า มีบอร์ดไมโครคอนโทรลเลอร์แบบใดให้เลือกใช้ได้บ้าง แตกต่างกันอย่างไร อาจเปรียบเทียบข้อมูลเชิงเทคนิคต่าง ๆ รวมถึงศึกษาและเปรียบเทียบผังวงจร (Schematic) ของบอร์ดเหล่านั้นที่ใช้ชิปไมโครคอนโทรลเลอร์เหมือนกัน (ถ้าเป็นไปได้ เช่น ในกรณีของบอร์ดที่เป็น Open-Source Hardware : OSHW จะมีไฟล์ Schematic & PCB Layout ให้ดาวน์โหลด)

ตัวอย่างบอร์ด NUCLEO ของ STMicroelectronics ที่ได้รวมวงจร ST-LINK/V2 (SWD) ไว้แล้ว

บริษัทที่ผลิตชิปไมโครคอนโทรลเลอร์ ก็มักจะพัฒนาและจำหน่ายบอร์ดไมโครคอนโทรลเลอร์ เพื่อเปิดตลาดและสร้างความสะดวกแก่ผู้ใช้ในการทดลองใช้งานไมโครคอนโทรลเลอร์รุ่นใหม่ ๆ อาจเรียกว่า Evaluation Kits หรือ Development Kits เป็นต้น

บอร์ดไมโครคอนโทรลเลอร์หลาย ๆ แบบ ก็ถือว่า มีราคาไม่แพง และมีหลายแบบให้เลือกใช้ (ยกตัวอย่างเช่น บอร์ดของบริษัท STMicroelectronics และ TI เป็นต้น) บางบอร์ดได้รวมวงจรที่ทำหน้าที่เป็น Device Programmer / Debugger ไว้ด้วย เช่น สื่อสารด้วยโปรโตคอล JTAG/SWD ได้ และสามารถเขียนโปรแกรมและอัปโหลดผ่านทางพอร์ต USB ได้ค่อนข้างสะดวกต่อการใช้งาน

แหล่งความรู้ (Sources of Knowledge)

‍‍‍‍‍‍ ‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ประเด็นสุดท้ายที่จะกล่าวถึงและถือว่าสำคัญเช่นกัน ก็คือ “แหล่งความรู้” นอกเหนือจากเอกสารจากผู้ผลิต เช่น Datasheets, User Manuals, Application Notes (AppNotes) และ Design Examples แล้ว ให้ลองสำรวจและสืบค้นจากอินเทอร์เน็ต เช่น หนังสือ (รวมถึง ebook) และแหล่งความรู้ออนไลน์ (เช่น วิดีโอ หรือ web blogs) ที่แนะนำหรือสอนการใช้งาน และเขียนโปรแกรมไมโครคอนโทรลเลอร์หรือบอร์ดตามที่ได้เลือกใช้งาน และโค้ดหรือโปรเจกต์ตัวอย่างที่สามารถนำไปลองศึกษาและทำตามได้

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

โดยสรุป… เราได้เรียนรู้ 4 ประเด็นหลักที่ได้ยกมาเป็นตัวอย่างในบทความนี้ และใช้เป็นแนวทางในการพิจารณาเลือกอุปกรณ์และเรียนรู้เกี่ยวกับไมโครคอนโทรลเลอร์ หวังว่าจะเป็นประโยชน์ต่อผู้ที่สนใจและเริ่มต้นศึกษา

ผู้เขียนหวังว่า จะเป็นประโยชน์ต่อผู้ที่สนใจ เริ่มต้นเรียนรู้การเขียนโปรแกรมไมโครคอนโทรลเลอร์สำหรับระบบสมองกลฝังตัวนะครับ

Creative Commons, Attribution-Non Commercial-Share Alike 4.0 International (CC BY-NC-SA 4.0)

--

--