[TH] Maix Class

บทความนี้รวบรวมรายการชุดคำสั่งของคลาสต่าง ๆ ที่อยู่ภายใต้คลาส Maix ของ MaixPy ซึ่งเป็น MicroPython ของบอร์ด Sipeed M1W dock suit (ภาพที่ 1) ที่เคยได้กล่าวถึงไปแล้ว

ภาพที่ 1 บอร์ด Sipeed M1W doc suit

อ่านข้อมูลบอร์ด

ก่อนอื่นมาตรวจสอบคุณสมบัติของบอร์ด Sipeed M1W dock suit กันด้วยโค้ดต่อไปนี้กันก่อน ซึ่งจะได้ผลลัพธ์ดังภาพที่ 2

import sys
import gc
import os
import sys
import time
from Maix import freq

def show_hw_info():
    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)+"%)"
    stat = os.statvfs('/flash')
    block_size = stat[0]
    total_blocks = stat[2]
    free_blocks  = stat[3]
    rom_total = (total_blocks * block_size)/1024
    rom_free = (free_blocks * block_size)/1024
    rom_usage = (rom_total-rom_free)
    rfree_percent = "("+str(rom_free/rom_total*100.0)+"%)"
    rusage_percent = "("+str(rom_usage/rom_total*100.0)+"%)"
    print("implementation ....:", sys.implementation)
    print("path ..............:", sys.path)
    print("Python ............:", sys.version)
    print("Platform ..........:",sys.platform)
    print("Memory")
    print("   total ..........:",mem_total/1024,"KB")
    print("   usage ..........:",gc.mem_alloc()/1024,"KB",alloc_percent)
    print("   free ...........:",gc.mem_free()/1024,"KB",free_percent)
    print("ROM")
    print("   total ..........:", rom_total,"KB" )
    print("   usage ..........:", rom_usage,"KB",rfree_percent )
    print("   Free ...........:", rom_free,"KB",rusage_percent )
    print("system name .......:",uname.sysname)
    print("node name .........:",uname.nodename)
    print("release ...........:",uname.release)
    print("version ...........:",uname.version)
    print("machine ...........:",uname.machine)
    cpu_freq, kpu_freq = freq.get()
    print("CPU/KPU freq ......: {}/{}MHz".format(cpu_freq, kpu_freq))

gc.enable()
gc.collect()
show_hw_info()
ภาพที่ 2 ผลลัพธ์ของการอ่านข้อมูลของบอร์ด Sipeed M1W Doc Suit

คราวนี้มาทดลองดูว่าจะหาค่าจำนวนเฉพาะจากตัวเลขในช่วง 2000 ด้วยโค้ดต่อไปนี้และได้ตัวอย่างผลลัพธ์ดังภาพที่ 3 ซึ่งจะพบว่าใช้เวลาไป 569msec

# Untitled - By: cid - Thu Sep 9 2021

import gc
import os
import sys
import machine as mc
import time as tm
import image, time, lcd

lcd.init(freq=15000000)
gc.enable()
gc.collect()

clock = time.clock()
#mc.freq(400000000)

def isPrime(x):
    i = 2
    while (i < x):
        if x%i == 0:
            return False
        i = i+1
    if (i == x):
        return True
    return False

def testPrimeNumber(maxN):
    counter = 0
    t0 = tm.ticks_ms()
    for n in range(2, maxN):
        if isPrime(n):
            counter+=1
    t1 = tm.ticks_ms()
    print("Found {} in {} msecs.".format(counter,abs(t1-t0)))

testPrimeNumber(2000)

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

Maix Class

Maix เป็นคลาสสำหรับบอร์ด Sipeed M1W ซึ่งสืบทอดมาจากคลาส machine ของ MicroPython โดยภายในคลาส Maix ประกอบด้วยรายการภายในดังนี้

object <module 'machine'> is of type module
  __name__ -- machine
  FPIOA -- <class 'FPIOA'>
  GPIO -- <class 'Pin'>
  I2S -- <class 'I2S'>
  Audio -- <class 'Audio'>
  FFT -- <class 'FFT'>
  MIC_ARRAY -- <class 'MIC_ARRAY'>
  freq -- <class 'freq'>
  utils -- <class 'utils'>
  config -- <class 'config'>

FPIOA

คลาส FPIOA เป็นคลาสเก็บหมายเลขขา I/O ของบอร์ด Sipeed M1W suit ทำให้เราสามารถใช้ชื่อของขาแทนการจำหมายเลข ซึ่งรายการภายในคลาสนี้เป็นดังนี้

