OpenMV Pure Thermal

OpenMV Pure Thermal je cjelovita ploča za toplinsko snimanje izgrađena oko STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) s 64 MB vanjskog SDRAM‑a, 32 MB QSPI flash memorije, hardverskim JPEG kodekom, 4,3” 800×480 IPS kapacitivnim zaslonom osjetljivim na dodir, HDMI izlazom, podnožjem za FLIR® Lepton® toplinski senzor i 5MP OV5640 kamerom za vidljivu svjetlost. Ploča također sadrži Wi‑Fi, microSD podnožje, laserski daljinomjer, zujalicu i snažni bijeli osvjetljivač.

OpenMV Pure Thermal

Za potpunu tehničku dokumentaciju, fotografije i dimenzije pogledajte stranicu proizvoda OpenMV Pure Thermal.

Istaknuto

  • STMicroelectronics STM32H743XI Cortex‑M7 na 480 MHz.

  • Hardverski JPEG koder/dekoder.

  • 64 MB vanjskog SDRAM‑a (~400 MB/s) uz 1 MB internog SRAM‑a.

  • 2 MB interne flash memorije + 32 MB vanjske QSPI flash memorije (~50 MB/s čitanja).

  • OV5640 5MP senzor za vidljivu svjetlost s rolling‑shutter zatvaračem.

  • FLIR® Lepton® podnožje — prihvaća bilo koji Lepton 1/2/2.5/3/3.5 modul, radiometrijski ili neradiometrijski, s temperaturom po pikselu u stupnjevima Celzijevim.

  • 4,3” 800×480 IPS kapacitivni zaslon osjetljiv na dodir (24‑bitna boja @ 60 Hz) s podrškom za geste do 5 točaka.

  • HDMI izlaz preko TFP410 DVI serijalizatora — do 1280×720 @ 60 Hz.

  • Wi‑Fi preko WINC1500; MJPEG preko RTSP‑a podržan odmah.

  • Full‑speed USB‑C (12 Mb/s, ograničenje struje 900 mA) — prema računalu se prikazuje kao VCP + USB skladišni uređaj, a obavlja i punjenje.

  • microSD podnožje — SD do 2 GB, SDHC do 32 GB, SDXC do 2 TB.

  • VL53L1CX laserski daljinomjer (do ~4 m).

  • Zujalica s programski upravljanom glasnoćom / frekvencijom.

  • Snažni bijeli LED osvjetljivač uz korisničku RGB statusnu LED diodu.

  • Priključak za LiPo bateriju s USB punjenjem na 500 mA.

  • 10 I/O pinova, tolerantni na 5 V s 3,3 V izlazom, 25 mA po pinu (ukupno 120 mA), s mogućnošću prekida. P6 nije tolerantan na 5 V kada se koristi u ADC ili DAC načinu rada.

  • ARM 10‑pinski SWD priključak za ST‑LINK / J‑Link otklanjanje pogrešaka.

  • Qwiic priključak za I²C periferije.

Napomena

Ploča na donjem lijevom rubu ima utor za opcionalnu ¼”–20 maticu za stativ. Ne ugrađuje se u tvornici — zalemite je u utor ako želite montirati ploču na standardni stativ za kameru.

Raspored pinova

Raspored pinova OpenMV Pure Thermal

Referenca pinova

Naziv pina

Funkcija

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

digitalni I/O

RESET

spojite na GND za resetiranje ploče

SYN

pad za sinkronizaciju sličica — nije spojen

VIN

VIN pad štita — nije spojen

BOOT0

spojite na 3,3 V pri uključivanju za DFU / ROM pokretač (bootloader)

BUZZER

ugrađena piezo zujalica (pogonjena TIM2/PWM‑om)

LED_RED

crveni kanal RGB statusne LED diode (aktivan na nisko)

LED_GREEN

zeleni kanal RGB statusne LED diode (aktivan na nisko)

LED_BLUE

plavi kanal RGB statusne LED diode (aktivan na nisko)

LED_WHITE

snažna bijela LED dioda osvjetljivača

Napomena

