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 --- เซ็นเซอร์กล้อง เดียวกัน
สำหรับ 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
พินเอาต์¶
อ้างอิงพิน¶
ชื่อพิน |
ฟังก์ชัน |
|---|---|
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_BLUEfrom 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 ที่
/sdcardROMFS — ระบบไฟล์แบบ 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