OpenMV Pure Thermal¶
OpenMV Pure Thermal je kompletní deska pro termovizní zobrazování postavená na čipu STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) s 64 MB externí SDRAM, 32 MB QSPI flash paměti, hardwarovým JPEG kodekem, 4,3“ 800×480 IPS kapacitním dotykovým displejem, výstupem HDMI, slotem pro termální modul FLIR® Lepton® a 5MP kamerou OV5640 pro viditelné světlo. Obsahuje také Wi‑Fi, slot microSD, laserový dálkoměr, bzučák a vysoce výkonný bílý přisvětlovač.
Kompletní datasheet, fotografie a rozměry najdete na produktové stránce OpenMV Pure Thermal.
Hlavní vlastnosti¶
STMicroelectronics STM32H743XI Cortex‑M7 na 480 MHz.
Hardwarový JPEG enkodér/dekodér.
64 MB externí SDRAM (~400 MB/s) plus 1 MB interní SRAM.
2 MB interní flash paměti + 32 MB externí QSPI flash paměti (~50 MB/s čtení).
OV5640 5MP rolling‑shutter senzor pro viditelné světlo.
Slot FLIR® Lepton® — přijímá libovolný modul Lepton 1/2/2.5/3/3.5, radiometrický i neradiometrický, s teplotou jednotlivých pixelů ve stupních Celsia.
4,3“ 800×480 IPS kapacitní dotykový displej (24bitová barva @ 60 Hz) s podporou až 5 dotykových bodů pro gesta.
Výstup HDMI přes DVI serializér TFP410 — až 1280×720 @ 60 Hz.
Wi‑Fi přes WINC1500; MJPEG přes RTSP je podporováno out‑of‑the‑box.
Full‑speed USB‑C (12 Mb/s, proudově omezeno na 900 mA) — vůči hostiteli se hlásí jako VCP + USB mass storage a zajišťuje i nabíjení.
Slot microSD — SD až 2 GB, SDHC až 32 GB, SDXC až 2 TB.
Laserový dálkoměr VL53L1CX (až ~4 m).
Bzučák se softwarově řízenou hlasitostí / frekvencí.
Vysoce výkonný bílý LED přisvětlovač kromě uživatelské RGB stavové LED.
Konektor pro LiPo baterii s USB nabíjením proudem 500 mA.
10 I/O pinů, tolerantních na 5 V s výstupem 3,3 V, 25 mA na pin (celkem 120 mA), s podporou přerušení. P6 není tolerantní na 5 V při použití v režimu ADC nebo DAC.
Konektor ARM 10‑pin SWD pro ladění přes ST‑LINK / J‑Link.
Konektor Qwiic pro periferie I²C.
Poznámka
Deska má na levém spodním okraji slot pro volitelnou stativovou matici ¼“–20. Z výroby není osazena — pokud chcete desku připevnit na standardní fotografický stativ, zapájejte matici do slotu.
Rozložení pinů¶
Přehled pinů¶
Název pinu |
Funkce |
|---|---|
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 |
digitální I/O |
RESET |
stáhnutím na GND se deska resetuje |
SYN |
pad pro synchronizaci snímků — nepřipojeno |
VIN |
pad VIN štítu — nepřipojeno |
BOOT0 |
stáhnutí na 3,3 V při zapnutí pro DFU / ROM bootloader |
BUZZER |
integrovaný piezoelektrický bzučák (řízený TIM2/PWM) |
LED_RED |
červený kanál RGB stavové LED (aktivní v nule) |
LED_GREEN |
zelený kanál RGB stavové LED (aktivní v nule) |
LED_BLUE |
modrý kanál RGB stavové LED (aktivní v nule) |
LED_WHITE |
vysoce výkonná bílá přisvětlovací LED |
Poznámka
Pady SYN a VIN na štítu/headeru nemají na Pure Thermal žádné elektrické připojení — jsou tu pouze kvůli kompatibilitě s headerem. Desku napájejte přes USB‑C nebo přes integrovaný konektor LiPo baterie (viz Napájecí piny níže). Všimněte si také, že pad VIN je na desce potištěn jako VBAT (chyba v popisu) — pozice odpovídá standardnímu pinu VIN OpenMV headeru a v každém případě není připojena.
Napájecí piny¶
3.3V — stabilizovaná větev 3,3 V. Pro štíty je k dispozici až 250 mA.
GND — společná zem.
Pure Thermal je napájen přes USB‑C nebo přes integrovaný konektor LiPo baterie. Port USB‑C je proudově omezen celkem na 900 mA a zajišťuje také nabíjení LiPo proudem 500 mA, takže připojení baterie současně s USB je podporováno.
Integrované tlačítko napájení zapíná a vypíná systémové napájecí větve a funguje bez ohledu na to, zda je deska napájena z USB nebo z LiPo. Pro přepnutí stavu podržte tlačítko několik sekund — rychlé stisknutí je ignorováno, aby se zabránilo náhodnému vypnutí.
Výběr zdroje se řídí dvěma jednoduchými pravidly:
Baterie napájí desku pouze tehdy, je‑li její napětí nad 3 V. Pod tímto prahem integrovaný PMIC baterii odpojí, aby ji ochránil před přílišným vybitím.
Když je přítomno USB, desku napájí USB a případně připojený LiPo se na pozadí nabíjí.
Konektor LiPo má také ochranu proti přepólování, takže obrácené připojení baterie desku nepoškodí.
Poznámka
Deska také vede signály napětí baterie a snímání proudu baterie zpět na ADC kanály MCU, ale firmwarová podpora pro žádný z nich zatím nebyla přidána.
Piny pro obnovu a ladění¶
RESET — stáhnutím na GND se deska resetuje. Pure Thermal má také na desce vyhrazené tlačítko RESET, které dělá totéž.
BOOT0 — stáhnutí na 3,3 V při napájení desky vstoupí do STM32 ROM bootloaderu (režim DFU). OpenMV IDE tento režim využívá k přeflashování integrovaného bootloaderu. Vyhrazené tlačítko BOOT0 na desce dělá totéž — při zapnutí jej podržte.
Deska poskytuje ladicí header SWD (RST / SWCLK / SWDIO / SWO) vedle GPIO headeru, kompatibilní s adaptéry ST‑LINK a SEGGER J‑Link. Osazen je také samostatný konektor ARM 10‑pin SWD — vede stejné SWD signály (žádné plné JTAG), ale ve standardním 0,05“ 10pinovém provedení.
Poznámka
Trasovací pin SWO je sdílen s SPI hodinami integrovaného FLIR® Lepton®. SWO nelze používat současně s Leptonem — vyberte si jedno, nebo druhé.
Na desce je osazen třetí konektor PURE Modules Debug. Vyvádí několik signálů zaměřených na ladění (SWCLK, SWDIO, RST, SPI2_MISO, SPI2_MOSI, VBUS, 3,3 V, GND a dva GPIO piny) pro připojení doplňkových modulů. Dva GPIO piny na tomto konektoru jsou řízeny interní bit‑banged I²C sběrnicí namísto hardwarové periferie.
Všechny tři ladicí konektory (vestavěný SWD header, konektor ARM 10‑pin SWD a konektor PURE Modules Debug) jsou vztaženy k 3,3 V — před připojením se ujistěte, že je váš ladicí adaptér nakonfigurován na logiku 3,3 V.
Integrované periferie¶
LED¶
Pure Thermal má na desce tři LED:
Uživatelská RGB LED — softwarově ovladatelná, dostupná jako
LED_RED,LED_GREENaLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Bílý přisvětlovač — řízený přes
LED_WHITE.LED_WHITEje v hardwaru zapojena aktivně v logické jedničce, zatímco firmware zachází se všemi ostatními integrovanými LED jako s aktivními v nule, takže používejtelow()/high()namístoon()/off()(které by logiku invertovaly):from machine import LED light = LED("LED_WHITE") light.low() # turn the white LED ON light.high() # turn the white LED OFF
Nabíjecí LED — řízená přímo integrovaným hardwarem správy napájení, bez softwarového ovládání. Funguje bez ohledu na to, zda jsou systémové napájecí větve zapnuté, nebo vypnuté (tj. s tlačítkem napájení v libovolné poloze).
Barva
Význam
Modrá
nabíjení — viz errata: po dokončení nabíjení nemusí zhasnout
Zelená
nabíjení dokončeno — viz errata: nemusí se spolehlivě aktivovat
Červená
nízký stav baterie (≤ 3,2 V, pouze pokud se aktivně nenabíjí)
Bzučák¶
Integrovaný piezoelektrický bzučák je zapojen na kanál časovače — řiďte jej pomocí machine.PWM pro tóny se softwarově řízenou frekvencí (výškou) a střídou (hlasitostí):
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()
Senzor kamery¶
OV5640 je primární CSI na Pure Thermal — pro jeho explicitní adresování předejte 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 má integrovaný JPEG kompresor. Nastavte csi.CSI.pixformat na csi.JPEG a senzor dodává komprimované snímky přímo do kamery přes kamerovou sběrnici, což činí snímky ve vysokém rozlišení praktickými: csi.HD (1280×720), csi.FHD (1920×1080) i plné 5MP csi.WQXGA2 (2592×1944) se přenášejí jako JPEG. Kompresi vyladíte pomocí csi.CSI.quality (0–100, vyšší = větší snímky, více detailů):
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
OV5640 má objektiv s automatickým ostřením poháněným cívkovým aktuátorem (voice‑coil). Jednorázový průchod automatického ostření spustíte přes csi.CSI.ioctl s csi.IOCTL_TRIGGER_AUTO_FOCUS — senzor jednou projede ostřicím motorkem a zaostří na cokoli, co je před ním:
cam.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Ioctl vydejte znovu kdykoli se scéna změní — automatické ostření je jednorázové, ne kontinuální.
Poznámka
Výstup STROBE senzoru OV5640 (používaný pro synchronizovaný blesk / IR přisvětlení) je na Pure Thermal zapojen k MCU, ale firmwarová podpora pro něj zatím nebyla přidána.
Senzor termální kamery¶
Slot FLIR® Lepton® se objevuje jako druhé CSI na stejném API csi — kamerové senzory. Pro jeho adresování předejte cid=csi.LEPTON a přeskočte hardwarový reset:
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()
Poznámka
Výstup VSYNC Leptonu (jeden puls na termální snímek) je na Pure Thermal zapojen k MCU, ale firmwarová podpora pro něj zatím nebyla přidána.
Obě CSI mohou běžet vedle sebe. Příklad níže získá barevný snímek z OV5640 a termální snímek z Leptonu, poté překryje Lepton přes barevný snímek pomocí palety Ironbow a alfa masky, která při nízké intenzitě přechází do průhlednosti:
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,
)
Strojové učení¶
ml — Strojové učení spouští kvantizované TFLite modely na Cortex‑M7 s jádry CMSIS‑NN — dostatečně rychle pro kompaktní detektory při několika snímcích za sekundu. Modely na souborovém systému /rom určeném pouze pro čtení se načítají přímo z flash paměti bez kopírování do RAM. Zde je 128×128 BlazeFace detektor, který do každého snímku z kamery pro viditelné světlo překrývá detekovaný obličej a jeho šest význačných bodů:
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")
Laserový dálkoměr¶
Integrovaný ST VL53L1CX time‑of‑flight dálkoměr je zapojen na I²C sběrnici 2. Pro získání měření vzdálenosti až ~4 m použijte zamrzlý ovladač vl53l1x — ovladač ToF senzoru vzdálenosti VL53L1X
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)
Výstup LCD¶
Integrovaný 4,3“ LCD má rozlišení 800 × 480 (WVGA) a je řízen přes RGB display rozhraní modulu display — ovladač displeje — pro shodu s jeho nativním rozlišením předejte framesize=display.FWVGA
import display
lcd = display.RGBDisplay(framesize=display.FWVGA, refresh=60)
lcd.backlight(True) # turn the LCD backlight on
lcd.write(img)
Podsvícení je zapojeno na GPIO, takže backlight() přijímá True / False (nebo libovolnou hodnotu 0–100, kde 0 je vypnuto a cokoli nenulového je zapnuto):
lcd.backlight(False) # turn the backlight off
lcd.backlight(True) # back on
Dotykový displej¶
Kapacitní dotykový kontrolér je FT5X06; pozice multi‑touch a události gest jsou dostupné přes ft5x06 — Ovladač dotykové obrazovky. Zaregistrujte callback, abyste reagovali na dotyky a uvnitř něj četli aktivní body:
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)
Výstup HDMI¶
Firmware také rozvádí framebuffer LCD do integrovaného HDMI serializéru tfp410 — DVI/HDMI řadič, takže externí monitor zrcadlí to, co je na LCD. Výstup HDMI povolíte vytvořením instance tfp410.TFP410
import tfp410
hdmi = tfp410.TFP410()
Pokud chcete pouze výstup HDMI a integrovaný LCD vás nezajímá, vypněte podsvícení a zvyšte rozlišení framebufferu nad WVGA. TFP410 podporuje až 1280×720 @ 60 Hz, takže například:
lcd = display.RGBDisplay(framesize=display.HD, refresh=60)
lcd.backlight(False) # the on‑board LCD can't render HD
hdmi = tfp410.TFP410()
Integrovaný panel je pevně nastaven na 800×480, takže cokoli nad WVGA má smysl pouze na externím HDMI monitoru.
Abyste věděli, kdy byl HDMI monitor připojen nebo odpojen, zaregistrujte na TFP410 hot‑plug callback. Callback se spustí s True při připojení a s False při odpojení:
def on_hotplug(connected):
print("HDMI", "connected" if connected else "disconnected")
hdmi.hotplug_callback(on_hotplug)
Stav připojení můžete také kdykoli zjišťovat pomocí isconnected() (pouze pokud není zaregistrován žádný callback).
Port HDMI vede také kanály DDC (data displeje) a CEC (ovládání spotřební elektroniky), dostupné přes třídu class DisplayData – Data displeje. Použijte ji ke čtení EDID bloku připojeného monitoru (abyste se mohli přizpůsobit jeho nativnímu rozlišení / obnovovací frekvenci) nebo k odesílání/příjmu CEC snímků pro ovládání dalších HDMI zařízení na stejném vodiči:
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 běží přes modul Microchip WINC1500, dostupný přes rozhraní class WINC – ovladač WiFi shieldu
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])
Poznámka
Kvůli nedostatku součástek byly některé kusy Pure Thermal dodány bez osazeného modulu WINC1500. Pokud network.WINC vyhodí chybu nebo se nikdy nepřipojí, zkontrolujte na desce chybějící Wi‑Fi modul — zbytek kamery funguje bez něj přesně stejně.
microSD karta¶
Po vložení karty je automaticky připojena na /sdcard a je použitelná přes běžný souborový systém:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Přehled sběrnic¶
GPIO¶
Pro čtení nebo řízení libovolného z potištěných pinů použijte machine.Pin. Výstupy jsou 3,3 V CMOS, na vstupní straně tolerantní na 5 V a mohou pojmout/dodat až 25 mA na pin (celkem 120 mA přes celý header).
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())
Libovolný vstupní pin může také spustit přerušení při přechodu hrany:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Sběrnice |
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¶
Sběrnice |
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")
Stejný hardware lze také použít v cílovém (slave) režimu přes machine.I2CTarget k vystavení paměťové oblasti jinému I²C kontroléru:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
Integrovaný konektor Qwiic vyvádí jednu z těchto I²C sběrnic pro plug‑and‑play moduly. Linka Qwiic je úrovňově převedena na 5 V přes open‑drain tranzistory, takže sběrnice je omezena pouze na standardní režim (100 kHz) a rychlý režim (400 kHz) — nepokoušejte se přes Qwiic header používat fast‑mode‑plus nebo vyšší rychlosti.
Konektor Qwiic vystupuje napětím 5 V pro napájení připojených modulů; nelze jej použít k napájení samotného Pure Thermal — desku napájejte přes USB‑C nebo konektor LiPo baterie.
SPI¶
Sběrnice |
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)¶
Sběrnice |
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 a DAC¶
P6 je jediný uživatelský analogový pin. Lze jej použít buď jako 12bitový ADC vstup, nebo jako DAC výstup.
ADC — plný rozsah při 3,3 V na pinu:
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 — přes
pyb.DAC. 8bitová hodnota pokrývá 0–3,3 V:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
V režimu ADC nebo DAC je P6 tolerantní pouze na 3,3 V — nepřivádějte na něj 5 V.
PWM¶
Pin |
Časovač / kanál |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
Poznámka
TIM1 je vyhrazen firmwarem pro generování pixelových hodin senzoru kamery, takže kanály TIM1, které jsou fyzicky na P0/P1/P2, nelze použít pro uživatelské PWM bez narušení funkce kamery.
TIM4 je sdílen s pyb.Servo — vytvoření instance serva překonfiguruje celý časovač na provoz 50 Hz, takže ve stejném skriptu nekombinujte machine.PWM na P7/P8 s pyb.Servo.
Kterýkoli z nich řiďte přes machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Softwarové bit‑banged sběrnice¶
machine.SoftI2C a machine.SoftSPI fungují na libovolném GPIO, pokud potřebujete další sběrnici.
Termální senzor (externí)¶
Kromě integrovaného FLIR Lepton firmware obsahuje také ovladač fir — ovladač termálního senzoru (fir == far infrared, vzdálené infračervené záření) pro externě zapojené I²C termální kamery:
MLX90621 — IR pole 16 × 4
MLX90640 — IR pole 32 × 24
MLX90641 — IR pole 16 × 12
AMG8833 — IR pole 8 × 8
Zapojte modul na I²C sběrnici desky a čtěte snímky pomocí 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())
Ovladač fir komunikuje se senzorem pouze přes I²C 2 — zapojte modul na P4 (SCL) a P5 (SDA).
Časování¶
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)
Virtuální časovače¶
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"))
Hodnoty periody jsou v milisekundách. Pro zastavení a uvolnění slotu zavolejte deinit().
Hodiny reálného času¶
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0))
print(rtc.datetime())
Pokud je připojena LiPo baterie, RTC udržuje čas i když jsou systémové napájecí větve vypnuté (vypnuté integrovaným tlačítkem napájení). Pouze s připojeným USB stisknutí tlačítka napájení odpojí napájení i RTC — takže čas hodin reálného světa bez připojené baterie nepřežije vypnutí a zapnutí.
Watchdog¶
from machine import WDT
wdt = WDT(timeout=5_000)
while True:
# ...do work...
wdt.feed()
Informace o spuštění a běhu¶
Okno USB bootloaderu¶
Při každém zapnutí kamera spustí krátký bootloader (několik sekund), který umožňuje OpenMV IDE aktualizovat firmware, aniž by uživatel musel vstupovat do režimu DFU. Po uplynutí okna bootloader předá řízení boot.py a poté main.py.
Běžící skript může do bootloaderu znovu vstoupit na vyžádání zavoláním machine.bootloader().
Souborový systém a pořadí spouštění¶
Firmware Pure Thermal připojuje při spuštění až tři souborové systémy:
Interní flash — vždy připojena na
/flash. Standardně obsahujemain.pyaREADME.txt; vytvořena při úplně prvním spuštění.microSD karta — pokud je karta vložena, je připojena na
/sdcard.ROMFS — souborový systém pouze pro čtení mapovaný do paměti na
/rom, používaný pro distribuci velkých datových aktiv (např. AI modelů), která těží z přístupu bez kopírování. Připojen automaticky MicroPythonem při startu, dříve než se spustí jakýkoli uživatelský Python.
Po připojení je pracovní adresář nastaven na /sdcard, pokud je karta přítomna, jinak na /flash. Interpret poté spouští skripty z tohoto adresáře:
boot.pyse spustí při každém softwarovém resetu.main.pyse spustí pouze při studeném startu, ihned poboot.py.
Vložení boot.py nebo main.py na SD kartu přepíše kopii ve flash paměti, aniž by se jí dotklo.
Při připojení přes USB se boot souborový systém (/sdcard, pokud je karta přítomna, jinak /flash) na hostiteli zároveň hlásí jako USB mass‑storage disk. Před resetováním kamery disk vysuňte, aby hostitel vyprázdnil své uložené zápisy v cache.
Poznámka
Soubory vytvořené nebo upravené kódem běžícím na OpenMV Cam se na hostiteli neobjeví, dokud disk znovu nepřipojíte. Pro jakákoli data, která skript zapisuje zpět, používejte SD kartu a před čtením těchto souborů z hostitele disk znovu připojte.
Velikosti úložiště¶
Pure Thermal je dodáván s:
/flash— 24 MB FAT souborový systém, pro čtení i zápis./rom— 8 MB ROMFS pouze pro čtení mapovaný do paměti, používaný pro distribuci skriptů a ML modelů, které těží z přístupu mmap bez kopírování./sdcard— plná velikost vložené microSD karty (je‑li přítomna), pro čtení i zápis.
Indikátor závažné chyby (hard fault)¶
Pokud uživatelská RGB LED rychle cyklicky střídá všechny barvy — tak rychle, že to spíše vypadá jako blikající bílá LED než jako jednotlivé odstíny — firmware narazil na neobnovitelnou závažnou chybu (hard fault). Pro obnovu firmware přeflashujte.
Hardwarová errata¶
Několik zvláštností na úrovni desky je zdokumentováno v hardwarových erratech Pure Thermal. Klíčové body, na které je třeba dát pozor:
Kolize konektoru baterie — součástky na PCB sedí přímo pod konektorem LiPo baterie a vyčnívající klín na konektoru kabelu baterie se o ně může při odpojování kabelu zachytit, někdy strhnout součástky z desky. Před prvním použitím klín na konektoru kabelu odstřihněte bočními kleštěmi.
RTC se zastaví, když je deska vypnutá — zatěžovací kapacita na 32 kHz krystalu (Y2) je příliš vysoká. Odstranění C96 a C97 (dvojice po stranách krystalu vedle STM32) umožní RTC běžet dál na záložním napájení. Většina desek je dodávána s těmito kondenzátory již odstraněnými; pokud vaše RTC po odpojení ztrácí čas, zkontrolujte tyto pozice. Celé vlákno najdete v GitHub issues #1536 a #1600.
Indikační LED nabíjení zůstává modrá — nabíječka může ukončit nabíjecí cyklus kdekoli mezi 4,15 V a 4,19 V, aniž by indikátor přepnula z modré (nabíjení) na zelenou (nabito). Baterie je v tomto případě stále plně nabita; věřte měření napětí, ne LED.
Potisk chybně označuje VIN jako VBAT — pad ve standardní pozici VIN OpenMV headeru je na Pure Thermal potištěn jako
VBAT. Označení je chybné, ale v praxi na tom nezáleží, protože pad nemá v žádném případě žádné elektrické připojení.
Softwarové knihovny¶
Kompletní seznam modulů — včetně toho, které jsou jedinečné pro build Pure Thermal — najdete v indexu knihoven.