OpenMV Pure Thermal

OpenMV Pure Thermal 是一款完整系統的熱成像開發板,以 STMicroelectronics STM32H743(Cortex‑M7 @ 480 MHz)為核心,搭載 64 MB 外部 SDRAM、32 MB QSPI flash、硬體 JPEG 編解碼器、4.3 吋 800×480 IPS 電容式觸控螢幕、HDMI 輸出、FLIR® Lepton® 熱成像插槽,以及一顆 5MP OV5640 可見光相機。它同時內建 Wi‑Fi、microSD 插槽、雷射測距儀、蜂鳴器,以及一顆高功率白光照明燈。

OpenMV Pure Thermal

完整的資料手冊、照片與尺寸圖請參閱 OpenMV Pure Thermal 產品頁面

重點特色

  • STMicroelectronics STM32H743XI Cortex‑M7,執行於 480 MHz。

  • 硬體 JPEG 編碼器/解碼器

  • 64 MB 外部 SDRAM(約 400 MB/s)外加 1 MB 內部 SRAM

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

  • OV5640 5MP 滾動快門可見光感測器。

  • FLIR® Lepton® 插槽 — 可接受任何 Lepton 1/2/2.5/3/3.5 模組,輻射式或非輻射式皆可,並提供以攝氏度為單位的逐像素溫度。

  • 4.3 吋 800×480 IPS 電容式觸控螢幕(24 位元色彩 @ 60 Hz),最多支援 5 點手勢。

  • HDMI 輸出,透過 TFP410 DVI 序列化器 — 最高可達 1280×720 @ 60 Hz。

  • Wi‑Fi,透過 WINC1500 實現;開箱即支援透過 RTSP 傳輸 MJPEG。

  • 全速 USB‑C(12 Mb/s,限流 900 mA)— 對主機顯示為 VCP + USB 大量儲存裝置,同時也負責充電。

  • microSD 插槽 — SD 最高 2 GB、SDHC 最高 32 GB、SDXC 最高 2 TB。

  • VL53L1CX 雷射測距儀(最遠約 4 m)。

  • 蜂鳴器,音量/頻率可由軟體控制。

  • 除了使用者 RGB 狀態 LED 之外,還有 高功率白光 LED 照明燈

  • LiPo 電池接頭,可透過 USB 以 500 mA 充電。

  • 10 個 I/O 接腳,可耐受 5 V,輸出 3.3 V,每個接腳 25 mA(總計 120 mA),支援中斷。P6 在 ADC 或 DAC 模式下使用時 耐受 5 V。

  • ARM 10 接腳 SWD 接頭,供 ST‑LINK / J‑Link 除錯使用。

  • Qwiic 接頭,供 I²C 周邊裝置使用。

備註

開發板左下緣有一個槽位,可選配安裝 ¼"–20 三腳架螺帽。出廠時並未安裝 — 若想將開發板安裝在標準相機三腳架上,請自行焊接一顆到槽位中。

接腳配置

OpenMV Pure Thermal 接腳配置

接腳參考

接腳名稱

功能

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

影格同步焊墊 — 未連接

VIN

擴充板 VIN 焊墊 — 未連接

BOOT0

於開機時拉至 3.3 V 以進入 DFU / ROM bootloader

BUZZER

板載壓電蜂鳴器(由 TIM2/PWM 驅動)

LED_RED

RGB 狀態 LED 紅色通道(低電位有效)

LED_GREEN

RGB 狀態 LED 綠色通道(低電位有效)

LED_BLUE

RGB 狀態 LED 藍色通道(低電位有效)

LED_WHITE

高功率白光照明 LED

備註

擴充板/排針上的 SYNVIN 焊墊在 Pure Thermal 上 沒有任何電氣連接 — 它們的存在僅是為了與排針相容。請改以 USB‑C 或板載 LiPo 電池接頭為開發板供電(參見下方的 電源接腳)。另請注意,VIN 焊墊在板上的絲印標示為 VBAT(標示錯誤)— 該位置就是標準 OpenMV 排針的 VIN 接腳,無論如何都未連接。

