OpenMV Cam H7 Plus

OpenMV Cam H7 Plus 將意法半導體(STMicroelectronics)的 STM32H743(Cortex‑M7 @ 480 MHz)與 32 MB 外部 SDRAM、32 MB QSPI flash、硬體 JPEG 編解碼器,以及位於可拆卸載板上的 OV5640 5MP 相機模組搭配在一起。額外的記憶體非常適合高解析度擷取與大型影像緩衝區。

OpenMV Cam H7 Plus

完整的資料手冊、照片與尺寸資訊請參閱 OpenMV Cam H7 Plus 產品頁面

特色亮點

  • 意法半導體(STMicroelectronics)STM32H743 Cortex‑M7,480 MHz(1027 DMIPS)。

  • 硬體 JPEG 編碼器/解碼器

  • 32 MB 外部 SDRAM(32 位元 @ 100 MHz,400 MB/s)外加 1 MB 內部 SRAM

  • 2 MB 內部 flash + 32 MB 外部 QSPI flash(讀取約 100 MB/s)。

  • OV5640 5MP 捲簾式快門感測器。

  • 全速 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),支援中斷。在 ADC 或 DAC 模式下使用時,P6 可承受 5 V。

  • 使用者 RGB LED 以及兩顆高功率 850 nm 紅外線 LED,可在低光環境的視覺應用中提供主動照明。

備註

H7 Plus 沒有板載電源管理晶片:沒有電池充電器、沒有電池電壓 ADC、沒有充電/電源狀態 LED,也沒有硬體電源按鈕。請將已充電的 LiPo 接到電池 JST 接頭,或透過 USB/VIN 為板子供電。

接腳配置

OpenMV Cam H7 Plus OV5640 接腳配置

接腳參考

接腳名稱

功能

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

數位 I/O

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 Plus 上它不會接到 MCU。請從外部驅動或讀取它;你無法從 MicroPython 切換它。

電源接腳

  • 3.3V — 經穩壓的 3.3 V 電源軌。可為擴充板提供最高 250 mA(使用 microSD 卡時較少)。與較新的相機不同,此接腳為雙向 — 請參閱下方警告。

  • VIN — 3.6 – 5 V 輸入。透過板載穩壓器為板子供電。

  • GND — 共用接地。

板上也有 3.7 V LiPo 接頭,但 H7 Plus 沒有電池充電器 — 請接入已充電的電池芯,或改為提供 VIN/USB。

備註

當 USB 與 VIN/LiPo 同時存在時,以 VIN/LiPo 輸入為優先 — 板載電源切換開關會選擇它而非 USB 來為板子供電。

警告

在 H7 Plus 上,電池接頭與 VIN 是接在一起的。請不要同時接上 LiPo 並施加 VIN — 兩個電源會相互衝突,可能損壞電池、板子,或兩者皆損。

警告

如果你不想經過板載穩壓器,可以直接將 3.3 V 餵入 3.3V 接腳來為 H7 Plus 供電。在此情況下,請勿同時施加 VIN 或 USB 電源 — 在另一個電源啟動時反向驅動穩壓器,可能永久損壞並摧毀相機。

小訣竅

請使用 電池續航估算器,以針對特定的作用/深度睡眠工作週期,估算 H7 Plus 以電池供電可運作多久。

復原與除錯接腳

  • RESET — 拉至 GND 以重置板子。釋放後 MCU 會正常啟動。

  • BOOT0 — 在為板子供電時拉至 3.3 V,以進入 STM32 ROM 開機載入程式(DFU 模式)。OpenMV IDE 使用此模式重新燒錄板載開機載入程式。

板子在 GPIO 排針旁提供 SWD 除錯排針(RST / SWCLK / SWDIO / SWO),相容於 ST‑LINK 與 SEGGER J‑Link 轉接器。

備註

SWO 追蹤接腳與相機排針的 SPI 時脈線共用。SWO 無法與任何透過 SPI 與 MCU 通訊的相機模組同時使用 — 例如 FLIR® Lepton® 轉接模組 — 兩者只能擇一。

板載周邊裝置

LED

