OpenMV Cam M4

OpenMV Cam M4 เป็นบอร์ด machine vision ขนาดกะทัดรัดที่ใช้ชิป Cortex‑M4 สร้างขึ้นบนพื้นฐานของ STMicroelectronics STM32F427 ที่ความเร็ว 180 MHz พร้อม SRAM ภายใน 256 KB และแฟลชภายใน 1 MB sensor OV7725 ที่มาพร้อมกันสามารถจับภาพเฟรมขนาด 320×240 ในโหมดระดับสีเทาหรือ RGB565 และคอนเน็กเตอร์ผู้ใช้ 9 พินรองรับอุปกรณ์ต่อพ่วง UART, I²C, SPI, CAN, ADC/DAC และ PWM

Note

OV7725 เป็น sensor มาตรฐานบนบอร์ด M4 ที่ผลิตจริง บอร์ด M4 รุ่นแรกสุดมาพร้อมกับ OmniVision OV2640 แทน — ใช้ไปป์ไลน์ QVGA preview เหมือนกัน แต่ OV2640 ยังสามารถจับภาพเฟรม JPEG ขนาดสูงสุด UXGA (1600×1200) ได้อีกด้วย sensor ทั้งสองตัวขับเคลื่อนผ่าน API csi --- เซ็นเซอร์กล้อง เดียวกัน

OpenMV Cam M4

สำหรับ datasheet ฉบับสมบูรณ์ ภาพถ่าย และขนาด ดูได้ที่ หน้าผลิตภัณฑ์ OpenMV Cam M4

ไฮไลท์

  • STMicroelectronics STM32F427 Cortex‑M4 ที่ความเร็ว 180 MHz

  • SRAM ภายใน 256 KB — ไม่มี SDRAM ภายนอก

  • แฟลชภายใน 1 MB (ไม่มีแฟลช QSPI ภายนอก)

  • sensor OV7725 (หรือ OV2640 บนบอร์ด M4 รุ่นแรกสุด) — 320×240 ระดับสีเทา 8 บิตหรือ RGB565; OV2640 สามารถจับภาพ JPEG ขนาดสูงสุด UXGA (1600×1200) ได้เพิ่มเติม

  • USB ความเร็วเต็ม (12 Mb/s) — ปรากฏเป็น VCP + USB mass storage บนโฮสต์

  • ช่อง microSD — SD สูงสุด 2 GB, SDHC สูงสุด 32 GB, SDXC สูงสุด 2 TB

  • 9 พิน I/O รองรับ 5 V โดยมีเอาต์พุต 3.3 V จ่ายกระแสได้ 25 mA ต่อพิน (รวม 120 mA ตลอดทั้งคอนเน็กเตอร์) สามารถใช้งานอินเทอร์รัปต์ได้ P6 ไม่ รองรับ 5 V เมื่อใช้ในโหมด ADC หรือ DAC

  • RGB LED สำหรับผู้ใช้ และ IR LED กำลังสูง 850 nm สองดวง สำหรับแสงสว่างแบบแอคทีฟในสภาพแสงน้อย

Note

M4 ไม่มีชิปจัดการพลังงานบนบอร์ด: ไม่มีขั้วต่อแบตเตอรี่ ไม่มีตัวชาร์จแบตเตอรี่ ไม่มี ADC วัดแรงดันแบตเตอรี่ ไม่มี LED แสดงสถานะการชาร์จ/พลังงาน และไม่มีปุ่มเปิดปิดแบบฮาร์ดแวร์ จ่ายไฟผ่าน USB หรือ VIN

พินเอาต์

OpenMV Cam M4 OV7725 Pinout

อ้างอิงพิน

ชื่อพิน

ฟังก์ชัน

P0

SPI2 MOSI

P1

SPI2 MISO

P2

SPI2 SCK / CAN2 TX

P3

SPI2 NSS (CS) / CAN2 RX

P4

I2C2 SCL / UART3 TX / TIM2 CH3

P5

I2C2 SDA / UART3 RX / TIM2 CH4

P6

ADC / DAC / TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

RESET

