OpenMV Cam H7 Plus¶
OpenMV Cam H7 Plus จับคู่ STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) กับ SDRAM ภายนอก 32 MB, แฟลช QSPI 32 MB, ตัวเข้ารหัส JPEG แบบฮาร์ดแวร์ และโมดูลกล้อง OV5640 5MP บนแผงรองรับแบบถอดได้ หน่วยความจำพิเศษนี้เหมาะสำหรับการบันทึกภาพความละเอียดสูงและบัฟเฟอร์เฟรมขนาดใหญ่
สำหรับข้อมูลจำเพาะฉบับเต็ม รูปภาพ และขนาด ดูได้ที่ หน้าผลิตภัณฑ์ OpenMV Cam H7 Plus
ไฮไลท์¶
STMicroelectronics STM32H743 Cortex‑M7 ที่ 480 MHz (1027 DMIPS)
ตัวเข้ารหัส/ถอดรหัส JPEG แบบฮาร์ดแวร์
SDRAM ภายนอก 32 MB (32‑bit @ 100 MHz, 400 MB/s) พร้อม SRAM ภายใน 1 MB
แฟลชภายใน 2 MB + แฟลช QSPI ภายนอก 32 MB (~100 MB/s อ่าน)
เซนเซอร์ rolling‑shutter OV5640 5MP
USB Full‑Speed (12 Mb/s) — ปรากฏเป็น VCP + USB mass storage ต่อโฮสต์
ซ็อกเก็ต microSD — SD สูงสุด 2 GB, SDHC สูงสุด 32 GB, SDXC สูงสุด 2 TB
ขั้วต่อแบตเตอรี่ LiPo (ไม่มีตัวชาร์จในตัว — จ่ายไฟด้วยเซลล์ที่ชาร์จแล้ว หรือใช้ VIN/USB)
พิน I/O 10 พิน, ทนทาน 5 V พร้อมเอาต์พุต 3.3 V, 25 mA ต่อพิน (รวม 120 mA ตลอดเฮดเดอร์), รองรับอินเทอร์รัปต์ P6 ไม่ ทนทาน 5 V เมื่อใช้ในโหมด ADC หรือ DAC
LED RGB สำหรับผู้ใช้ และ IR LED กำลังสูง 850 nm สองดวง สำหรับแสงเสริมในการมองเห็นแสงน้อย
Note
H7 Plus ไม่มีชิปจัดการพลังงานในตัว: ไม่มีตัวชาร์จแบตเตอรี่, ไม่มี ADC วัดแรงดันแบตเตอรี่, ไม่มี LED แสดงสถานะการชาร์จ/พลังงาน และไม่มีปุ่มเปิด/ปิดฮาร์ดแวร์ เชื่อมต่อ LiPo ที่ชาร์จแล้วเข้ากับ JST แบตเตอรี่ หรือจ่ายไฟบอร์ดจาก USB / VIN
พินเอาต์¶
ตารางอ้างอิงพิน¶
ชื่อพิน |
ฟังก์ชัน |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / FDCAN2 TX |
P3 |
SPI2 NSS (CS) / FDCAN2 RX |
P4 |
I2C2 SCL / UART3 TX / TIM2 CH3 |
P5 |
I2C2 SDA / UART3 RX / TIM2 CH4 |
P6 |
ADC / DAC / TIM2 CH1 |
P7 |
I2C4 SCL / TIM4 CH1 |
P8 |
I2C4 SDA / TIM4 CH2 |
P9 |
digital I/O |
RESET |
ดึงลง GND เพื่อรีเซ็ตบอร์ด |
SYN |
แพด frame‑sync — เชื่อมต่อเฉพาะกับเซนเซอร์กล้อง |
BOOT0 |
ดึงขึ้น 3.3 V ตอนเปิดเครื่องเพื่อเข้า DFU / ROM บูตโหลดเดอร์ |
LED_RED |
ช่องสีแดงของ RGB LED (active low) |
LED_GREEN |
ช่องสีเขียวของ RGB LED (active low) |
LED_BLUE |
ช่องสีน้ำเงินของ RGB LED (active low) |
LED_IR |
IR LED กำลังสูง (ทั้งสองช่องขับพร้อมกัน) |
Note
แพด SYN บนเฮดเดอร์เชื่อมต่อโดยตรงกับสายทริกเกอร์/การรับแสงของเซนเซอร์กล้อง — ไม่ได้ เชื่อมต่อกับ MCU บน H7 Plus ขับหรืออ่านจากภายนอกได้ แต่ไม่สามารถสลับสถานะจาก MicroPython ได้
พินจ่ายไฟ¶
3.3V — ราง 3.3 V ที่ผ่านตัวควบคุมแล้ว มีกระแสสูงสุด 250 mA สำหรับชีลด์ (น้อยกว่านั้นหากใช้การ์ด microSD) ต่างจากกล้องรุ่นใหม่กว่า พินนี้เป็นแบบสองทิศทาง — ดูคำเตือนด้านล่าง
VIN — อินพุต 3.6 – 5 V จ่ายไฟให้บอร์ดผ่านตัวควบคุมในตัว
GND — กราวด์ร่วม
มีขั้วต่อ LiPo 3.7 V ด้วย แต่ H7 Plus ไม่มีตัวชาร์จแบตเตอรี่ — เชื่อมต่อเซลล์ที่ชาร์จแล้ว หรือจ่ายไฟผ่าน VIN / USB แทน
Note
เมื่อมีทั้ง USB และ VIN/LiPo, อินพุต VIN/LiPo จะชนะ — สวิตช์พลังงานในตัวจะเลือก VIN/LiPo เหนือ USB เพื่อจ่ายไฟให้บอร์ด
Warning
ขั้วต่อแบตเตอรี่และ VIN เชื่อมต่อกัน บน H7 Plus อย่า เสียบ LiPo และจ่าย VIN พร้อมกัน — แหล่งจ่ายทั้งสองจะขัดแย้งกันและอาจทำให้แบตเตอรี่, บอร์ด หรือทั้งสองเสียหาย
Warning
สามารถ จ่ายไฟให้ H7 Plus โดยป้อน 3.3 V โดยตรงเข้าพิน 3.3V หากไม่ต้องการผ่านตัวควบคุมในตัว ในกรณีนั้น อย่าจ่าย VIN หรือไฟ USB พร้อมกัน — การขับย้อนกลับตัวควบคุมขณะที่แหล่งจ่ายอื่นทำงานอยู่อาจทำให้กล้องเสียหายถาวร
Tip
ใช้ เครื่องมือประมาณอายุแบตเตอรี่ เพื่อสร้างแบบจำลองว่า H7 Plus จะทำงานได้นานเท่าใดบนแบตเตอรี่สำหรับรอบการทำงานแบบ active / deep-sleep ที่กำหนด
พินสำหรับกู้คืนและดีบัก¶
RESET — ดึงลง GND เพื่อรีเซ็ตบอร์ด การปล่อยพินจะให้ MCU เริ่มต้นทำงานตามปกติ
BOOT0 — ดึงขึ้น 3.3 V ขณะเปิดเครื่องเพื่อเข้า ROM บูตโหลดเดอร์ของ STM32 (โหมด DFU) OpenMV IDE ใช้โหมดนี้ในการเขียนโปรแกรมบูตโหลดเดอร์ในตัวใหม่
บอร์ดมีเฮดเดอร์ดีบัก SWD (RST / SWCLK / SWDIO / SWO) อยู่ข้างเฮดเดอร์ GPIO รองรับ ST‑LINK และ SEGGER J‑Link
Note
พินเทรซ SWO ใช้ร่วมกับสาย SPI clock ของเฮดเดอร์กล้อง SWO ไม่สามารถใช้พร้อมกับโมดูลกล้องที่สื่อสารกับ MCU ผ่าน SPI ได้ เช่น FLIR® Lepton® Adapter Module — ต้องเลือกอย่างใดอย่างหนึ่ง
อุปกรณ์ต่อพ่วงในตัว¶
LED¶
H7 Plus มี 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 LED — 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
เซนเซอร์กล้อง¶
OV5640 ถูกขับเคลื่อนผ่านโมดูล 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()
OV5640 มีตัวบีบอัด JPEG ในตัว ตั้งค่า csi.CSI.pixformat เป็น csi.JPEG แล้วเซนเซอร์จะส่งเฟรมที่บีบอัดแล้วไปยังกล้องโดยตรงผ่านบัสกล้อง ทำให้การบันทึกภาพความละเอียดสูงทำได้จริง: csi.HD (1280×720), csi.FHD (1920×1080) และ 5MP เต็ม csi.WQXGA2 (2592×1944) ล้วนสตรีมเป็น JPEG ปรับการบีบอัดด้วย csi.CSI.quality (0-100 ค่าสูง = เฟรมใหญ่, รายละเอียดมากขึ้น):
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
เซนเซอร์อยู่บน โมดูลแบบถอดได้ — สามารถเปลี่ยนเป็นโมดูลกล้อง OpenMV อื่น ๆ (global shutter, ความร้อน, ความละเอียดสูงกว่า ฯลฯ) ได้โดยไม่ต้องเปลี่ยนส่วนอื่นของบอร์ด
Machine learning¶
ml --- Machine Learning รันโมเดล TFLite แบบ quantised บน Cortex‑M7 ด้วยเคอร์เนล CMSIS‑NN — เร็วพอสำหรับตัวตรวจจับขนาดเล็กที่ไม่กี่เฟรมต่อวินาที โมเดลบนระบบไฟล์ /rom แบบอ่านอย่างเดียวโหลดโดยตรงจากแฟลชโดยไม่ต้องคัดลอกไปยัง RAM นี่คือตัวตรวจจับใบหน้า BlazeFace ขนาด 128×128 ที่ซ้อนทับใบหน้าที่ตรวจพบและจุดสำคัญ 6 จุดบนทุกเฟรม:
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces is a list of ((x, y, w, h), score, keypoints) tuples
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints is a ndarray of shape (6, 2)
# 0 - right eye (x, y)
# 1 - left eye (x, y)
# 2 - nose (x, y)
# 3 - mouth (x, y)
# 4 - right ear (x, y)
# 5 - left ear (x, y)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
การ์ด microSD¶
เมื่อใส่การ์ด ระบบจะเมาท์โดยอัตโนมัติที่ /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 |
|---|---|---|
UART1 |
P1 |
P0 |
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 |
I2C4 |
P7 |
P8 |
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 (FDCAN)¶
บัส |
TX |
RX |
|---|---|---|
FDCAN2 |
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 ของเซนเซอร์กล้อง ดังนั้นช่อง TIM1 ที่อยู่บน P0/P1/P2 ทางกายภาพไม่สามารถใช้สำหรับ PWM ของผู้ใช้ได้โดยไม่ทำให้กล้องเสียหาย
TIM4 ใช้ร่วมกับ pyb.Servo — การสร้างอินสแตนซ์เซอร์โวจะกำหนดค่าตัวจับเวลาทั้งหมดใหม่สำหรับการทำงานที่ 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)
บัสแบบ Software bit‑bang¶
machine.SoftI2C และ machine.SoftSPI ทำงานบน GPIO ใดก็ได้หากต้องการบัสเพิ่มเติม
เซนเซอร์ความร้อน (ภายนอกบอร์ด)¶
เฟิร์มแวร์รวมไดรเวอร์ 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 สื่อสารกับเซนเซอร์ผ่าน I²C 2 เท่านั้น — เชื่อมต่อโมดูลกับ P4 (SCL) และ P5 (SDA)
การกำหนดเวลา¶
time¶
โมดูล time ครอบคลุมการหน่วงเวลาแบบบล็อก, ticks แบบ monotonic และการวัดเวลาที่ผ่านไป:
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)
ตัวจับเวลาเสมือน¶
machine.Timer กำหนดเวลาคอลแบ็กแบบต่อเนื่องหรือครั้งเดียวโดยไม่ใช้สล็อตตัวจับเวลาฮาร์ดแวร์ ส่ง -1 เป็น id เพื่อใช้ตัวจับเวลาเสมือน (ซอฟต์แวร์):
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"))
ค่าคาบเวลาเป็นมิลลิวินาที เรียก 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()
ระบบไฟล์และลำดับการบูต¶
เฟิร์มแวร์ H7 Plus เมาท์ระบบไฟล์สูงสุดสามระบบตอนบูต:
แฟลชภายใน — เมาท์ที่
/flashเสมอ เก็บmain.pyและREADME.txtไว้โดยค่าเริ่มต้น สร้างขึ้นในการบูตครั้งแรกการ์ด microSD — หากมีการ์ดอยู่ จะเมาท์ที่
/sdcardROMFS — ระบบไฟล์ที่ map ลงหน่วยความจำแบบอ่านอย่างเดียวที่
/romใช้ส่งมอบทรัพยากรข้อมูลขนาดใหญ่ (เช่น โมเดล AI) ที่ได้ประโยชน์จากการเข้าถึงแบบ zero‑copy เมาท์โดยอัตโนมัติโดย MicroPython ตอนเริ่มต้น ก่อน Python ของผู้ใช้จะทำงาน
หลังจากเมาท์แล้ว working directory จะถูกตั้งเป็น /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 จะแทนที่ไฟล์ในแฟลชโดยไม่แตะต้องมัน — ทั้งสองไฟล์จะถูกค้นหาในไดเรกทอรีบูต (/sdcard เมื่อการ์ดถูกเมาท์ มิฉะนั้นจะเป็น /flash)
main.py ที่มาพร้อมกับบอร์ดที่เพิ่งเขียนโปรแกรมใหม่จะกะพริบช่อง สีน้ำเงิน ของ RGB LED สำหรับผู้ใช้เป็นสัญญาณ heartbeat (พัลส์สั้นสองครั้ง, ช่องว่างสั้น) เพื่อให้รู้ว่าเฟิร์มแวร์บูตสำเร็จโดยไม่มีโฮสต์เชื่อมต่อ
sys.path ถูกขยายให้รวมระบบไฟล์ทั้งสามและไดเรกทอรีย่อย lib/ ของแต่ละระบบ ดังนั้นโมดูลที่ import ได้สามารถอยู่ใน /flash/lib, /sdcard/lib หรือ /rom/lib
หากต้องการบังคับให้ระบบเพิกเฉยต่อการ์ด SD ที่ใส่อยู่ (เช่น เพื่อรัน main.py จากแฟลชแม้จะมีการ์ดอยู่) ให้สร้างไฟล์เปล่าชื่อ SKIPSD ที่รูทของ /flash
เมื่อเชื่อมต่อผ่าน USB ระบบไฟล์การบูต (/sdcard หากมีการ์ด มิฉะนั้นจะเป็น /flash) จะปรากฏเป็น USB mass‑storage drive บนโฮสต์ด้วย ทำให้คุณแก้ไข boot.py, main.py และไฟล์อื่น ๆ ได้โดยตรง Eject ไดรฟ์ก่อนรีเซ็ตกล้อง เพื่อให้โฮสต์ flush การเขียนที่แคชไว้
Note
เนื่องจาก OS จัดการไดรฟ์เป็น block device แบบ passive ไฟล์ที่สร้างหรือแก้ไขโดยโค้ดที่ทำงานบน OpenMV Cam จะไม่ปรากฏจนกว่าโฮสต์จะ remount ไดรฟ์ หาก OS และ OpenMV Cam เขียนลงระบบไฟล์เดียวกันพร้อมกัน OS จะชนะและเขียนทับการเปลี่ยนแปลงของกล้อง ใช้การ์ด SD สำหรับข้อมูลที่สคริปต์เขียนกลับ และ remount ก่อนอ่านไฟล์เหล่านั้นจากโฮสต์
Note
ช่อง สีแดง ของ RGB LED สำหรับผู้ใช้อาจติดสว่างชั่วขณะขณะที่โฮสต์กำลังอ่านหรือเขียนลง USB mass‑storage drive — นี่คือตัวแสดงกิจกรรมที่ขับเคลื่อนโดยเฟิร์มแวร์ ไม่ใช่ความผิดพลาด
ขนาดพื้นที่เก็บข้อมูล¶
H7 Plus มาพร้อมกับ:
/flash— ระบบไฟล์ FAT 24 MB อ่าน/เขียน/rom— ROMFS แบบอ่านอย่างเดียว map ลงหน่วยความจำขนาด 8 MB ใช้ส่งมอบสคริปต์และโมเดล ML ที่ได้ประโยชน์จากการเข้าถึง mmap แบบ zero-copy/sdcard— ขนาดเต็มของการ์ด microSD ที่ใส่อยู่ (เมื่อมีการ์ด) อ่าน/เขียน
ตัวบ่งชี้ hard‑fault¶
หาก RGB LED สำหรับผู้ใช้วนซ้ำสีทุกสีอย่างรวดเร็ว — เร็วพอที่มักดูเหมือน LED ขาวกะพริบ มากกว่าสีต่างๆ — แสดงว่าเฟิร์มแวร์พบ hard fault ที่กู้คืนไม่ได้ เขียนโปรแกรมเฟิร์มแวร์ใหม่เพื่อแก้ไข หากเขียนใหม่แล้วยังไม่ดีขึ้น บอร์ดอาจเสียหายทางกายภาพ
ไลบรารีซอฟต์แวร์¶
ดู ดัชนีไลบรารี สำหรับรายการโมดูลทั้งหมด — รวมถึงโมดูลที่มีเฉพาะใน H7 Plus build