object <class 'FPIOA'> is of type type
  set_function -- <function>
  help -- <function>
  get_Pin_num -- <function>
  JTAG_TCLK -- 0
  JTAG_TDI -- 1
  JTAG_TMS -- 2
  JTAG_TDO -- 3
  SPI0_D0 -- 4
  SPI0_D1 -- 5
  SPI0_D2 -- 6
  SPI0_D3 -- 7
  SPI0_D4 -- 8
  SPI0_D5 -- 9
  SPI0_D6 -- 10
  SPI0_D7 -- 11
  SPI0_SS0 -- 12
  SPI0_SS1 -- 13
  SPI0_SS2 -- 14
  SPI0_SS3 -- 15
  SPI0_ARB -- 16
  SPI0_SCLK -- 17
  UARTHS_RX -- 18
  UARTHS_TX -- 19
  RESV6 -- 20
  RESV7 -- 21
  CLK_SPI1 -- 22
  CLK_I2C1 -- 23
  GPIOHS0 -- 24
  GPIOHS1 -- 25
  GPIOHS2 -- 26
  GPIOHS3 -- 27
  GPIOHS4 -- 28
  GPIOHS5 -- 29
  GPIOHS6 -- 30
  GPIOHS7 -- 31
  GPIOHS8 -- 32
  GPIOHS9 -- 33
  GPIOHS10 -- 34
  GPIOHS11 -- 35
  GPIOHS12 -- 36
  GPIOHS13 -- 37
  GPIOHS14 -- 38
  GPIOHS15 -- 39
  GPIOHS16 -- 40
  GPIOHS17 -- 41
  GPIOHS18 -- 42
  GPIOHS19 -- 43
  GPIOHS20 -- 44
  GPIOHS21 -- 45
  GPIOHS22 -- 46
  GPIOHS23 -- 47
  GPIOHS24 -- 48
  GPIOHS25 -- 49
  GPIOHS26 -- 50
  GPIOHS27 -- 51
  GPIOHS28 -- 52
  GPIOHS29 -- 53
  GPIOHS30 -- 54
  GPIOHS31 -- 55
  GPIO0 -- 56
  GPIO1 -- 57
  GPIO2 -- 58
  GPIO3 -- 59
  GPIO4 -- 60
  GPIO5 -- 61
  GPIO6 -- 62
  GPIO7 -- 63
  UART1_RX -- 64
  UART1_TX -- 65
  UART2_RX -- 66
  UART2_TX -- 67
  UART3_RX -- 68
  UART3_TX -- 69
  SPI1_D0 -- 70
  SPI1_D1 -- 71
  SPI1_D2 -- 72
  SPI1_D3 -- 73
  SPI1_D4 -- 74
  SPI1_D5 -- 75
  SPI1_D6 -- 76
  SPI1_D7 -- 77
  SPI1_SS0 -- 78
  SPI1_SS1 -- 79
  SPI1_SS2 -- 80
  SPI1_SS3 -- 81  SPI1_ARB -- 82
  SPI1_SCLK -- 83
  SPI_SLAVE_D0 -- 84
  SPI_SLAVE_SS -- 85
  SPI_SLAVE_SCLK -- 86
  I2S0_MCLK -- 87
  I2S0_SCLK -- 88
  I2S0_WS -- 89
  I2S0_IN_D0 -- 90
  I2S0_IN_D1 -- 91
  I2S0_IN_D2 -- 92
  I2S0_IN_D3 -- 93
  I2S0_OUT_D0 -- 94
  I2S0_OUT_D1 -- 95
  I2S0_OUT_D2 -- 96
  I2S0_OUT_D3 -- 97
  I2S1_MCLK -- 98
  I2S1_SCLK -- 99
  I2S1_WS -- 100
  I2S1_IN_D0 -- 101
  I2S1_IN_D1 -- 102
  I2S1_IN_D2 -- 103
  I2S1_IN_D3 -- 104
  I2S1_OUT_D0 -- 105
  I2S1_OUT_D1 -- 106
  I2S1_OUT_D2 -- 107
  I2S1_OUT_D3 -- 108
  I2S2_MCLK -- 109
  I2S2_SCLK -- 110
  I2S2_WS -- 111
  I2S2_IN_D0 -- 112
  I2S2_IN_D1 -- 113
  I2S2_IN_D2 -- 114
  I2S2_IN_D3 -- 115
  I2S2_OUT_D0 -- 116
  I2S2_OUT_D1 -- 117
  I2S2_OUT_D2 -- 118
  I2S2_OUT_D3 -- 119
  RESV0 -- 120
  RESV1 -- 121
  RESV2 -- 122
  RESV3 -- 123
  RESV4 -- 124
  RESV5 -- 125
  I2C0_SCLK -- 126
  I2C0_SDA -- 127
  I2C1_SCLK -- 128
  I2C1_SDA -- 129
  I2C2_SCLK -- 130
  I2C2_SDA -- 131
  CMOS_XCLK -- 132
  CMOS_RST -- 133
  CMOS_PWDN -- 134
  CMOS_VSYNC -- 135
  CMOS_HREF -- 136
  CMOS_PCLK -- 137
  CMOS_D0 -- 138
  CMOS_D1 -- 139
  CMOS_D2 -- 140
  CMOS_D3 -- 141
  CMOS_D4 -- 142
  CMOS_D5 -- 143
  CMOS_D6 -- 144
  CMOS_D7 -- 145
  SCCB_SCLK -- 146
  SCCB_SDA -- 147
  UART1_CTS -- 148
  UART1_DSR -- 149
  UART1_DCD -- 150
  UART1_RI -- 151
  UART1_SIR_IN -- 152
  UART1_DTR -- 153
  UART1_RTS -- 154
  UART1_OUT2 -- 155
  UART1_OUT1 -- 156
  UART1_SIR_OUT -- 157
  UART1_BAUD -- 158
  UART1_RE -- 159
  UART1_DE -- 160
  UART1_RS485_EN -- 161
  UART2_CTS -- 162
  UART2_DSR -- 163
  UART2_DCD -- 164
  UART2_RI -- 165
  UART2_SIR_IN -- 166
  UART2_DTR -- 167
  UART2_RTS -- 168
  UART2_OUT2 -- 169
  UART2_OUT1 -- 170
  UART2_SIR_OUT -- 171
  UART2_BAUD -- 172
  UART2_RE -- 173
  UART2_DE -- 174
  UART2_RS485_EN -- 175
  UART3_CTS -- 176
  UART3_DSR -- 177
  UART3_DCD -- 178
  UART3_RI -- 179
  UART3_SIR_IN -- 180
  UART3_DTR -- 181
  UART3_RTS -- 182
  UART3_OUT2 -- 183
  UART3_OUT1 -- 184
  UART3_SIR_OUT -- 185
  UART3_BAUD -- 186
  UART3_RE -- 187
  UART3_DE -- 188
  UART3_RS485_EN -- 189
  TIMER0_TOGGLE1 -- 190
  TIMER0_TOGGLE2 -- 191
  TIMER0_TOGGLE3 -- 192
  TIMER0_TOGGLE4 -- 193
  TIMER1_TOGGLE1 -- 194
  TIMER1_TOGGLE2 -- 195
  TIMER1_TOGGLE3 -- 196
  TIMER1_TOGGLE4 -- 197
  TIMER2_TOGGLE1 -- 198
  TIMER2_TOGGLE2 -- 199
  TIMER2_TOGGLE3 -- 200
  TIMER2_TOGGLE4 -- 201
  CLK_SPI2 -- 202
  CLK_I2C2 -- 203