ต่อลง GND เพื่อรีเซ็ตบอร์ด

BOOT0

ต่อขึ้น 3.3 V ขณะเปิดเครื่องเพื่อเข้าสู่ DFU / ROM บูตโหลดเดอร์

SWCLK

สัญญาณนาฬิกา ARM SWD (สำหรับเข้าถึงดีบักเกอร์)

SWDIO

ข้อมูล ARM SWD (สำหรับเข้าถึงดีบักเกอร์)

LED_RED

ช่องสีแดงของ RGB LED (active low)

LED_GREEN

ช่องสีเขียวของ RGB LED (active low)

LED_BLUE

ช่องสีน้ำเงินของ RGB LED (active low)

LED_IR

IR LED กำลังสูง (ทั้งสองช่องขับพร้อมกัน)

พินไฟเลี้ยง

  • 3.3V — บัสจ่ายไฟ 3.3 V แบบเรกูเลต จ่ายกระแสได้สูงสุด 250 mA สำหรับ shield (น้อยลงหากมีการใช้ microSD card) ต่างจากกล้องรุ่นใหม่กว่า พินนี้เป็นแบบสองทิศทาง — ดูคำเตือนด้านล่าง

  • VIN — อินพุต 3.6 – 5 V จ่ายไฟให้บอร์ดผ่านตัวเรกูเลตบนบอร์ด

  • GND — กราวด์ร่วม

Note

เมื่อมีทั้ง USB และ VIN อยู่พร้อมกัน แหล่งจ่ายที่มี แรงดันสูงกว่า จะเป็นผู้จ่ายไฟให้บอร์ด — ไดโอดบนบอร์ดจะเลือกบัสที่แรงกว่าโดยอัตโนมัติ

Warning

อาจ จ่ายไฟให้ M4 โดยป้อน 3.3 V เข้าพิน 3.3V โดยตรงหากไม่ต้องการผ่านตัวเรกูเลตบนบอร์ด ในกรณีนั้น ห้ามจ่าย VIN หรือ USB พร้อมกัน — การป้อนกระแสย้อนกลับเข้าตัวเรกูเลตขณะที่แหล่งจ่ายอื่นยังทำงานอยู่อาจทำให้กล้องเสียหายถาวร

Tip

ใช้ เครื่องคำนวณอายุแบตเตอรี่ เพื่อประเมินว่า M4 จะทำงานได้นานเท่าใดบนแบตเตอรี่สำหรับรอบการทำงานแบบ active / deep-sleep ที่กำหนด

พินกู้คืนและดีบัก

  • RESET — ต่อลง GND เพื่อรีเซ็ตบอร์ด เมื่อปล่อยแล้ว MCU จะเริ่มทำงานตามปกติ

  • BOOT0 — ต่อขึ้น 3.3 V ขณะเปิดเครื่องเพื่อเข้าสู่ ROM bootloader ของ STM32 (โหมด DFU) OpenMV IDE ใช้โหมดนี้ในการเขียนโปรแกรม bootloader บนบอร์ดใหม่

SWCLK และ SWDIO เปิดออกมาเป็นพินคอนเน็กเตอร์ธรรมดา (ไม่ใช่ขั้วต่อ SWD แบบเฉพาะ) ต่อสาย RESET, SWCLK, SWDIO, GND และ 3.3 V เข้ากับอะแดปเตอร์ ST‑LINK หรือ SEGGER J‑Link เพื่อดีบักบอร์ด

อุปกรณ์ต่อพ่วงบนบอร์ด

LED

M4 มี RGB LED สำหรับผู้ใช้หนึ่งดวงและ IR LED กำลังสูง 850 nm อีกหนึ่งคู่:

  • RGB LED สำหรับผู้ใช้ — ควบคุมได้ทางซอฟต์แวร์ เปิดเผยในชื่อ LED_RED, LED_GREEN และ LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • IR LEDs — LED ทั้งสองดวงขับพร้อมกันผ่านพิน LED_IR โดย LED_IR ถูกต่อวงจรแบบ active high ในฮาร์ดแวร์ ในขณะที่เฟิร์มแวร์ถือว่า LED บนบอร์ดอื่นทุกดวงเป็น active low ดังนั้นให้ใช้ low() / high() แทน on() / off() (ซึ่งจะทำให้ตรรกะกลับด้าน):

    from machine import LED
    
    ir = LED("LED_IR")
    ir.low()    # turn IR illumination ON
    ir.high()   # turn IR illumination OFF
    