H7 Plus 具有單顆使用者 RGB LED 以及一對高功率 850 nm 紅外線 LED:

  • 使用者 RGB LED — 可由軟體控制,以 LED_REDLED_GREENLED_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
    

相機感測器

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,感測器便會將壓縮後的影格直接透過相機匯流排送到 cam,這使得高解析度擷取變得實用: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 相機模組(全域快門、熱成像、更高解析度等),而無需更動板子的其餘部分。

機器學習

ml --- 機器學習 在 Cortex‑M7 上以 CMSIS‑NN 核心執行量化的 TFLite 模型 — 速度足以讓精簡型偵測器以每秒數影格的速度運作。位於唯讀 /rom 檔案系統上的模型可直接從 flash 載入,而無需複製到 RAM。以下是一個 128×128 的 BlazeFace 偵測器,會在每一影格上疊加偵測到的臉部及其六個地標:

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")

同一個硬體也可透過 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

備註

TIM1 被韌體保留用於產生相機感測器的像素時脈,因此實體上位於 P0/P1/P2 的 TIM1 通道無法用於使用者 PWM,否則會破壞相機運作。

TIM4 與 pyb.Servo 共用 — 實例化一個伺服機會將整個計時器重新設定為 50 Hz 運作,因此請勿在同一個指令碼中將 P7/P8 上的 machine.PWMpyb.Servo 混用。

透過 machine.PWM 驅動其中任何一個:

from machine import Pin, PWM

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

軟體位元擺動匯流排

如果你需要額外的匯流排,machine.SoftI2Cmachine.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 Plus 韌體在開機時最多掛載三個檔案系統:

  • 內部 flash — 永遠掛載於 /flash。預設存放 main.pyREADME.txt;在最初第一次開機時建立。

  • microSD 卡 — 如果插入了卡片,則掛載於 /sdcard

  • ROMFS — 位於 /rom 的唯讀、記憶體映射檔案系統,用於封裝可受惠於零複製存取的大型資料資產(例如 AI 模型)。在任何使用者 Python 執行之前,由 MicroPython 於啟動時自動掛載。

掛載完成後,當卡片存在時,工作目錄會設為 /sdcard,否則為 /flash。直譯器接著會從該目錄執行指令碼:

  • boot.py 會在每一次軟重置時執行(冷開機、從 REPL 按 Ctrl‑D,或每當執行中的指令碼返回時)。

  • main.py 僅在冷開機時執行,緊接在 boot.py 之後。後續的軟重置會重新執行 boot.py,但會直接落入 REPL — 若要重新執行 main.py,你必須完全重置板子。

boot.pymain.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.pymain.py 及任何其他檔案。請在重置相機前退出該磁碟,以便主機清空其快取的寫入。

備註

由於作業系統將該磁碟視為被動的區塊裝置,由 OpenMV Cam 上執行的程式碼所建立或修改的檔案,要等到主機重新掛載磁碟後才會顯示。如果作業系統與 OpenMV Cam 同時寫入同一個檔案系統,作業系統將會勝出,並覆蓋相機所做的變更。對於指令碼要寫回的任何資料,請使用 SD 卡,並在從主機讀取這些檔案前重新掛載。

備註

當主機正在讀取或寫入 USB 大容量儲存磁碟時,使用者 RGB LED 的紅色通道可能會短暫亮起 — 這是韌體驅動的活動指示,並非故障。

儲存容量

H7 Plus 出貨時配備:

  • /flash24 MB FAT 檔案系統,可讀寫。

  • /rom8 MB 唯讀記憶體映射 ROMFS,用於封裝可受惠於零複製 mmap 存取的指令碼與 ML 模型。

  • /sdcard — 所插入 microSD 卡的完整容量(存在時),可讀寫。

硬性故障指示

如果使用者 RGB LED 正快速循環顯示所有色彩 — 快到看起來像一顆閃爍的白色 LED而非各自分明的色相 — 表示韌體遇到了無法復原的硬性故障(hard fault)。請重新燒錄韌體以復原;若重新燒錄無效,板子可能已實體損壞。

軟體程式庫

完整的模組清單請參閱 程式庫索引 — 包括哪些模組是 H7 Plus 建置所獨有的。