บทความนี้เป็นบทความแนะนำคุณสมบัติของบอร์ด Sipeed M1w dock suit ซึ่งเป็นบอร์ดที่ออกแบบมาเพื่อประมวลผล AI บนอุปกรณ์ Edge ทำให้งาน IoT รองรับการประมวลผลปัญญาประดิษฐ์ได้ โดยใช้ขิพ KPU K210 เป็นสมองหลักของการประมวลผล
คุณสมบัติ
บอร์ด Sipeed M1w dock suit ประกอบไปด้วยสถาปัตยกรรมทางฮาร์ดแวร์และซอฟต์แวร์ที่ออกแบบมาเพื่อแก้ปัญหาทางการทำงานด้านปัญญาประดิษฐ์หรือ AI (Artificial Intelligence) ทำให้อุปกรณ์เอ็ดจ์ประมวลผลปัญญาประดิษฐ์ได้โดยไม่ต้องอาศัยเทคโนโลยีคลาวด์ และสามารถเรียกใช้อัลกอริธึมเกี่ยวกับ predictive maintenance, anomaly detection, machine vision, robotics, voice recognition และอื่น ๆ ทำให้สามารถประยุกต์ใช้งานได้หลากหลายทั้งในภาคอุตสาหกรรม วงการอุปกรณ์เกี่ยวกับสุขภาพ หรือระบบชาญฉลาดต่าง ๆ
การใช้งานบอร์ดต้องใช้ไฟฟ้ากระแสตรงที่แรงดัน 3V3 และต้องใช้สายเชื่อมต่อหัว USB-C ในการต่อเข้ากับบอร์ด
หน่วยประมวลผลของ Maix
- เป็นหน่วยประมวลผลสถาปัตยกรรม RISC-V ที่ออกแบบให้เป็นชิพปัญญาประดิษฐ์ รุ่น KPU K210
- เป็นหน่วยประมวลผลแบบ Dual-Core RISC-V แบบ 64 บิต ทำงานที่ 400MHz และเร่งได้สูงสุด 800MHz
- ติดตั้งหน่วยความจำแรมความเร็วสูง ความจุ 8MB
- มีหน่วย KPU (Neural Network Processor) ที่รองรับการประมวลผลด้านนิวรอนเน็ตเวิร์กหรือเครือข่ายประสาทขนาด 576 บิต จำนวน 64 หน่วย รองรับการทำคอนโวลูชัน (Convolution) ใช้พลังงาน 0.3W ที่ความถี่สัญญาณนาฬิกา 400MHz ทำให้สามารถประมวลผลภาพได้ประมาณ 60 เฟรมต่อวินาที (fps: frames per second) เมื่อใช้ภาพประเภท VGA
- มีหน่วยประมวลผล APU (Audio Processor) รองรับไมค์จำนวน 8 ตัว ทำแซมเปิลเรตที่ 192KHz มีหน่วยคำนวณ FFT ในตัว
- มี FPIOA ที่ตั้งค่าการทำงานได้ 255 หน้าที่ให้กับขาใช้งาน (GPIOs) 48 ขา
- รองรับกล้อง DVP และติดตั้ง LCD ได้
- มีหน่วยเร่งการคำนวณ AES, SHA256, FFT
- รองรับการทำงาน OTP, UARTx4, WDT, I2Cx2, SPIx4, I2Sx3, TIMERx3 (32บิต), RTC, PWM
- มีรอมให้ใช้งาน 8MB
- มีโมดูลการทำ WiFi ผ่านทางชิพ ESP8285 และติดตั้งเสาสัญญาณแยกออกจากตัวบอร์ดได้
- สามารถอ่านระบบไฟล์ประเภท FAT ผ่านทาง microSD-Card Reader
การพัฒนาซอฟต์แวร์
การพัฒนาซอฟต์แวร์สำหรับบอร์ด MAix M1w dock สามารถเลือกใช้การพัฒนาได้หลากรูปแบบดังนี้
- ชุดพัฒนา SDK หรือ ภาษา C/C++ ที่พัฒนาต่อยอดจาก FreeRTOS ผ่านทาง Arduino IDE หรือ PlatformIO
- ภาษาไพธอนผ่าน MicroPython ที่ปรับแต่งการทำงานสำหรับบอร์ด MAix ที่เรียกว่า maixPy ทำให้รองรับ FPIOA, GPIO, TIMER, PWM, Flash, OV2640 และ LCD บนบอร์ดได้ และสามารถเขียน/แก้ไขโค้ดไพธอนบนบอร์ดได้ ผ่านทาง maixpy IDE
- การอัพเฟิร์มแวร์ของบอร์ดจะต้องใช้โปรแกรม kflash_gui
- สามารถทำ Deep Learning แบบ Fixed-point model ได้ ทำให้สามารถ trains, สร้างกฎ และมีตัวคอมไพล์โมเดลการ train/rule ให้เป็นโมเดลที่ต้องการได้
- ตัว Deep Learning รองรับ Tiny-yolo, mobilenet-v1, TensorFlow Lite โดยเฉพาะตัว TensorFlow Lite นั้นสามารถถูกคอมไพล์และรันบนตัว MAIX ได้โดยตรง
ตัวอย่างโปรแกรม code11-1 เป็นการอ่านข้อมูลของบอร์ดซึ่งจะรายงานแพล็ตฟอร์มของบอร์ดเป็น MaixPy รุ่น 3.4.0 มีหน่วยความจำให้ใช้งาน 518144 ไบต์ (ที่มากกว่านี้ใช้สำหรับบัฟเฟอร์กล้องและ AI) ใช้เฟิร์มแวร์รุ่น 0.5.1 บอร์ดเป็นรุ่น Sipeed_M1 ที่ใช้หน่วยประมวลผล kendryte-k210 และแสดงความถี่ของสัญญาณนาฬิกาของ CPU และ KPU
# code11-1, By: JarutEx - Fri Oct 16 2020
import sensor, image, time, lcd, os, sys, gc
from machine import I2C
import machine as mc
import Maix
i2c = I2C(I2C.I2C0, freq=100000, scl=28, sda=29)
uname = os.uname()
mem_total = gc.mem_alloc()+gc.mem_free()
free_percent = str((gc.mem_free())/mem_total*100.0)+"%"
alloc_percent = str((gc.mem_alloc())/mem_total*100.0)+"%"
print("ID .............: {}".format(mc.unique_id()))
print("Platform .......: {}".format(sys.platform))
print("Version ........: {}".format(sys.version))
print("Memory")
print(" total .......: {} Bytes or {} MBytes".format(mem_total, mem_total/(1024*1024)))
print(" usage .......: {} Bytes or {}".format(gc.mem_alloc(),alloc_percent))
print(" free ........: {} Bytes or {}".format(gc.mem_free(),free_percent))
print("system name ....: {}".format(uname.sysname))
print("node name ......: {}".format(uname.nodename))
print("release ........: {}".format(uname.release))
print("version ........: {}".format(uname.version))
print("machine ........: {}".format(uname.machine))
print("CPU Frequency ..: {} MHz".format(Maix.freq.get()[0]))
print("KPU Frequency ..: {} MHz".format(Maix.freq.get()[1]))
if i2c != None:
devices = i2c.scan()
i2c_dev = {32:'PCF8574',33:'PCF8574',34:'PCF8574',35:'PCF8574',36:'PCF8574',37:'PCF8574',38:'PCF8574',39:'LCD',56:'LCD',57:'PCF8574',58:'PCF8574',59:'PCF8574',60:'PCF8574/OLED',61:'PCF8574',62:'PCF8574',63:'PCF8574',68:'SHT31', 84:'24xx #1',85:'24xx #2',86:'24xx #3',87:'24xx #4',104:'RTC'}
if len(devices)==0:
print("No I2C")
for io in devices:
if io in i2c_dev:
print("Address [",hex(io),"] Device :",i2c_dev[io])
else:
print("Address [",hex(io),"] Device : ???")
lcd.init(freq=15000000)
lcd.rotation(2)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
img = sensor.snapshot()
lcd.display(img)
sensor.shutdown(0)
ตัวอย่าง code11-2 เป็นการเปิดกล้องและค้นหาวัตถุที่มีสีเขียวพร้อมทั้งสร้างกรอบรอบวัตถุสีเขียวนั้น
# code11-2 - By: JarutEx - Fri Oct 16 2020
import sensor, image, time, lcd
lcd.init(freq=15000000)
lcd.rotation(2)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot() # Capture
#process
green_threshold = (0, 80, -70, -10, -0, 30)
blobs = img.find_blobs([green_threshold])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4])
tmp=img.draw_cross(b[5], b[6])
c=img.get_pixel(b[5], b[6])
#display
lcd.display(img)
print(clock.fps())
สรุป
ในบทความนี้เราได้ทำความรู้จักกับคุณสมบัติของบอร์ด maix เพื่อเข้าใจกับภาพรวมของการใช้งานบอร์ด นอกจากนี้ได้รู้ถึงแหล่งดาวน์โหลดเครื่องมือในการพัฒนาซอฟต์แวร์เพื่อใช้ในการเรียนรู้การเขียนโปรแกรมด้านปัญญาประดิษฐ์กันต่อไป
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2020-10-15
ปรับปรุง 2020-10-16
ปรับปรุง 2020-10-19