camera sensor

sensor ที่มาพร้อมกัน (OV7725 บนบอร์ดมาตรฐาน, OV2640 บนรุ่นแรกสุด) ขับเคลื่อนผ่านโมดูล csi --- เซ็นเซอร์กล้อง

import csi

cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000)       # let auto‑exposure settle

while True:
    img = cam.snapshot()

sensor ถูกบัดกรีติดกับบอร์ด บน M4 — ไม่ใช่โมดูลที่ถอดเปลี่ยนได้

Note

บนบอร์ด OV7725 พิน FSIN (frame‑sync) ของ sensor ถูกต่อสายไปยัง MCU แต่ยังไม่มีการรองรับในเฟิร์มแวร์

บนบอร์ด OV2640 พิน STROBE, FREX (frame exposure) และ EXPST (exposure reset) ของ sensor ถูกต่อสายไปยัง MCU แต่ยังไม่มีการรองรับในเฟิร์มแวร์

คอนเน็กเตอร์เซอร์โว

ด้านหลังของบอร์ดมี แพดบัดกรีคอนเน็กเตอร์เซอร์โว สองชุดที่เปิดออกมาเป็นคอนเน็กเตอร์เซอร์โว 3 พินมาตรฐาน (สัญญาณ / VIN / GND) สำหรับ P7 และ P8 พินสัญญาณเชื่อมตรงกับช่อง TIM4 1 และ 2 (ช่องเดียวกับที่ใช้โดย pyb.Servo) และพิน V+ บนคอนเน็กเตอร์แต่ละตัวต่อตรงกับ VIN โดยตรง ทำให้เซอร์โวดึงกระแสจากบัสอินพุตแทนตัวเรกูเลต 3.3 V

บัดกรีคอนเน็กเตอร์ 3 พินแบบมุมฉากเข้ากับแพดและต่อเซอร์โวอดิเรกสองตัวเพื่อขับเคลื่อนฐานหมุน pan‑and‑tilt:

from pyb import Servo

pan  = Servo(1)              # P7 — TIM4 CH1
tilt = Servo(2)              # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)

microSD card

เมื่อใส่การ์ดแล้ว จะถูก mount โดยอัตโนมัติที่ /sdcard และสามารถใช้งานได้ผ่านระบบไฟล์ปกติ:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

อ้างอิงบัส

GPIO

ใช้ machine.Pin เพื่ออ่านหรือขับพินที่มีชื่อบนซิลก์สกรีน เอาต์พุตเป็น 3.3 V CMOS รองรับ 5 V ด้านอินพุต และจ่าย/รับกระแสได้สูงสุด 25 mA ต่อพิน (รวม 120 mA ตลอดทั้งคอนเน็กเตอร์)

from machine import Pin

out = Pin("P0", Pin.OUT)
out.on()
out.off()
out.value(1)

inp = Pin("P1", Pin.IN, Pin.PULL_UP)
print(inp.value())

พินอินพุตใดก็ตามสามารถสร้างอินเทอร์รัปต์บนการเปลี่ยนขอบสัญญาณได้:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

บัส

TX

RX

UART3

P4

P5

from machine import UART

uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

บัส

SCL

SDA

I2C2

P4

P5

from machine import I2C

i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

ฮาร์ดแวร์เดียวกันนี้ยังสามารถใช้งานในโหมด target (slave) ผ่าน machine.I2CTarget เพื่อเปิดเผยพื้นที่หน่วยความจำให้กับ I²C controller ตัวอื่น:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

SPI

บัส

MOSI

MISO

SCK

CS

SPI2

P0

P1

P2

P3

from machine import SPI
from machine import Pin

