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 產品頁面。
重點特色¶
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 三腳架螺帽。出廠時並未安裝 — 若想將開發板安裝在標準相機三腳架上,請自行焊接一顆到槽位中。
接腳配置¶
接腳參考¶
接腳名稱 |
功能 |
|---|---|
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 |
備註
擴充板/排針上的 SYN 與 VIN 焊墊在 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_RED、LED_GREEN與LED_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.PWM 與 pyb.Servo。
可透過 machine.PWM 驅動其中任何一個:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
軟體模擬(bit‑banged)匯流排¶
如果你需要額外的匯流排,machine.SoftI2C 與 machine.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.py與README.txt;於第一次開機時建立。microSD 卡 — 若插入記憶卡,則掛載於
/sdcard。ROMFS — 唯讀、記憶體映射的檔案系統,位於
/rom,用於提供能受益於零複製存取的大型資料資產(例如 AI 模型)。由 MicroPython 在啟動時、任何使用者 Python 執行之前自動掛載。
掛載完成後,當記憶卡存在時,工作目錄會設為 /sdcard,否則設為 /flash。直譯器接著會從該目錄執行指令碼:
boot.py會在 每次 軟重置時執行。main.py只在冷開機時 執行,緊接在boot.py之後。
將 boot.py 或 main.py 放到 SD 卡上,會覆蓋 flash 中的副本而不動到它。
透過 USB 連接時,開機檔案系統(若記憶卡存在則為 /sdcard,否則為 /flash)也會在主機上列舉為一個 USB 大量儲存裝置磁碟。重置相機前請先退出該磁碟,讓主機刷新其快取的寫入內容。
備註
由在 OpenMV Cam 上執行的程式碼所建立或修改的檔案,在磁碟重新掛載之前不會顯示在主機上。請將指令碼寫回的任何資料存放到 SD 卡,並在從主機讀取這些檔案前重新掛載。
儲存容量¶
Pure Thermal 出貨時配備:
/flash— 24 MB FAT 檔案系統,可讀寫。/rom— 8 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 版本所獨有的。