OpenMV Cam H7¶
OpenMV Cam H7 是一款以 Cortex‑M7 為核心的機器視覺開發板,採用 STMicroelectronics STM32H743,運行頻率為 480 MHz,內建 1 MB SRAM、2 MB 內部 flash(快閃記憶體),以及硬體 JPEG 編解碼器。本開發板共有兩種感測器版本——搭載 OV7725 的 H7,以及搭載 ON Semi MT9M114 的 H7 R2——但兩者的韌體、接腳配置與 Python API 完全相同。
如需完整規格書、照片與尺寸資訊,請參閱 OpenMV Cam H7 產品頁面。
重點特色¶
STMicroelectronics STM32H743 Cortex‑M7,480 MHz(1027 DMIPS)。
硬體 JPEG 編碼器/解碼器。
1 MB 內部 SRAM——無外接 SDRAM。
2 MB 內部 flash(快閃記憶體)(無外接 QSPI flash)。
OV7725 感測器(H7 R2 上則為 MT9M114)。
全速 USB(12 Mb/s)——對主機而言會顯示為 VCP 加上 USB 大容量儲存裝置。
microSD 插槽——SD 最高支援 2 GB、SDHC 最高 32 GB、SDXC 最高 2 TB。
LiPo 電池接頭(無板載充電器——請接入已充電的電池芯,或透過 VIN/USB 供電)。
10 個 I/O 接腳,可耐受 5 V,輸出為 3.3 V,每接腳 25 mA(整排接腳合計 120 mA),支援中斷。P6 在 ADC 或 DAC 模式下使用時無法耐受 5 V。
使用者 RGB LED 以及兩顆高功率 850 nm 紅外線 LED,可在低光環境下提供主動照明以利視覺辨識。
備註
H7 沒有板載電源管理晶片:沒有電池充電器、沒有電池電壓 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 |
TIM4 CH3 |
RESET |
拉至 GND 以重置開發板 |
SYN |
影格同步焊墊——僅連接至相機感測器 |
BOOT0 |
上電時拉至 3.3 V 以進入 DFU / ROM 開機載入程式 |
LED_RED |
RGB LED 紅色通道(低電位有效) |
LED_GREEN |
RGB LED 綠色通道(低電位有效) |
LED_BLUE |
RGB LED 藍色通道(低電位有效) |
LED_IR |
高功率紅外線 LED(兩個通道一起驅動) |
備註
接腳排上的 SYN 焊墊直接連接至相機感測器的觸發/曝光線——在 H7 上它不會連到 MCU。請從外部驅動或讀取它;你無法從 MicroPython 切換它。
電源接腳¶
3.3V——穩壓後的 3.3 V 電源軌。最多可供 250 mA 給擴充板使用(若 microSD 卡正在使用中則較少)。與較新的相機不同,此接腳為雙向——請參閱下方的警告。
VIN——3.6 – 5 V 輸入。透過板載穩壓器為開發板供電。
GND——共用接地。
板上同時也有一個 3.7 V LiPo 接頭,但 H7 並沒有電池充電器——請接入已充電的電池芯,或改以 VIN / USB 供電。
備註
當 USB 與 VIN/LiPo 同時存在時,VIN/LiPo 輸入會優先採用——板載電源切換器會選擇它而非 USB 來為開發板供電。
警告
H7 上的電池接頭與 VIN 是相連在一起的。請勿同時插入 LiPo 並施加 VIN——這兩路電源會互相衝突,可能損壞電池、開發板,或兩者皆損壞。
警告
如果你不想經過板載穩壓器,可以直接將 3.3 V 饋入 3.3V 接腳來為 H7 供電。在這種情況下,請勿同時施加 VIN 或 USB 電源——當另一路電源在作用時反向驅動穩壓器,可能會永久損壞並毀掉相機。
小訣竅
使用 電池續航估算器 來推算 H7 在給定的作用/深度睡眠工作週期下,依靠電池可運作多久。
回復與除錯接腳¶
RESET——拉至 GND 以重置開發板。放開後即可讓 MCU 正常啟動。
BOOT0——在為開發板供電時拉至 3.3 V,即可進入 STM32 ROM 開機載入程式(DFU 模式)。OpenMV IDE 利用此模式來重新燒錄板載開機載入程式。
開發板在 GPIO 接腳排旁另外提供一個 SWD 除錯接腳排(RST / SWCLK / SWDIO),相容於 ST‑LINK 與 SEGGER J‑Link 轉接器。
板載周邊裝置¶
LED¶
H7 配有一顆使用者 RGB LED,外加一對高功率 850 nm 紅外線 LED:
使用者 RGB LED——可由軟體控制,以
LED_RED、LED_GREEN與LED_BLUE形式公開:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
紅外線 LED——兩顆 LED 透過
LED_IR接腳一起驅動。在硬體上LED_IR是高電位有效接線,而韌體對所有其他板載 LED 都視為低電位有效,因此請使用low()/high(),而非on()/off()(後者會反轉邏輯):from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
相機感測器¶
OV7725(H7 R2 上則為 MT9M114)是透過 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()
感測器位於一個可拆卸模組上——你可以將它換成任何其他 OpenMV 相機模組(全域快門、熱成像、更高解析度等),而無需更動開發板的其餘部分。
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")
同一組硬體也可以透過 machine.I2CTarget 以目標(從)模式運作,向另一個 I²C 控制器公開一塊記憶體區域:
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 是唯一的使用者類比接腳。它可作為 12 位元 ADC 輸入,或作為 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 |
P9 |
TIM4 CH3 |
備註
TIM1 已被韌體保留用來產生相機感測器的像素時脈,因此實體上位於 P0/P1/P2 的 TIM1 通道無法用於使用者 PWM,否則會破壞相機運作。
TIM4 與 pyb.Servo 共用——建立一個 servo 會將整個計時器重新設定為 50 Hz 運作,因此請勿在同一份指令碼中,於 P7/P8/P9 上混用 machine.PWM 與 pyb.Servo。
透過 machine.PWM 驅動其中任一接腳:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
軟體位元模擬匯流排¶
若你需要額外的匯流排,machine.SoftI2C 與 machine.SoftSPI 可在任何 GPIO 上運作。
熱成像感測器(板外)¶
韌體內含 fir --- 熱感測器驅動程式 (fir == far infrared,遠紅外線) 驅動程式,可用於外部接線的熱成像儀:
MLX90621——16 × 4 紅外線陣列
MLX90640——32 × 24 紅外線陣列
MLX90641——16 × 12 紅外線陣列
AMG8833——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 模組涵蓋阻塞式延遲、單調遞增計時,以及經過時間的量測:
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())
看門狗¶
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 韌體在開機時最多會掛載三個檔案系統:
內部 flash(快閃記憶體)——一律掛載於
/flash。預設存放main.py與README.txt;於首次開機時建立。microSD 卡——若插入了卡片,它會被掛載於
/sdcard。ROMFS——位於
/rom的唯讀、記憶體映射檔案系統,用來附帶大型資料資產(例如 AI 模型),這類資產可受益於零複製存取。MicroPython 會在啟動時、任何使用者 Python 執行之前自動掛載它。
掛載完成後,若有插入卡片,工作目錄會設為 /sdcard,否則設為 /flash。直譯器接著會從該目錄執行指令碼:
boot.py會在每一次軟重置時執行(冷開機、從 REPL 按Ctrl‑D,或每當正在執行的指令碼返回時)。main.py僅在冷開機時執行,緊接在boot.py之後。後續的軟重置會重新執行boot.py,但會直接落到 REPL——若要重新執行main.py,你必須完全重置開發板。
將 boot.py 或 main.py 放到 SD 卡上,會覆蓋(但不會更動)flash 中的副本——這兩個檔案都會在開機目錄中尋找(卡片掛載時為 /sdcard,否則為 /flash)。
剛燒錄完的開發板上所附的預設 main.py,只會閃爍使用者 RGB LED 的藍色通道作為心跳訊號(兩次短脈衝,中間短暫間隔),讓你在沒有連接任何主機的情況下也能判斷韌體是否乾淨地完成開機。
sys.path 會擴充以納入全部三個檔案系統及其 lib/ 子目錄,因此可匯入的模組可放在 /flash/lib、/sdcard/lib 或 /rom/lib 中。
若要強制系統忽略已插入的 SD 卡(例如即使有卡片也要執行 flash 上的 main.py),請在 /flash 的根目錄建立一個名為 SKIPSD 的空檔案。
透過 USB 連接時,開機檔案系統(有插卡時為 /sdcard,否則為 /flash)也會在主機上列舉為一個 USB 大容量儲存磁碟,讓你能直接編輯 boot.py、main.py 及其他任何檔案。請在重置相機之前退出該磁碟,好讓主機把它快取的寫入內容刷新出去。
備註
由於作業系統將該磁碟視為被動的區塊裝置,因此由 OpenMV Cam 上執行的程式所建立或修改的檔案,在主機重新掛載磁碟之前不會顯示出來。如果作業系統與 OpenMV Cam 同時對相同檔案系統進行寫入,作業系統會勝出並覆蓋相機所做的變更。對於指令碼需要寫回的任何資料,請使用 SD 卡,並在從主機讀取那些檔案之前重新掛載。
備註
當主機正在對 USB 大容量儲存磁碟進行讀取或寫入時,使用者 RGB LED 的紅色通道可能會短暫亮起——這是韌體驅動的活動指示,並非故障。
儲存容量¶
H7 出廠時配有:
/flash——128 KB FAT 檔案系統,可讀寫。/rom——128 KB 唯讀記憶體映射 ROMFS。/sdcard——所插入 microSD 卡的完整容量(有插卡時),可讀寫。
嚴重錯誤指示¶
如果使用者 RGB LED 正在快速循環顯示所有顏色——速度快到看起來比較像是一顆閃爍的白色 LED而非各自分明的色調——表示韌體已遇到無法回復的嚴重錯誤(hard fault)。請重新燒錄韌體以回復;若重新燒錄仍無效,開發板可能已實體損壞。
軟體函式庫¶
完整的模組清單請參閱 函式庫索引——包括哪些是 H7 版本特有的。