spi = SPI(2, baudrate=10_000_000)
cs = Pin("P3", Pin.OUT, value=1)   # CS is not driven by the SPI peripheral

cs.value(0)
spi.write(b"hello")
cs.value(1)

CAN

บัส

TX

RX

CAN2

P2

P3

from machine import CAN

can = CAN(2, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())

ADC และ DAC

P6 เป็นพินอนาล็อกสำหรับผู้ใช้เพียงพินเดียว สามารถใช้เป็นอินพุต ADC 12 บิตหรือเอาต์พุต DAC ได้

  • ADC — สเกลเต็มที่ 3.3 V บนพิน:

    from machine import ADC
    import time
    
    adc = ADC("P6")
    while True:
        voltage = adc.read_u16() * 3.3 / 65535
        print(voltage)
        time.sleep_ms(100)
    
  • DAC — ผ่าน pyb.DAC ค่า 8 บิตครอบคลุมช่วง 0–3.3 V:

    from pyb import DAC
    
    dac = DAC("P6")
    voltage = 1.65
    dac.write(int(voltage / 3.3 * 255))
    

ในโหมด ADC หรือ DAC พิน P6 รองรับเฉพาะ 3.3 V เท่านั้น — ห้ามป้อน 5 V

PWM

พิน

ตัวจับเวลา / ช่อง

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Note

TIM1 ถูกสงวนไว้ โดยเฟิร์มแวร์เพื่อสร้าง pixel clock ของ camera sensor ดังนั้นช่อง TIM1 ที่อยู่บน P0/P1/P2 ทางกายภาพจึงไม่สามารถใช้สำหรับ PWM ของผู้ใช้โดยไม่ทำให้กล้องพัง

TIM4 ใช้ร่วมกับ pyb.Servo — การสร้าง servo จะกำหนดค่า timer ทั้งหมดใหม่เป็น 50 Hz จึงไม่ควรใช้ machine.PWM บน P7/P8 ร่วมกับ pyb.Servo ในสคริปต์เดียวกัน

ขับเคลื่อนพินใดก็ได้ผ่าน machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)

บัสแบบซอฟต์แวร์ bit‑bang

machine.SoftI2C และ machine.SoftSPI ทำงานบน GPIO ใดก็ได้หากคุณต้องการบัสเพิ่มเติม

Thermal sensor (ภายนอกบอร์ด)

เฟิร์มแวร์รองรับไดรเวอร์ fir --- ไดรเวอร์เซนเซอร์ความร้อน (fir == far infrared) สำหรับกล้องถ่ายภาพความร้อนที่ต่อสายภายนอก:

  • MLX90621 — อาร์เรย์ IR ขนาด 16 × 4

  • MLX90640 — อาร์เรย์ IR ขนาด 32 × 24

  • MLX90641 — อาร์เรย์ IR ขนาด 16 × 12

  • AMG8833 — อาร์เรย์ IR ขนาด 8 × 8

ต่อสายโมดูลเข้ากับบัส I²C ของบอร์ดและอ่านเฟรมด้วย fir.init() + fir.snapshot()

import time
import image
import fir

fir.init()                          # auto‑detects the sensor
clock = time.clock()

while True:
    clock.tick()
    try:
        img = fir.snapshot(x_scale=5, y_scale=5,
                           color_palette=image.PALETTE_IRONBOW,
                           hint=image.BICUBIC,
                           copy_to_fb=True)
    except OSError:
        continue
    print(clock.fps())

ไดรเวอร์ fir สื่อสารกับ sensor ผ่าน I²C 2 เท่านั้น — ต่อสายโมดูลเข้ากับ P4 (SCL) และ P5 (SDA)

การจับเวลา

time

โมดูล time ครอบคลุมการหน่วงเวลาแบบบล็อก เวลาโมโนโทนิก และการวัดเวลาที่ผ่านไป:

import time

time.sleep(1)              # seconds
time.sleep_ms(500)
time.sleep_us(10)

start = time.ticks_ms()
# ...do work...
elapsed = time.ticks_diff(time.ticks_ms(), start)