Padovi SYN i VIN na štitu/zaglavlju nemaju električnu vezu na Pure Thermalu — tu su samo radi kompatibilnosti zaglavlja. Umjesto toga napajajte ploču preko USB‑C‑a ili ugrađenog priključka za LiPo bateriju (pogledajte Pinovi za napajanje u nastavku). Imajte na umu i da je VIN pad na ploči otisnut kao VBAT (pogreška u označavanju) — položaj odgovara standardnom VIN pinu OpenMV zaglavlja i u svakom slučaju nije spojen.

Pinovi za napajanje

  • 3.3V — regulirana naponska linija 3,3 V. Do 250 mA dostupno za štitove.

  • GND — zajednička masa.

Pure Thermal se napaja preko USB‑C‑a ili ugrađenog priključka za LiPo bateriju. USB‑C priključak je ograničen na ukupno 900 mA struje, a obavlja i punjenje LiPo baterije na 500 mA, pa je priključivanje baterije usporedno s USB‑om podržano.

Ugrađeni gumb za napajanje uključuje i isključuje sustavske naponske linije i radi bez obzira na to napaja li se ploča preko USB‑a ili LiPo baterije. Držite gumb nekoliko sekundi za promjenu stanja — kratki pritisak se zanemaruje kako bi se spriječilo slučajno isključivanje.

Odabir izvora slijedi dva jednostavna pravila:

  • Baterija napaja ploču samo kada je njezin napon iznad 3 V. Ispod tog praga ugrađeni PMIC odspaja bateriju kako bi je zaštitio od preduboke isprazne.

  • Kada je USB prisutan, USB napaja ploču, a svaka priključena LiPo baterija puni se u pozadini.

LiPo priključak također ima zaštitu od obrnutog napona, pa priključivanje baterije naopako neće oštetiti ploču.

Napomena

Ploča također vraća napon baterije i signal mjerenja struje baterije prema ADC kanalima MCU‑a, ali podrška u ugrađenom programu (firmware) za njih još nije dodana.

Pinovi za oporavak i otklanjanje pogrešaka

  • RESET — spojite na GND za resetiranje ploče. Pure Thermal također ima namjenski RESET gumb na ploči koji čini istu stvar.

  • BOOT0 — spojite na 3,3 V dok napajate ploču kako biste ušli u STM32 ROM pokretač (bootloader) (DFU način rada). OpenMV IDE koristi ovaj način za ponovno upisivanje ugrađenog pokretača (bootloader). Namjenski BOOT0 gumb na ploči čini istu stvar — držite ga dok priključujete napajanje.

Ploča izlaže SWD priključak za otklanjanje pogrešaka (RST / SWCLK / SWDIO / SWO) pokraj GPIO zaglavlja, kompatibilan sa ST‑LINK i SEGGER J‑Link adapterima. Ugrađen je i zaseban ARM 10‑pinski SWD priključak — nosi iste SWD signale (bez punog JTAG‑a), ali u standardnom 0,05” 10‑pinskom obliku.

Napomena

Trag SWO pina dijeli se sa SPI taktom ugrađenog FLIR® Lepton®‑a. SWO se ne može koristiti istovremeno s Leptonom — odaberite jedno ili drugo.

Na ploči je ugrađen i treći priključak PURE Modules Debug. On izlaže nekoliko signala namijenjenih otklanjanju pogrešaka (SWCLK, SWDIO, RST, SPI2_MISO, SPI2_MOSI, VBUS, 3,3 V, GND i dva GPIO pina) za priključivanje pratećih modula. Dva GPIO pina na ovom priključku pogonjena su internom softverski emuliranom (bit‑banged) I²C sabirnicom, a ne hardverskom periferijom.

Sva tri priključka za otklanjanje pogrešaka (linijski SWD priključak, ARM 10‑pinski SWD priključak i PURE Modules Debug priključak) referencirana su na 3,3 V — provjerite je li vaš adapter za otklanjanje pogrešaka konfiguriran za logiku od 3,3 V prije spajanja.

Ugrađene periferije

LED diode