GPIO

คลาส GPIO เป็นคลาสที่สืบทอดมาจากคลาส Pin ใช้สำหรับกำหนดหน้าที่ของขา และกำหนด/อ่านค่าสถานะของขา ซี่งประกอบด้วยรายการดังนี้

bject <class 'Pin'> is of type type
  init -- <function>
  value -- <function>
  irq -- <function>
  disirq -- <function>
  mode -- <function>
  IN -- 0
  OUT -- 3
  PULL_NONE -- -1
  PULL_UP -- 2
  PULL_DOWN -- 1
  IRQ_NONE -- 0
  IRQ_RISING -- 2
  IRQ_FALLING -- 1
  IRQ_BOTH -- 3
  GPIOHS0 -- 0
  GPIOHS1 -- 1
  GPIOHS2 -- 2
  GPIOHS3 -- 3
  GPIOHS4 -- 4
  GPIOHS5 -- 5
  GPIOHS6 -- 6
  GPIOHS7 -- 7
  GPIOHS8 -- 8
  GPIOHS9 -- 9
  GPIOHS10 -- 10
  GPIOHS11 -- 11
  GPIOHS12 -- 12
  GPIOHS13 -- 13
  GPIOHS14 -- 14
  GPIOHS15 -- 15
  GPIOHS16 -- 16
  GPIOHS17 -- 17
  GPIOHS18 -- 18
  GPIOHS19 -- 19
  GPIOHS20 -- 20
  GPIOHS21 -- 21
  GPIOHS22 -- 22
  GPIOHS23 -- 23
  GPIOHS24 -- 24
  GPIOHS25 -- 25
  GPIOHS26 -- 26
  GPIOHS27 -- 27
  GPIOHS28 -- 28
  GPIOHS29 -- 29
  GPIOHS30 -- 30
  GPIOHS31 -- 31
  GPIO0 -- 32
  GPIO1 -- 33
  GPIO2 -- 34
  GPIO3 -- 35
  GPIO4 -- 36
  GPIO5 -- 37
  GPIO6 -- 38
  GPIO7 -- 39
  WAKEUP_NOT_SUPPORT -- 0