Virtual timer

machine.Timer กำหนดเวลาคอลแบ็กแบบต่อเนื่องหรือครั้งเดียวโดยไม่ใช้ช่อง hardware timer ผ่านค่า -1 เป็น id เพื่อใช้ virtual (software) timer:

from machine import Timer

one_shot = Timer(-1)
one_shot.init(period=5_000, mode=Timer.ONE_SHOT,
              callback=lambda t: print("once"))

periodic = Timer(-1)
periodic.init(period=2_000, mode=Timer.PERIODIC,
              callback=lambda t: print("tick"))

ค่า Period อยู่ในหน่วยมิลลิวินาที เรียก deinit() เพื่อหยุดและปล่อยช่อง

นาฬิกาเวลาจริง

machine.RTC เก็บเวลานาฬิกาแขวนข้ามการรีเซ็ต:

from machine import RTC

rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0))   # Y, M, D, weekday, h, m, s, subsec
print(rtc.datetime())

Watchdog

machine.WDT รีเซ็ตบอร์ดหากแอปพลิเคชันค้าง เมื่อเริ่มแล้วจะหยุดหรือกำหนดค่าใหม่ไม่ได้ — ให้ป้อนอาหารเป็นระยะในลูปหลักของคุณ:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

ข้อมูลการบูตและรันไทม์

หน้าต่างบูตโหลดเดอร์ USB

ทุกครั้งที่เปิดเครื่อง กล้องจะรันบูตโหลดเดอร์สั้นๆ (สักสองสามวินาที) ที่เปิดโอกาสให้ OpenMV IDE อัปเดตเฟิร์มแวร์โดยไม่ต้องให้ผู้ใช้เข้าสู่โหมด DFU ด้วยตนเอง หลังจากหน้าต่างหมดเวลา บูตโหลดเดอร์จะส่งต่อการทำงานให้ boot.py แล้วตามด้วย main.py

สคริปต์ที่กำลังทำงานสามารถกลับเข้าสู่บูตโหลดเดอร์ตามต้องการได้โดยเรียก machine.bootloader()

import machine

machine.bootloader()

ระบบไฟล์และลำดับการบูต

เฟิร์มแวร์ M4 mount ระบบไฟล์ได้สูงสุดสามระบบเมื่อบูต:

  • แฟลชภายใน — mount ที่ /flash เสมอ เก็บ main.py และ README.txt ตามค่าเริ่มต้น สร้างขึ้นในการบูตครั้งแรก

  • microSD card — หากใส่การ์ดแล้วจะถูก mount ที่ /sdcard

  • ROMFS — ระบบไฟล์แบบ read‑only memory‑mapped ที่ /rom ใช้สำหรับจัดส่ง asset ข้อมูลขนาดใหญ่ (เช่น โมเดล AI) ที่ได้ประโยชน์จากการเข้าถึงแบบ zero‑copy ถูก mount โดยอัตโนมัติโดย MicroPython เมื่อเริ่มต้น ก่อนที่ Python ของผู้ใช้จะทำงาน

หลังจาก mount แล้ว ไดเรกทอรีทำงานจะถูกตั้งเป็น /sdcard เมื่อมีการ์ดอยู่ มิฉะนั้นจะเป็น /flash จากนั้น interpreter จะรันสคริปต์จากไดเรกทอรีนั้น:

  • boot.py จะถูกรันทุก soft reset (บูตเย็น, Ctrl‑D จาก REPL หรือเมื่อสคริปต์ที่กำลังทำงานสิ้นสุด)

  • main.py จะถูกรัน เฉพาะบูตเย็นเท่านั้น ทันทีหลังจาก boot.py การ soft reset ครั้งต่อไปจะรัน boot.py ซ้ำแต่ตกลงสู่ REPL โดยตรง — หากต้องการรัน main.py ซ้ำต้องรีเซ็ตบอร์ดอย่างสมบูรณ์

