[TH] How to build MicroPython for SAM-D21.

หลังจากที่ได้แนะนำบอร์ดไมโครคอนโทรลเลอร์ SAM-D21 ดังภาพที่ 1 และการใช้ ADC/DAC ของชิพตัวนี้ที่เป็นไมโครคอนโทรลเลอร์สถาปัตยกรรม ARM 32 บิต แบบ Cortex-M0+ ในครั้งนี้เรามาลองคอมไพล์และใช้ภาษาไพธอนสำหรับบอร์ดตัวนี้กัน

ภาพที่ 1 บอร์ด SAM-D21

ขั้นตอน

ในการทดลองนี้เลือกใช้ระบบปฏิบัติการ Linux Mint และสิ่งที่ต้องมีก่อนคอมไพล์คือชุดคอมไพล์ของ ARM ซึ่งสั่งติดตั้งด้วยคำสั่งต่อไปนี้

sudo apt install gcc-arm-none-eabi

ดาวน์โหลด

ให้ดาวน์โหลดไฟล์ต้นฉบับของ MicroPython จาก github ด้วยคำสั่งต่อไปนี้

git clone --recurse-submodules https://github.com/micropython/micropython.git

ตัวอย่างผลลัพธ์ของการทำงานเป็นดังภาพที่ 2

git clone --recurse-submodules https://github.com/micropython/micropython.git
ภาพที่ 2 ตัวอย่างผลลัพธ์จากการสั่ง git clone

เมื่อดาวน์โหลดเป็นที่เรียบร้อยให้ใช้คำสั่งย้ายเข้าไปในโฟลเดอร์ของ micropython ดังนี้

cd ~/micropython

คอมไพล์ mpy-cross

ตัวคอมไพล์ภาษาไพธอนของ MicroPython หรือ mpy-cross ให้เป็นไบต์โค้ดที่มีนามสกุลเป็น .mpy ซึ่งมีประโยชน์ในแง่ของการทำให้โค้ดนั้นมีขนาดเล็กลงสะดวกต่อการนำไปใช้เนื่องจากประหยัดพื้นที่ของรอม/แรม และไม่ต้องประมวลผลขณะที่เรียกทำงาน นอกจากนี้ ในการคอมไพล์ MicroPython เองก็ต้องใช้ตัว mpy-cross ด้วยเช่นกัน ดังนั้น สิ่งที่ต้องทำในขัเนตอนที่ 2 คือ คอมไพล์ mpy-cross เพื่อเป็นเครื่องมือสำหรับคอมไพล์ MicroPython ต่ออีกชั้นหนึ่ง โดยเข้าไปที่ mpy-xxx หลังจากนั้นสั่ง make ดังนี้

cd mpy-cross

make clean

make

เมื่อคอมไพล์เสร็จจะพบไฟล์ชื่อ mpy-cross

คอมไพล์ submodules ของ sam-d21

เมื่อมี mpy-cross แล้ว ขั้นตอนต่อไปคือสร้างไลบรารีที่จะถูกเรียกใช้ด้วย sam-d21 โดยเข้าไปที่ ports ของ samd ดังนี้

cd ~/micropython/ports/samd

หลังจากนั้นสั่งคอมไพล์ด้วยคำสั่งดังต่อไปนี้

make  clean
make  submodules

คอมไพล์ MicroPython

คำสั่งสำหรับคอมไพล์ MicroPython เพื่อใช้กับ SAM-D21 คือ กำหนดให้บอร์ดที่ใช้งานเป็น ADAFRUIT_TRINKET_M0 ดังนี้

make BOARD=ADAFRUIT_TRINKET_M0

เมื่อการคอมไพล์เสร็จสิ้นโดยไม่เกิดข้อผิดพลาดเกี่ยวกับ arm-none-eabi-gcc หรือลืม mpy-cross จะได้โฟลเดอร์ชื่อ build-ADAFRUIT_TRINKET_M0

อัพโหลด

เมื่อคอมไพล์เรียบร้อย ขั้นตอนต่อไปคืออัพโหลดเข้าบอร์ด โดยการลากไฟล์ firmware.uf2 ไปวางในโฟลเดอร์ของบอร์ด โดยให้เปลี่ยนโหมดเป็น DFU ด้วยการกด Reset สองครั้งติดกันก่อน เมื่อโยนไฟล์ลงไปแล้ว ตัวบอร์ดจะอัพโหลดเข้ารอมและรีเซ็ตตัวเอง เพียงเท่านี้ทำให้พร้อมใช้งาน MicroPython

ทดสอบการทำงาน

ตัวอย่างโปรแกรมอ่านข้อมูลของบอร์ด เขียนได้ดังนี้

##################################################################################
import gc
import os
import sys
import time
import machine as mc

gc.enable()
gc.collect()

stat = os.statvfs('/flash')
block_size = stat[0]
total_blocks = stat[2]
free_blocks  = stat[3]
rom_total = (total_blocks * block_size)
rom_free = (free_blocks * block_size)
rom_usage = (rom_total-rom_free)

print("Platform .......: {}".format(sys.platform))
print("Frequency ......: {}".format(mc.freq()))
print("ID .............: {}".format(mc.unique_id()))
print("Memoey")
print("    Total ......: {} bytes".format(gc.mem_alloc()+gc.mem_free()))
print("    Used .......: {} bytes".format(gc.mem_alloc()))
print("    Free .......: {} bytes".format(gc.mem_free()))
print("Flash ROM")
print("    Total ......: {} bytes".format(rom_total))
print("    Used .......: {} bytes".format(rom_usage))
print("    Free .......: {} bytes".format(rom_free))

ตัวอย่างผลลัพธ์ของการทำงานเป็นดังภาพที่ 3

ภาพที่ 3 ตัวอย่างผลลัพธ์ของโปรแกรม

สรุป

จากบทความนี้จะพบว่าการสร้าง MicroPython เพื่อใช้กับไมโครคอนโทรลเลอร์ SAM-D1 นั้นไม่ยุ่งยาก และติดตั้งได้สะดวกผ่านทางการใช้ boot loader แบบ UF2 ส่วนการเขียนโปรแกรมนั้น ใช้ภาษาไพธอนเหมือนกับไมโครคอนโทรลเลอร์อื่น ๆ แต่รายละเอียดขาและการใช้ฟังก์ชันต่าง ๆ จะแตกต่างกันออกไปและ สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ

แหล่งอ้างอิง

  1. MicroPython

(C) 2020-2022, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-11-26, 2022-01-27