Pure Thermal ima tri LED diode na ploči:

  • Korisnička RGB LED dioda — programski upravljiva, izložena kao LED_RED, LED_GREEN i LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • Bijeli osvjetljivač — pogonjen preko LED_WHITE. LED_WHITE je u hardveru spojen aktivno na visoko, dok ugrađeni program (firmware) sve ostale ugrađene LED diode tretira kao aktivne na nisko, pa koristite low() / high() umjesto on() / off() (što bi invertiralo logiku):

    from machine import LED
    
    light = LED("LED_WHITE")
    light.low()    # turn the white LED ON
    light.high()   # turn the white LED OFF
    
  • LED dioda punjenja — pogonjena izravno ugrađenim hardverom za upravljanje napajanjem, bez softverskog upravljanja. Radi bez obzira na to jesu li sustavske naponske linije uključene ili isključene (tj. s gumbom za napajanje u bilo kojem položaju).

    Boja

    Značenje

    Plava

    punjenje — pogledajte erratu: možda se neće isključiti kada se punjenje dovrši

    Zelena

    punjenje dovršeno — pogledajte erratu: možda se neće pouzdano aktivirati

    Crvena

    niska razina baterije (≤ 3,2 V, samo kada se aktivno ne puni)

Zujalica

Ugrađena piezo zujalica spojena je na kanal mjerača vremena — pogonite je s machine.PWM za tonove s programski upravljanom frekvencijom (visinom tona) i radnim ciklusom (glasnoćom):

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 kamere

OV5640 je primarni CSI na Pure Thermalu — proslijedite cid=csi.OV5640 za izravno obraćanje:

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 ima ugrađeni JPEG kompresor. Postavite csi.CSI.pixformat na csi.JPEG i senzor isporučuje komprimirane sličice izravno kameri preko sabirnice kamere, što čini snimke visoke razlučivosti praktičnima: csi.HD (1280×720), csi.FHD (1920×1080) i puni 5MP csi.WQXGA2 (2592×1944) svi se prenose kao JPEG. Podesite kompresiju s csi.CSI.quality (0-100, više = veće sličice, više detalja):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

OV5640 ima objektiv s automatskim izoštravanjem pogonjenim aktuatorom sa zvučnim svitkom (voice‑coil). Pokrenite jedan prolaz automatskog izoštravanja preko csi.CSI.ioctl s csi.IOCTL_TRIGGER_AUTO_FOCUS — senzor jednom pomakne motor za izoštravanje i fokusira se na ono što je ispred njega:

cam.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)

Ponovno izdajte ioctl kad god se scena promijeni — automatsko izoštravanje je jednokratno, a ne kontinuirano.

Napomena

Izlaz STROBE senzora OV5640 (koristi se za sinkroniziranu bljeskalicu / IR osvjetljenje) spojen je na MCU na Pure Thermalu, ali podrška u ugrađenom programu (firmware) za njega još nije dodana.

Senzor toplinske kamere

FLIR® Lepton® podnožje prikazuje se kao drugi CSI na istom csi — senzori kamere API‑ju. Proslijedite cid=csi.LEPTON za obraćanje i preskočite hardverski 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()

Napomena

Izlaz VSYNC Leptona (jedan impuls po toplinskoj sličici) spojen je na MCU na Pure Thermalu, ali podrška u ugrađenom programu (firmware) za njega još nije dodana.

Oba CSI‑ja mogu raditi usporedno. Primjer u nastavku dohvaća sličicu u boji s OV5640 i toplinsku sličicu s Leptona, zatim preklapa Lepton preko sličice u boji koristeći Ironbow paletu i alfa masku koja na niskom intenzitetu prelazi u prozirno:

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

Strojno učenje

ml — Strojno učenje pokreće kvantizirane TFLite modele na Cortex‑M7 s CMSIS‑NN jezgrama — dovoljno brzo za kompaktne detektore pri nekoliko sličica u sekundi. Modeli na datotečnom sustavu samo za čitanje /rom učitavaju se izravno iz flash memorije bez kopiranja u RAM. Evo 128×128 BlazeFace detektora koji preklapa detektirano lice i njegovih šest orijentira na svaku sličicu s kamere za vidljivu svjetlost:

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

Laserski daljinomjer