I2S

คลาส I2S เป็นคลาสสำหรับเชื่อมต่อกับโมดูลเสียงผ่านทางบัส I2S โดยรายละเอียดภายในคลาส คือ

object <class 'I2S'> is of type type
  __deinit__ -- <function>
  init -- <function>
  channel_config -- <function>
  set_sample_rate -- <function>
  record -- <function>
  wait_record -- <function>
  play -- <function>
  DEVICE_0 -- 0
  DEVICE_1 -- 1
  DEVICE_2 -- 2
  CHANNEL_0 -- 0
  CHANNEL_1 -- 1
  CHANNEL_2 -- 2
  CHANNEL_3 -- 3
  IGNORE_WORD_LENGTH -- 0
  RESOLUTION_12_BIT -- 1
  RESOLUTION_16_BIT -- 2
  RESOLUTION_20_BIT -- 3
  RESOLUTION_24_BIT -- 4
  RESOLUTION_32_BIT -- 5
  SCLK_CYCLES_16 -- 0
  SCLK_CYCLES_24 -- 1
  SCLK_CYCLES_32 -- 2
  TRANSMITTER -- 0
  RECEIVER -- 1
  STANDARD_MODE -- 1
  RIGHT_JUSTIFYING_MODE -- 2
  LEFT_JUSTIFYING_MODE -- 4

Audio

คลาส Audio เป็นคลาสที่ทำหน้าที่เล่นเสียงดนตรี ปรับความดัง และการบันทึกเสียง โดยรายการคำสั่งภายในคลาส Audio เป็นดังนี้

object <class 'Audio'> is of type type
  init -- <function>
  __deinit__ -- <function>
  to_bytes -- <function>
  play_process -- <function>
  volume -- <function>
  play -- <function>
  record_process -- <function>
  record -- <function>
  finish -- <function>

FFT

คลาส FFT ใช้สำหรับทำ Fast Fourier Transform โดยคำสั่งของคลาสได้แก่

object <class 'FFT'> is of type type
  run -- <function>
  freq -- <function>
  amplitude -- <function>

MIC_ARRAY

คลาส MIC_ARRAY เป็นคลาสที่ใช้รองรับการทำงานของโมดูล Microphone Array ของ Sipeed โดยคำสั่งสำหรับควบคุม Microphone Array มีดังนี้

object <class 'MIC_ARRAY'> is of type type
  init -- <function>
  deinit -- <function>
  get_dir -- <function>
  set_led -- <function>
  get_map -- <function>

freq

คลาส freq ใช้สำหรับอ่านค่าตวามถี่สัญญาณนาฬิกาของ CPU และ KPU พร้อมทมีคำสั่งสำหรับปรับค่าความสัญญาณนาฬิกาใหม่ดังนี้

object <class 'freq'> is of type type
  __name__ -- freq
  set -- <function>
  get -- <function>
  get_kpu -- <function>
  get_cpu -- <function>

utils

คลาส utils เป็นคลาสรวมคำสั่งเกี่ยวกับการหาจำนวนหน่วยความจำ และอ่านข้อมูลจากหน่วยความจำแฟลชรอม ดังนี้

object <class 'utils'> is of type type
  __name__ -- utils
  gc_heap_size -- <function>
  heap_free -- <function>
  flash_read -- <function>

config

คลาส config ใช้สำหรับอ่านค่าการตั้งค่าของบอร์ด ดังนี้

object <class 'config'> is of type type
  __name__ -- config
  __init__ -- <function>
  get_value -- <function>

สรุป

จากบทความนี้จะพบว่าคลาส Maix ของ Sipeed M1W นั้นประกอบด้วยตลาสย่อยภายในที่เกี่ยวของกับ I/O ของบอร์ด จนถึงการประมวลผล I2S, Audio, FFT และเกี่ยวกับ MIC Array ทำให้การนำบอร์ดนี้ไปทำงาน AI จึงมีความสะดวกและมีความพร้อมในการใช้งานสูง เนื่องจากบนบอร์ดเองมีทั้งส่วนเชื่อมต่อจอแสดงผล TFT, ช่องอ่าน microSD และติดตั้งกล้องดังที่ได้เอ่ยถึงในบทความก่อนหน้านี้ ส่วนรายละเอียดการใช้งานของแต่ละคลาสจะกล่าวถึงในบทความถัด ๆ ไป สุดท้าย ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ได้เลยครับ

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-10-02, 2021-10-03, 2021-12-15