電源接腳

  • 3.3V — 穩壓 3.3 V 電源軌。可供擴充板使用最高 250 mA。

  • GND — 共用接地。

Pure Thermal 透過 USB‑C 或板載 LiPo 電池接頭 供電。USB‑C 連接埠總電流 限流為 900 mA,同時也以 500 mA 為 LiPo 充電,因此在接上 USB 的同時插入電池是受支援的。

板載 電源按鈕 可開關系統電源軌,無論開發板是由 USB 或 LiPo 供電都能運作。按住按鈕數秒 即可切換狀態 — 快速輕觸會被忽略,以防止意外關機。

電源來源的選擇遵循兩條簡單規則:

  • 只有當電池電壓高於 3 V 時才會為開發板供電。低於該閾值時,板載 PMIC 會斷開電池以防止過度放電。

  • 當有 USB 連接時,由 USB 為開發板供電,並在背景為已接上的 LiPo 充電。

LiPo 接頭還具備 反向電壓保護,因此即使把電池反接也不會損壞開發板。

備註

開發板還會將 電池電壓電池電流偵測 訊號回送至 MCU 的 ADC 通道,但目前韌體尚未加入對這兩者的支援。

復原與除錯接腳

  • RESET — 拉至 GND 以重置開發板。Pure Thermal 板上也有一顆專用的 RESET 按鈕,作用相同。

  • BOOT0 — 在為開發板供電時拉至 3.3 V,即可進入 STM32 ROM bootloader(DFU 模式)。OpenMV IDE 會利用此模式重新燒錄板載 bootloader。板上有一顆專用的 BOOT0 按鈕 作用相同 — 在通電時按住它即可。

開發板在 GPIO 排針旁提供一個 SWD 除錯排針(RST / SWCLK / SWDIO / SWO),與 ST‑LINK 和 SEGGER J‑Link 轉接器相容。另外還安裝了一個獨立的 ARM 10 接腳 SWD 接頭 — 它承載相同的 SWD 訊號(不含完整 JTAG),但採用標準的 0.05 吋 10 接腳規格。

備註

SWO 追蹤接腳與板載 FLIR® Lepton® 的 SPI 時脈共用。SWO 無法與 Lepton 同時使用 — 兩者只能擇一。

板上還安裝了第三個 PURE Modules Debug 接頭。它引出了一些以除錯為導向的訊號(SWCLK、SWDIO、RST、SPI2_MISO、SPI2_MOSI、VBUS、3.3 V、GND,以及兩個 GPIO 接腳),供連接配套模組使用。此接頭上的兩個 GPIO 接腳是由內部 軟體模擬(bit‑banged)I²C 匯流排 驅動,而非硬體周邊。

三個除錯接頭(行內 SWD 排針、ARM 10 接腳 SWD 接頭,以及 PURE Modules Debug 接頭)都以 3.3 V 為基準 — 連接前請確認你的除錯轉接器已設定為 3.3 V 邏輯電位。

板載周邊

LED

Pure Thermal 板上有三顆 LED:

  • 使用者 RGB LED — 可由軟體控制,透過 LED_REDLED_GREENLED_BLUE 存取:

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • 白光照明燈 — 透過 LED_WHITE 驅動。LED_WHITE 在硬體上接成 高電位有效,而韌體將其他所有板載 LED 視為低電位有效,因此請使用 low() / high(),而非 on() / off()(後者會反轉邏輯):

    from machine import LED
    
    light = LED("LED_WHITE")
    light.low()    # turn the white LED ON
    light.high()   # turn the white LED OFF
    
  • 充電 LED — 由板載電源管理硬體直接驅動,無法以軟體控制。無論系統電源軌開啟或關閉(即電源按鈕在任一狀態),它都會運作。

    顏色

    意義

    藍色

    充電中 — 參見勘誤:充電完成時可能不會熄滅

    綠色

    充電完成 — 參見勘誤:可能不會可靠地觸發

    紅色

    低電量(≤ 3.2 V,僅在未積極充電時)

蜂鳴器

