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č.
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¶
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_GREENiLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Bijeli osvjetljivač — pogonjen preko
LED_WHITE.LED_WHITEje u hardveru spojen aktivno na visoko, dok ugrađeni program (firmware) sve ostale ugrađene LED diode tretira kao aktivne na nisko, pa koristitelow()/high()umjestoon()/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žimain.pyiREADME.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
/romkoji 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.pyse izvršava pri svakom mekom resetiranju.main.pyse izvršava samo pri hladnom pokretanju, neposredno nakonboot.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:
/flash— 24 MB FAT datotečni sustav, čitanje/pisanje./rom— 8 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
VBATna 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.