Ugrađeni ST VL53L1CX daljinomjer temeljen na vremenu leta (time‑of‑flight) spojen je na I²C sabirnicu 2. Koristite zamrznuti vl53l1x — VL53L1X ToF upravljački program za senzor udaljenosti upravljački program za očitanja udaljenosti do ~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 izlaz

Ugrađeni 4,3” LCD razlučivosti je 800 × 480 (WVGA) i pogonjen je preko RGB sučelja zaslona modula display — upravljački program zaslona — proslijedite framesize=display.FWVGA kako bi odgovaralo njegovoj izvornoj razlučivosti:

import display

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

Pozadinsko osvjetljenje spojeno je na GPIO, pa backlight() prihvaća True / False (ili bilo koju vrijednost 0–100, gdje je 0 isključeno, a sve različito od nule uključeno):

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

Zaslon osjetljiv na dodir

Kapacitivni upravljač dodira je FT5X06; položaji višestrukog dodira i događaji gesti izloženi su preko ft5x06 — Upravljački program zaslona osjetljivog na dodir. Registrirajte povratni poziv kako biste reagirali na dodire i unutar njega očitali aktivne točke:

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 izlaz

Ugrađeni program (firmware) također razgranava međuspremnik slike LCD‑a na ugrađeni tfp410 — DVI/HDMI upravljač HDMI serijalizator, pa vanjski monitor zrcali ono što je na LCD‑u. Instancirajte tfp410.TFP410 kako biste omogućili HDMI izlaz:

import tfp410

hdmi = tfp410.TFP410()

Ako želite samo HDMI izlaz, a ne marite za ugrađeni LCD, isključite pozadinsko osvjetljenje i povećajte razlučivost međuspremnika slike iznad WVGA. TFP410 podržava do 1280×720 @ 60 Hz, pa na primjer:

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

Ugrađeni zaslon fiksiran je na 800×480, pa je sve iznad WVGA smisleno samo na vanjskom HDMI monitoru.

Da biste znali kada je HDMI monitor priključen ili isključen, registrirajte povratni poziv za priključivanje u radu (hot‑plug) na TFP410. Povratni poziv okida s True pri priključivanju i False pri odspajanju:

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

hdmi.hotplug_callback(on_hotplug)

Stanje veze možete u bilo kojem trenutku i ispitati s isconnected() (samo kada nije registriran nijedan povratni poziv).

HDMI priključak također nosi kanale DDC (podaci o zaslonu) i CEC (upravljanje potrošačkom elektronikom), izložene preko klase klasa DisplayData – Podaci zaslona. Koristite je za čitanje EDID bloka priključenog monitora (kako biste se prilagodili njegovoj izvornoj razlučivosti / brzini osvježavanja) ili za slanje/primanje CEC okvira za upravljanje drugim HDMI uređajima na istoj žici:

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 radi preko Microchip WINC1500 modula, izloženog preko class WINC – upravljački program za WiFi shield sučelja:

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

Napomena

Zbog nestašice dijelova, neke Pure Thermal jedinice isporučene su bez ugrađenog WINC1500 modula. Ako network.WINC izbaci pogrešku ili se nikada ne poveže, provjerite ima li ploča nedostajući Wi‑Fi modul — ostatak kamere radi potpuno jednako i bez njega.

microSD kartica

Kada se kartica umetne, automatski se montira na /sdcard i može se koristiti kroz uobičajeni datotečni sustav:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

Referenca sabirnica

GPIO

Koristite machine.Pin za čitanje ili pogon bilo kojeg od otisnutih pinova. Izlazi su 3,3 V CMOS, tolerantni na 5 V na ulaznoj strani, i mogu ponirati/davati do 25 mA po pinu (ukupno 120 mA na cijelom zaglavlju).

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

Bilo koji ulazni pin također može okidati prekid pri prijelazima ruba:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Sabirnica

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

Sabirnica

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

Isti hardver može se koristiti i u ciljnom (slave) načinu rada preko machine.I2CTarget kako bi se memorijsko područje izložilo drugom I²C upravljaču:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

Ugrađeni Qwiic priključak izlaže jednu od ovih I²C sabirnica za module spreman za uporabu (plug‑and‑play). Qwiic linija je razinski pomaknuta na 5 V preko tranzistora s otvorenim odvodom (open‑drain), pa je sabirnica ograničena samo na standardni način rada (100 kHz) i brzi način rada (400 kHz) — ne pokušavajte preko Qwiic zaglavlja pokretati fast‑mode‑plus ili veće brzine.

