[TH] Hi, MaixPy

บทความนี้เป็นบทความแนะนำคุณสมบัติของบอร์ด Sipeed M1w dock suit ซึ่งเป็นบอร์ดที่ออกแบบมาเพื่อประมวลผล AI บนอุปกรณ์ Edge ทำให้งาน IoT รองรับการประมวลผลปัญญาประดิษฐ์ได้ โดยใช้ขิพ KPU K210 เป็นสมองหลักของการประมวลผล

ภาพที่ 1

คุณสมบัติ

บอร์ด Sipeed M1w dock suit ประกอบไปด้วยสถาปัตยกรรมทางฮาร์ดแวร์และซอฟต์แวร์ที่ออกแบบมาเพื่อแก้ปัญหาทางการทำงานด้านปัญญาประดิษฐ์หรือ AI (Artificial Intelligence) ทำให้อุปกรณ์เอ็ดจ์ประมวลผลปัญญาประดิษฐ์ได้โดยไม่ต้องอาศัยเทคโนโลยีคลาวด์ และสามารถเรียกใช้อัลกอริธึมเกี่ยวกับ predictive maintenance, anomaly detection, machine vision, robotics, voice recognition และอื่น ๆ ทำให้สามารถประยุกต์ใช้งานได้หลากหลายทั้งในภาคอุตสาหกรรม วงการอุปกรณ์เกี่ยวกับสุขภาพ หรือระบบชาญฉลาดต่าง ๆ

การใช้งานบอร์ดต้องใช้ไฟฟ้ากระแสตรงที่แรงดัน 3V3 และต้องใช้สายเชื่อมต่อหัว USB-C ในการต่อเข้ากับบอร์ด

ภาพที่ 2
ภาพที่ 3
ภาพที่ 4
ภาพที่ 5

หน่วยประมวลผลของ Maix

  1. เป็นหน่วยประมวลผลสถาปัตยกรรม RISC-V ที่ออกแบบให้เป็นชิพปัญญาประดิษฐ์ รุ่น KPU K210
  2. เป็นหน่วยประมวลผลแบบ Dual-Core RISC-V แบบ 64 บิต ทำงานที่ 400MHz และเร่งได้สูงสุด 800MHz
  3. ติดตั้งหน่วยความจำแรมความเร็วสูง ความจุ 8MB
  4. มีหน่วย KPU (Neural Network Processor) ที่รองรับการประมวลผลด้านนิวรอนเน็ตเวิร์กหรือเครือข่ายประสาทขนาด 576 บิต จำนวน 64 หน่วย รองรับการทำคอนโวลูชัน (Convolution) ใช้พลังงาน 0.3W ที่ความถี่สัญญาณนาฬิกา 400MHz ทำให้สามารถประมวลผลภาพได้ประมาณ 60 เฟรมต่อวินาที (fps: frames per second) เมื่อใช้ภาพประเภท VGA
  5. มีหน่วยประมวลผล APU (Audio Processor) รองรับไมค์จำนวน 8 ตัว ทำแซมเปิลเรตที่ 192KHz มีหน่วยคำนวณ FFT ในตัว
  6. มี FPIOA ที่ตั้งค่าการทำงานได้ 255 หน้าที่ให้กับขาใช้งาน (GPIOs) 48 ขา
  7. รองรับกล้อง DVP และติดตั้ง LCD ได้
  8. มีหน่วยเร่งการคำนวณ AES, SHA256, FFT
  9. รองรับการทำงาน OTP, UARTx4, WDT, I2Cx2, SPIx4, I2Sx3, TIMERx3 (32บิต), RTC, PWM
  10. มีรอมให้ใช้งาน 8MB
  11. มีโมดูลการทำ WiFi ผ่านทางชิพ ESP8285 และติดตั้งเสาสัญญาณแยกออกจากตัวบอร์ดได้
  12. สามารถอ่านระบบไฟล์ประเภท FAT ผ่านทาง microSD-Card Reader
ภาพที่ 6
ภาพที่ 7
ภาพที่ 8

การพัฒนาซอฟต์แวร์

การพัฒนาซอฟต์แวร์สำหรับบอร์ด MAix M1w dock สามารถเลือกใช้การพัฒนาได้หลากรูปแบบดังนี้

  1. ชุดพัฒนา SDK หรือ ภาษา C/C++ ที่พัฒนาต่อยอดจาก FreeRTOS ผ่านทาง Arduino IDE หรือ PlatformIO
  2. ภาษาไพธอนผ่าน MicroPython ที่ปรับแต่งการทำงานสำหรับบอร์ด MAix ที่เรียกว่า maixPy ทำให้รองรับ FPIOA, GPIO, TIMER, PWM, Flash, OV2640 และ LCD บนบอร์ดได้ และสามารถเขียน/แก้ไขโค้ดไพธอนบนบอร์ดได้ ผ่านทาง maixpy IDE
  3. การอัพเฟิร์มแวร์ของบอร์ดจะต้องใช้โปรแกรม kflash_gui
  4. สามารถทำ Deep Learning แบบ Fixed-point model ได้ ทำให้สามารถ trains, สร้างกฎ และมีตัวคอมไพล์โมเดลการ train/rule ให้เป็นโมเดลที่ต้องการได้
  5. ตัว Deep Learning รองรับ Tiny-yolo, mobilenet-v1, TensorFlow Lite โดยเฉพาะตัว TensorFlow Lite นั้นสามารถถูกคอมไพล์และรันบนตัว MAIX ได้โดยตรง
ภาพที่ 9 maixPy IDE
ภาพที่ 10 kflash GUI
ภาพที่ 11

ตัวอย่างโปรแกรม 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)
ภาพที่ 12 ผลลัพธ์ของ code11-1

ตัวอย่าง 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())
ภาพที่ 13 ผลลัพธ์จาก code11-2

สรุป

ในบทความนี้เราได้ทำความรู้จักกับคุณสมบัติของบอร์ด maix เพื่อเข้าใจกับภาพรวมของการใช้งานบอร์ด นอกจากนี้ได้รู้ถึงแหล่งดาวน์โหลดเครื่องมือในการพัฒนาซอฟต์แวร์เพื่อใช้ในการเรียนรู้การเขียนโปรแกรมด้านปัญญาประดิษฐ์กันต่อไป

(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2020-10-15
ปรับปรุง 2020-10-16
ปรับปรุง 2020-10-19