การวาง boot.py หรือ main.py ลงบน SD card จะแทนที่ไฟล์ในแฟลชโดยไม่แตะต้องมัน — ไฟล์ทั้งสองถูกค้นหาในไดเรกทอรีบูต (/sdcard เมื่อมีการ์ด mount อยู่ มิฉะนั้น /flash)

main.py เริ่มต้นที่มาพร้อมกับบอร์ดที่เพิ่งเขียนโปรแกรมใหม่จะกระพริบช่อง สีน้ำเงิน ของ RGB LED สำหรับผู้ใช้เป็นสัญญาณการเต้นของหัวใจ (ชีพจรสั้นสองครั้ง แล้วหยุด) เพื่อให้คุณทราบว่าเฟิร์มแวร์บูตสำเร็จโดยไม่ต้องต่อโฮสต์ใด

sys.path ถูกขยายให้รวมระบบไฟล์ทั้งสามและไดเรกทอรีย่อย lib/ เพื่อให้โมดูลที่ import ได้อยู่ใน /flash/lib, /sdcard/lib หรือ /rom/lib

เพื่อบังคับให้ระบบเพิกเฉยต่อ SD card ที่ใส่อยู่ (เช่น เพื่อรัน main.py ในแฟลชแม้มีการ์ดอยู่) ให้สร้างไฟล์ว่างชื่อ SKIPSD ที่ root ของ /flash

เมื่อเชื่อมต่อผ่าน USB ระบบไฟล์บูต (/sdcard หากมีการ์ดอยู่ มิฉะนั้น /flash) จะปรากฏเป็น USB mass‑storage drive บนโฮสต์ด้วย ทำให้แก้ไข boot.py, main.py และไฟล์อื่นๆ ได้โดยตรง ให้ eject drive ก่อนรีเซ็ตกล้อง เพื่อให้โฮสต์บันทึกการเขียนที่แคชไว้

Note

เนื่องจาก OS ถือว่า drive เป็น block device แบบ passive ไฟล์ที่สร้างหรือแก้ไขโดยโค้ดที่ทำงานบน OpenMV Cam จะไม่ปรากฏจนกว่าโฮสต์จะ mount drive ใหม่ หาก OS และ OpenMV Cam เขียนระบบไฟล์เดียวกันพร้อมกัน OS จะชนะและเขียนทับการเปลี่ยนแปลงของกล้อง ใช้ SD card สำหรับข้อมูลที่สคริปต์เขียนกลับ และ mount ใหม่ก่อนอ่านไฟล์เหล่านั้นจากโฮสต์

Note

ช่อง สีแดง ของ RGB LED สำหรับผู้ใช้อาจกระพริบสั้นๆ ขณะโฮสต์กำลังอ่านหรือเขียนไปยัง USB mass‑storage drive — นี่คือตัวบ่งชี้การทำงานที่ขับเคลื่อนโดยเฟิร์มแวร์ ไม่ใช่ข้อผิดพลาด

ขนาดพื้นที่จัดเก็บ

M4 มาพร้อมกับ:

  • /flash — ระบบไฟล์ FAT 32 KB อ่าน/เขียนได้

  • /rom — ROMFS แบบ read-only memory-mapped ขนาด 128 KB

  • /sdcard — ขนาดเต็มของ microSD card ที่ใส่อยู่ (เมื่อมี) อ่าน/เขียนได้

ตัวบ่งชี้ hard fault

หาก RGB LED สำหรับผู้ใช้วนไซเคิลผ่านสีทั้งหมดอย่างรวดเร็ว — เร็วพอที่มักดูเหมือน LED สีขาวกะพริบ มากกว่าสีที่แตกต่างกัน — แสดงว่าเฟิร์มแวร์ประสบกับ hard fault ที่ไม่สามารถกู้คืนได้ ให้เขียนโปรแกรมเฟิร์มแวร์ใหม่เพื่อกู้คืน หากการเขียนโปรแกรมใหม่ไม่ช่วย บอร์ดอาจเสียหายทางกายภาพ

ไลบรารีซอฟต์แวร์

ดู ดัชนีไลบรารี สำหรับรายการโมดูลทั้งหมด รวมถึงโมดูลที่มีเฉพาะใน M4 build