Qwiic priključak izlaže 5 V za napajanje priključenih modula; ne može se koristiti za napajanje samog Pure Thermala — umjesto toga napajajte ploču preko USB‑C‑a ili priključka za LiPo bateriju.

SPI

Sabirnica

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)

Sabirnica

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 i DAC

P6 je jedini korisnički analogni pin. Može se koristiti kao 12‑bitni ADC ulaz ili DAC izlaz.

  • ADC — puni opseg pri 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 — preko pyb.DAC. 8‑bitna vrijednost pokriva 0–3,3 V:

    from pyb import DAC
    
    dac = DAC("P6")
    voltage = 1.65
    dac.write(int(voltage / 3.3 * 255))
    

U ADC ili DAC načinu rada P6 je tolerantan samo na 3,3 V — ne dovodite mu 5 V.

PWM

Pin

Mjerač vremena / kanal

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Napomena

TIM1 je rezerviran od strane ugrađenog programa (firmware) za generiranje takta piksela senzora kamere, pa se TIM1 kanali koji su fizički na P0/P1/P2 ne mogu koristiti za korisnički PWM bez ometanja kamere.

TIM4 se dijeli s pyb.Servo — instanciranje serva ponovno konfigurira cijeli mjerač vremena za rad na 50 Hz, pa ne miješajte machine.PWM na P7/P8 s pyb.Servo u istoj skripti.

Pogonite bilo koji od njih preko machine.PWM

from machine import Pin, PWM

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

Softverski emulirane (bit‑banged) sabirnice

machine.SoftI2C i machine.SoftSPI rade na bilo kojem GPIO‑u ako vam treba dodatna sabirnica.

Toplinski senzor (izvan ploče)

Uz ugrađeni FLIR Lepton, ugrađeni program (firmware) također uključuje fir — upravljački program termalnog senzora (fir == daleko infracrveno) upravljački program za vanjski spojene I²C toplinske snimače:

  • MLX90621 — 16 × 4 IR niz

  • MLX90640 — 32 × 24 IR niz

  • MLX90641 — 16 × 12 IR niz

  • AMG8833 — 8 × 8 IR niz

Spojite modul na I²C sabirnicu ploče i očitajte sličice s 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())

Upravljački program fir komunicira sa senzorom samo preko I²C 2 — spojite modul na P4 (SCL) i P5 (SDA).

Vremenski raspored

vrijeme

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)

Virtualni mjerači vremena

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

Vrijednosti perioda su u milisekundama. Pozovite deinit() za zaustavljanje i oslobađanje utora.

Sat stvarnog vremena

from machine import RTC

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

Ako je priključena LiPo baterija, RTC mjeri vrijeme čak i dok su sustavske naponske linije isključene (isključene ugrađenim gumbom za napajanje). Sa samo priključenim USB‑om, pritisak na gumb za napajanje prekida napajanje i RTC‑u — pa vrijeme stvarnog sata neće preživjeti isključivanje napajanja bez priključene baterije.

Nadzorni mjerač (watchdog)

from machine import WDT

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

Informacije o pokretanju i radu

Prozor USB pokretača (bootloader)

Pri svakom uključivanju kamera pokreće kratki pokretač (bootloader) (nekoliko sekundi) koji omogućuje OpenMV IDE‑u ažuriranje ugrađenog programa (firmware) bez potrebe da korisnik uđe u DFU način rada. Nakon isteka prozora pokretač (bootloader) predaje kontrolu boot.py pa zatim main.py.

Skripta koja se izvodi može na zahtjev ponovno ući u pokretač (bootloader) pozivanjem machine.bootloader().

Datotečni sustav i redoslijed pokretanja