板載壓電蜂鳴器接到一個計時器通道 — 使用 machine.PWM 來驅動它,即可產生頻率(音高)與工作週期(音量)皆可由軟體控制的音調:

import time
from machine import Pin, PWM

beep = PWM(Pin("BUZZER"), freq=2_000, duty_u16=32768)   # ~50% duty
time.sleep_ms(500)                                      # sound for 0.5 s
beep.deinit()

相機感測器

OV5640 是 Pure Thermal 上的主要 CSI — 傳入 cid=csi.OV5640 即可明確指定它:

import csi

cam = csi.CSI(cid=csi.OV5640)
cam.reset(hard=True)
cam.pixformat(csi.RGB565)
cam.framesize(csi.WVGA)
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)

OV5640 配備音圈致動器自動對焦鏡頭。透過 csi.CSI.ioctl 搭配 csi.IOCTL_TRIGGER_AUTO_FOCUS 觸發單次自動對焦 — 感測器會掃描對焦馬達一次,並鎖定眼前的任何物體:

cam.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)

每當場景改變時就重新發出該 ioctl — 自動對焦是單次觸發,並非連續對焦。

備註

OV5640 的 STROBE 輸出(用於同步閃光燈/紅外線照明)在 Pure Thermal 上已接到 MCU,但目前韌體尚未加入對它的支援。

熱成像相機感測器

FLIR® Lepton® 插槽在同一套 csi --- 相機感測器 API 中顯示為第二個 CSI。傳入 cid=csi.LEPTON 即可指定它,並略過硬體重置:

import csi

lepton = csi.CSI(cid=csi.LEPTON)
lepton.reset(hard=False)
lepton.pixformat(csi.GRAYSCALE)
lepton.framesize(csi.QVGA)

while True:
    img = lepton.snapshot()

備註

Lepton 的 VSYNC 輸出(每個熱影格一個脈衝)在 Pure Thermal 上已接到 MCU,但目前韌體尚未加入對它的支援。

兩個 CSI 可以並行運作。以下範例從 OV5640 取得一張彩色影格、從 Lepton 取得一張熱影格,然後使用 Ironbow 調色盤與一個在低強度時淡出為透明的 alpha 遮罩,將 Lepton 影像疊加在彩色影格之上:

import csi
import image
import math

alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
    alpha_pal[i] = int(math.pow((i / 255), 2) * 255)

csi0 = csi.CSI()
csi0.reset(hard=True)
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.WVGA)

csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False)
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QVGA)

img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())

while True:
    img0 = csi0.snapshot()
    csi1.snapshot(blocking=False, image=img1)
    img0.draw_image(
        img1, 0, 0,
        color_palette=image.PALETTE_IRONBOW,
        alpha_palette=alpha_pal,
        hint=image.BILINEAR,
    )

機器學習

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

雷射測距儀

板載 ST VL53L1CX 飛時測距儀接到 I²C 匯流排 2。使用凍結的 vl53l1x --- VL53L1X ToF 距離感測器驅動程式 驅動程式即可取得最遠約 4 m 的距離讀數:

import time
from machine import I2C
import vl53l1x

bus = I2C(2)
tof = vl53l1x.VL53L1X(bus)

while True:
    print("Distance:", tof.read(), "mm")
    time.sleep_ms(100)

LCD 輸出

4.3 吋板載 LCD 解析度為 800 × 480(WVGA),透過 display --- 顯示器驅動程式 模組的 RGB 顯示介面驅動 — 傳入 framesize=display.FWVGA 以符合其原生解析度:

import display

lcd = display.RGBDisplay(framesize=display.FWVGA, refresh=60)
lcd.backlight(True)           # turn the LCD backlight on
lcd.write(img)

背光接到一個 GPIO,因此 backlight() 接受 True / False(或任何 0–100 的數值,其中 0 為關閉,任何非零值皆為開啟):

lcd.backlight(False)           # turn the backlight off
lcd.backlight(True)            # back on

觸控螢幕

電容式觸控控制器為 FT5X06;多點觸控位置與手勢事件透過 ft5x06 --- 觸控螢幕驅動程式 公開。註冊一個回呼函式以對觸控做出反應,並在其中讀取目前的觸控點:

import ft5x06

touch = ft5x06.FT5X06()

def on_touch(n):
    for i in range(n):
        x = touch.get_point_x(i)
        y = touch.get_point_y(i)
        print("touch", i, "at", x, y)

    gesture = touch.get_gesture()
    if gesture != ft5x06.GESTURE_NONE:
        print("gesture:", gesture)

touch.touch_callback(on_touch)

HDMI 輸出

韌體還會將 LCD 影格緩衝區的內容輸出到板載的 tfp410 --- DVI/HDMI 控制器 HDMI 序列化器,因此外接螢幕會鏡像顯示 LCD 上的內容。實例化 tfp410.TFP410 即可啟用 HDMI 輸出:

import tfp410

hdmi = tfp410.TFP410()

如果你只想要 HDMI 輸出、不在意板載 LCD,可關閉背光並將影格緩衝區解析度提升至 WVGA 以上。TFP410 最高支援 1280×720 @ 60 Hz,例如:

lcd = display.RGBDisplay(framesize=display.HD, refresh=60)
lcd.backlight(False)         # the on‑board LCD can't render HD
hdmi = tfp410.TFP410()

板載面板固定為 800×480,因此任何高於 WVGA 的解析度只在外接 HDMI 螢幕上才有意義。

若要得知 HDMI 螢幕何時被插入或拔除,可在 TFP410 上註冊一個熱插拔回呼函式。該回呼函式在接上時以 True 觸發、在拔除時以 False 觸發:

def on_hotplug(connected):
    print("HDMI", "connected" if connected else "disconnected")

hdmi.hotplug_callback(on_hotplug)

你也可以隨時透過 isconnected() 輪詢連接狀態(僅在未註冊回呼函式時)。

HDMI 連接埠還承載 DDC(顯示資料)與 CEC(消費性電子控制)通道,透過 class DisplayData -- 顯示資料 類別公開。可用它讀取所接螢幕的 EDID 區塊(以便配合其原生解析度/更新率),或收送 CEC 影格以控制同一條線上的其他 HDMI 裝置:

from display import DisplayData

dd = DisplayData(cec=True, ddc=True)

edid = dd.display_id()        # EDID bytes from the monitor
print(len(edid), "byte EDID")

# Send a CEC "image view on" command (opcode 0x04) from address 1 to address 0
dd.send_frame(0, 1, b"\x04")

# ...or wait for an incoming CEC frame addressed to us (logical address 1)
src, data = dd.receive_frame(1, timeout=5_000)
print("CEC from", src, ":", data)

Wi‑Fi

Wi‑Fi 透過一顆 Microchip WINC1500 模組運作,由 class WINC -- WiFi 擴充板驅動程式 介面公開:

import network, time

wlan = network.WINC()
wlan.connect("ssid", "password")
while not wlan.isconnected():
    time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])

備註

由於零件短缺,部分 Pure Thermal 出貨時並未安裝 WINC1500 模組。如果 network.WINC 拋出錯誤或始終無法連線,請檢查開發板是否缺少 Wi‑Fi 模組 — 沒有它的話,相機的其餘功能運作方式完全相同。

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)

板載 Qwiic 接頭引出了其中一條 I²C 匯流排,供隨插即用模組使用。Qwiic 線路透過開汲極電晶體電位轉換至 5 V,因此匯流排僅限於 標準模式(100 kHz)快速模式(400 kHz) — 請勿嘗試透過 Qwiic 排針執行 fast‑mode‑plus 或更高的速率。

Qwiic 接頭 輸出 5 V 以為所接模組供電;它 無法用來為 Pure Thermal 本身供電 — 請改以 USB‑C 或 LiPo 電池接頭為開發板供電。

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)

軟體模擬(bit‑banged)匯流排

如果你需要額外的匯流排,machine.SoftI2Cmachine.SoftSPI 可在任何 GPIO 上運作。

熱感測器(板外)

除了板載的 FLIR Lepton,韌體還包含 fir --- 熱感測器驅動程式 (fir == far infrared,遠紅外線) 驅動程式,供外接的 I²C 熱成像器使用:

  • 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

