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č.

OpenMV Pure Thermal

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ů

Rozložení pinů OpenMV Pure Thermal

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_GREEN a LED_BLUE

    from 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_WHITE je 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žívejte low() / high() namísto on() / 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ě obsahuje main.py a README.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.py se spustí při každém softwarovém resetu.

  • main.py se spustí pouze při studeném startu, ihned po boot.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:

  • /flash24 MB FAT souborový systém, pro čtení i zápis.

  • /rom8 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.