Ugrađeni program (firmware) Pure Thermala montira do tri datotečna sustava pri pokretanju:

  • Interna flash memorija — uvijek montirana na /flash. Po zadanom sadrži main.py i README.txt; stvara se pri samom prvom pokretanju.

  • microSD kartica — ako je kartica umetnuta, montira se na /sdcard.

  • ROMFS — memorijski mapirani datotečni sustav samo za čitanje na /rom koji se koristi za isporuku velikih podatkovnih sredstava (npr. AI modela) koja imaju koristi od pristupa bez kopiranja. MicroPython ga montira automatski pri pokretanju, prije nego što se pokrene bilo koja korisnička Python skripta.

Nakon montiranja, radni direktorij postavlja se na /sdcard kada je kartica prisutna, inače na /flash. Interpreter zatim pokreće skripte iz tog direktorija:

  • boot.py se izvršava pri svakom mekom resetiranju.

  • main.py se izvršava samo pri hladnom pokretanju, neposredno nakon boot.py.

Stavljanje datoteke boot.py ili main.py na SD karticu nadjačava kopiju u flash memoriji bez njezine izmjene.

Kada je spojen preko USB‑a, datotečni sustav za pokretanje (/sdcard ako je kartica prisutna, inače /flash) također se na računalu pojavljuje kao USB skladišni disk. Izbacite disk prije resetiranja kamere kako bi računalo ispraznilo svoje predmemorirane zapise.

Napomena

Datoteke koje stvori ili izmijeni kôd koji se izvodi na OpenMV Cam neće se pojaviti na računalu dok se disk ponovno ne montira. Koristite SD karticu za sve podatke koje skripta zapisuje natrag i ponovno montirajte disk prije čitanja tih datoteka s računala.

Veličine pohrane

Pure Thermal se isporučuje s:

  • /flash24 MB FAT datotečni sustav, čitanje/pisanje.

  • /rom8 MB memorijski mapirani ROMFS samo za čitanje, koristi se za isporuku skripti i ML modela koji imaju koristi od mmap pristupa bez kopiranja.

  • /sdcard — puna veličina bilo koje umetnute microSD kartice (kada je prisutna), čitanje/pisanje.

Indikator teške pogreške (hard fault)

Ako korisnička RGB LED dioda brzo prolazi kroz sve boje — dovoljno brzo da obično izgleda kao treperava bijela LED dioda umjesto zasebnih nijansi — ugrađeni program (firmware) naišao je na nepopravljivu tešku pogrešku (hard fault). Ponovno upišite ugrađeni program (firmware) za oporavak.

Hardverska errata

Nekoliko osobitosti na razini ploče dokumentirano je u hardverskoj errati Pure Thermala. Ključne stavke kojih treba biti svjestan:

  • Smetnje priključka baterije — komponente na tiskanoj pločici nalaze se izravno ispod priključka za LiPo bateriju, a izbočeni klin na utikaču kabela baterije može ih zakvačiti pri uklanjanju kabela, ponekad povlačeći dijelove s ploče. Odrežite klin s utikača kabela ravnim kliještima prije prve uporabe.

  • RTC se zaustavlja dok je ploča isključena — kapacitet opterećenja na kristalu od 32 kHz (Y2) je previsok. Uklanjanje C96 i C97 (para koji okružuje kristal pokraj STM32) omogućuje RTC‑u nastavak rada na pričuvnom napajanju. Većina ploča isporučuje se s tim kondenzatorima već uklonjenima; ako vaš RTC gubi vrijeme kada je isključen, provjerite te položaje. Pogledajte GitHub probleme #1536 i #1600 za cijelu raspravu.

  • Indikatorska LED dioda punjenja ostaje plava — punjač može završiti svoj ciklus punjenja bilo gdje između 4,15 V i 4,19 V bez prebacivanja indikatora s plavog (punjenje) na zeleno (napunjeno). Baterija je u tom slučaju i dalje potpuno napunjena; vjerujte mjerenju napona, a ne LED diodi.

  • Otisak (silkscreen) pogrešno označava VIN kao VBAT — pad u standardnom položaju VIN pina OpenMV zaglavlja otisnut je kao VBAT na Pure Thermalu. Oznaka je pogrešna, ali u praksi nije važna jer pad u svakom slučaju nema električnu vezu.

Softverske biblioteke

Pogledajte indeks biblioteka za potpuni popis modula — uključujući one koji su jedinstveni za Pure Thermal build.