import time

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

start = time.ticks_ms()
elapsed = time.ticks_diff(time.ticks_ms(), start)

虛擬計時器

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() 即可停止並釋放該插槽。

即時時鐘

from machine import RTC

rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0))
print(rtc.datetime())

如果接上 LiPo 電池,即使系統電源軌已關閉(透過板載電源按鈕關機),RTC 仍能持續計時。若只插了 USB,按下電源按鈕也會切斷 RTC 的電源 — 因此在未接電池的情況下,掛鐘時間將無法在電源循環後保留。

看門狗

from machine import WDT

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

開機與執行時資訊

USB bootloader 視窗

每次開機時,相機都會執行一段短暫的 bootloader(數秒鐘),讓 OpenMV IDE 無需使用者進入 DFU 模式即可更新韌體。視窗逾期後,bootloader 會交棒給 boot.py,接著是 main.py

執行中的指令碼可透過呼叫 machine.bootloader() 隨時重新進入 bootloader。

檔案系統與開機順序

Pure Thermal 韌體在開機時最多會掛載三個檔案系統:

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

  • microSD 卡 — 若插入記憶卡,則掛載於 /sdcard

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

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

  • boot.py 會在 每次 軟重置時執行。

  • main.py 只在冷開機時 執行,緊接在 boot.py 之後。

boot.pymain.py 放到 SD 卡上,會覆蓋 flash 中的副本而不動到它。

透過 USB 連接時,開機檔案系統(若記憶卡存在則為 /sdcard,否則為 /flash)也會在主機上列舉為一個 USB 大量儲存裝置磁碟。重置相機前請先退出該磁碟,讓主機刷新其快取的寫入內容。

備註

由在 OpenMV Cam 上執行的程式碼所建立或修改的檔案,在磁碟重新掛載之前不會顯示在主機上。請將指令碼寫回的任何資料存放到 SD 卡,並在從主機讀取這些檔案前重新掛載。

儲存容量

Pure Thermal 出貨時配備:

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

  • /rom8 MB 唯讀、記憶體映射的 ROMFS,用於提供能受益於零複製 mmap 存取的指令碼與 ML 模型。

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

硬體故障指示

如果使用者 RGB LED 快速循環顯示所有顏色 — 快到看起來像是一顆 閃爍的白色 LED 而非分明的色相 — 表示韌體遇到了無法復原的硬體故障(hard fault)。請重新燒錄韌體以復原。

硬體勘誤

Pure Thermal 硬體勘誤 中記錄了一些板級的特殊狀況。需注意的重點項目如下:

  • 電池接頭干涉 — PCB 上有元件正好位於 LiPo 電池接頭下方,而電池線插頭上突出的楔形部分在拔除線材時可能會勾到這些元件,有時會把零件從板上扯下。首次使用前,請用平口剪將線材插頭上的楔形部分剪掉。

  • 開發板關機時 RTC 停止 — 32 kHz 晶體(Y2)上的負載電容過高。移除 C96 與 C97(晶體兩側、緊鄰 STM32 的那一對電容)可讓 RTC 以備援電源持續運作。大多數開發板出貨時這些電容已被移除;如果你的 RTC 在拔除電源後遺失時間,請檢查那些位置。完整討論串請參見 GitHub issue #1536#1600

  • 充電指示 LED 維持藍色 — 充電器可能在 4.15 V 到 4.19 V 之間的任何電壓結束充電週期,而未將指示燈從藍色(充電中)切換為綠色(已充滿)。這種情況下電池其實已完全充滿;請相信電壓量測值,而非 LED。

  • 絲印將 VIN 誤標為 VBAT — 位於標準 OpenMV 排針 VIN 位置的焊墊,在 Pure Thermal 上的絲印標示為 VBAT。此標示是錯誤的,但實務上無關緊要,因為該焊墊無論如何都 沒有任何電氣連接

軟體函式庫

完整的模組清單請參見 函式庫索引 — 包含哪些模組是 Pure Thermal 版本所獨有的。