OpenMV Pure Thermal¶
OpenMV Pure Thermal — це повнофункціональна плата термального зображення на базі мікроконтролера STMicroelectronics STM32H743 (Cortex‑M7 @ 480 МГц) із 64 МБ зовнішньої SDRAM, 32 МБ QSPI флеш-пам’яті, апаратним кодеком JPEG, IPS ємнісним сенсорним екраном 4.3» 800×480, виходом HDMI, роз’ємом для термодатчика FLIR® Lepton®, а також 5-мегапіксельною камерою видимого світла OV5640. Плата також оснащена Wi‑Fi, роз’ємом microSD, лазерним далекоміром, зумером та потужним білим освітлювачем.
Повний опис технічних характеристик, фотографії та розміри дивіться на сторінці продукту OpenMV Pure Thermal.
Основні характеристики¶
STMicroelectronics STM32H743XI Cortex‑M7 на частоті 480 МГц.
Апаратний кодек JPEG (кодування/декодування).
64 МБ зовнішньої SDRAM (~400 МБ/с) та 1 МБ внутрішньої SRAM.
2 МБ внутрішньої флеш-пам’яті + 32 МБ зовнішньої QSPI флеш-пам’яті (~50 МБ/с зчитування).
OV5640 — 5-мегапіксельний датчик видимого світла із ковзним затвором.
Роз’єм FLIR® Lepton® — сумісний із будь-яким модулем Lepton 1/2/2.5/3/3.5, радіометричним або нерадіометричним, із вимірюванням температури кожного пікселя в градусах Цельсія.
IPS ємнісний сенсорний екран 4.3» 800×480 (24-бітний колір @ 60 Гц) із підтримкою до 5-точкових жестів.
Вихід HDMI через DVI-серіалізатор TFP410 — до 1280×720 @ 60 Гц.
Wi‑Fi через WINC1500; підтримується MJPEG через RTSP із коробки.
Full-speed USB‑C (12 Мб/с, обмеження струму 900 мА) — відображається на хості як VCP + USB-накопичувач, також забезпечує заряджання.
Роз’єм microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.
Лазерний далекомір VL53L1CX (до ~4 м).
Зумер із програмно керованою гучністю та частотою.
Потужний білий світлодіодний освітлювач на додаток до RGB-індикатора стану.
Роз’єм для LiPo-акумулятора із зарядженням через USB при 500 мА.
10 виводів введення/виведення, 5 В толерантні із вихідним рівнем 3,3 В, 25 мА на вивід (120 мА всього), із підтримкою переривань. P6 не є 5 В толерантним у режимі ADC або DAC.
Роз’єм ARM 10-pin SWD для налагодження через ST‑LINK / J‑Link.
Роз’єм Qwiic для периферійних пристроїв I²C.
Примітка
Плата має паз на нижньому лівому краї для необов’язкової гайки ¼»–20 для штатива. З заводу вона не встановлена — припаяйте її у паз, якщо потрібно встановити плату на стандартний фотоштатив.
Розпіновка¶
Довідник виводів¶
Назва виводу |
Функція |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / FDCAN2 TX |
P3 |
SPI2 NSS (CS) / FDCAN2 RX |
P4 |
I2C2 SCL / UART3 TX / TIM2 CH3 |
P5 |
I2C2 SDA / UART3 RX / TIM2 CH4 |
P6 |
ADC / DAC / TIM2 CH1 |
P7 |
I2C4 SCL / TIM4 CH1 |
P8 |
I2C4 SDA / TIM4 CH2 |
P9 |
цифровий ввід/вивід |
RESET |
підключити до GND для скидання плати |
SYN |
пад синхронізації кадрів — не підключений |
VIN |
пад VIN щита — не підключений |
BOOT0 |
підтягнути до 3,3 В при увімкненні для DFU / ROM-завантажувача |
BUZZER |
вбудований п’єзозумер (керується через TIM2/PWM) |
LED_RED |
червоний канал RGB-індикатора стану (активний низький рівень) |
LED_GREEN |
зелений канал RGB-індикатора стану (активний низький рівень) |
LED_BLUE |
синій канал RGB-індикатора стану (активний низький рівень) |
LED_WHITE |
потужний білий світлодіодний освітлювач |
Примітка
Пади SYN та VIN на щиті/колодці не мають електричного з’єднання на Pure Thermal — вони призначені лише для сумісності з колодками. Живлення плати здійснюйте через USB‑C або вбудований роз’єм LiPo-акумулятора (див. Виводи живлення нижче). Також зверніть увагу: пад VIN на шовкографії підписаний VBAT (помилка у маркуванні) — позиція відповідає стандартному виводу VIN заголовка OpenMV, але він також не підключений.
Виводи живлення¶
3,3 В — регульована шина 3,3 В. До 250 мА доступно для щитів.
GND — спільна земля.
Pure Thermal живиться через USB‑C або вбудований роз’єм LiPo-акумулятора. Порт USB‑C обмежений до 900 мА загального струму та забезпечує заряджання LiPo при 500 мА, тому одночасне підключення акумулятора і USB підтримується.
Вбудована кнопка живлення вмикає та вимикає системні шини незалежно від того, чи плата живиться від USB чи від LiPo. Утримуйте кнопку кілька секунд, щоб змінити стан — короткий натиск ігнорується для запобігання випадковому вимкненню.
Вибір джерела живлення підпорядковується двом простим правилам:
Акумулятор живить плату лише тоді, коли його напруга перевищує 3 В. Нижче цього порогу вбудований PMIC від’єднує акумулятор для захисту від надмірного розряджання.
Коли підключено USB, USB живить плату, а підключений LiPo заряджається у фоновому режимі.
Роз’єм LiPo також має захист від зворотної полярності, тому підключення акумулятора у зворотному напрямку не пошкодить плату.
Примітка
Плата також підключає напругу акумулятора та сигнал вимірювання струму акумулятора до каналів ADC мікроконтролера, але підтримка прошивкою цих функцій ще не додана.
Виводи відновлення та налагодження¶
RESET — підключити до GND для скидання плати. На Pure Thermal також є виділена кнопка RESET, що виконує те саме.
BOOT0 — підтягнути до 3,3 В при увімкненні плати для входу в ROM-завантажувач STM32 (режим DFU). OpenMV IDE використовує цей режим для перепрограмування вбудованого завантажувача. Виділена кнопка BOOT0 на платі виконує те саме — утримуйте її під час подачі живлення.
Плата надає заголовок налагодження SWD (RST / SWCLK / SWDIO / SWO) поруч із заголовком GPIO, сумісний з адаптерами ST‑LINK та SEGGER J‑Link. Також встановлено окремий роз’єм ARM 10-pin SWD — він несе ті самі сигнали SWD (без повного JTAG), але у стандартному форм-факторі 0,05» 10-pin.
Примітка
Пін трасування SWO спільний з тактовим сигналом SPI вбудованого FLIR® Lepton®. SWO не можна використовувати одночасно з Lepton — оберіть щось одне.
На платі встановлено третій роз’єм PURE Modules Debug. Він надає доступ до кількох сигналів для налагодження (SWCLK, SWDIO, RST, SPI2_MISO, SPI2_MOSI, VBUS, 3,3 В, GND та два виводи GPIO) для підключення супутніх модулів. Два виводи GPIO на цьому роз’ємі керуються внутрішньою програмною шиною I²C (bit-bang), а не апаратним периферійним пристроєм.
Усі три роз’єми налагодження (вбудований заголовок SWD, роз’єм ARM 10-pin SWD та роз’єм PURE Modules Debug) прив’язані до рівня 3,3 В — переконайтеся, що ваш адаптер налагодження налаштований на логіку 3,3 В перед підключенням.
Вбудовані периферійні пристрої¶
Світлодіоди¶
На Pure Thermal є три світлодіоди:
Користувацький RGB-світлодіод — програмно керований, доступний як
LED_RED,LED_GREENтаLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Білий освітлювач — керується через
LED_WHITE.LED_WHITEпідключений активним високим рівнем у апаратній частині, тоді як прошивка трактує кожен інший вбудований світлодіод як активний низький рівень, тому використовуйтеlow()/high()замістьon()/off()(які інвертують логіку):from machine import LED light = LED("LED_WHITE") light.low() # turn the white LED ON light.high() # turn the white LED OFF
Індикатор заряджання — керується безпосередньо вбудованою апаратною системою управління живленням, без програмного контролю. Він працює незалежно від того, ввімкнені чи вимкнені системні шини (тобто при будь-якому положенні кнопки живлення).
Колір
Значення
Синій
заряджається — див. помилки: може не вимикатися після завершення заряджання
Зелений
заряджання завершено — див. помилки: може не спрацьовувати надійно
Червоний
розряджений акумулятор (≤ 3,2 В, лише коли не відбувається активне заряджання)
Зумер¶
Вбудований п’єзозумер підключений до каналу таймера — керуйте ним через machine.PWM для відтворення звуків із програмно керованою частотою (висота тону) та коефіцієнтом заповнення (гучність):
import time
from machine import Pin, PWM
beep = PWM(Pin("BUZZER"), freq=2_000, duty_u16=32768) # ~50% duty
time.sleep_ms(500) # sound for 0.5 s
beep.deinit()
Датчик камери¶
OV5640 є основним CSI на Pure Thermal — передайте cid=csi.OV5640, щоб явно адресувати його:
import csi
cam = csi.CSI(cid=csi.OV5640)
cam.reset(hard=True)
cam.pixformat(csi.RGB565)
cam.framesize(csi.WVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
OV5640 має вбудований компресор JPEG. Встановіть csi.CSI.pixformat у csi.JPEG, і датчик доставлятиме стиснуті кадри прямо через шину камери, що робить захоплення зображень із високою роздільною здатністю практичним: csi.HD (1280×720), csi.FHD (1920×1080) та повна 5 МП csi.WQXGA2 (2592×1944) — усі підтримують потокову передачу як JPEG. Налаштовуйте стиснення за допомогою csi.CSI.quality (0–100, вище = більші кадри, більше деталей):
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
OV5640 має об’єктив з автофокусом на основі голосового котушкового приводу. Запустіть одноразовий прохід автофокусування через csi.CSI.ioctl із параметром csi.IOCTL_TRIGGER_AUTO_FOCUS — датчик один раз прогонить мотор фокуса та зафіксується на об’єкті перед ним:
cam.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Повторно виконуйте ioctl кожного разу, коли сцена змінюється — автофокус є одноразовим, а не безперервним.
Примітка
Вихід STROBE OV5640 (використовується для синхронізованої спалаху / ІЧ-освітлення) підключений до мікроконтролера на Pure Thermal, але підтримка прошивкою ще не додана.
Термальний датчик камери¶
Роз’єм FLIR® Lepton® виглядає як другий CSI на тому самому API csi — датчики камери. Передайте cid=csi.LEPTON, щоб адресувати його, та пропустіть апаратне скидання:
import csi
lepton = csi.CSI(cid=csi.LEPTON)
lepton.reset(hard=False)
lepton.pixformat(csi.GRAYSCALE)
lepton.framesize(csi.QVGA)
while True:
img = lepton.snapshot()
Примітка
Вихід VSYNC Lepton (один імпульс на термальний кадр) підключений до мікроконтролера на Pure Thermal, але підтримка прошивкою ще не додана.
Обидва CSI можуть працювати паралельно. Наведений нижче приклад отримує кольоровий кадр від OV5640 та термальний кадр від Lepton, потім накладає зображення Lepton поверх кольорового кадру, використовуючи палітру Ironbow та альфа-маску, що плавно переходить у прозорість при низькій інтенсивності:
import csi
import image
import math
alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
alpha_pal[i] = int(math.pow((i / 255), 2) * 255)
csi0 = csi.CSI()
csi0.reset(hard=True)
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.WVGA)
csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False)
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QVGA)
img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())
while True:
img0 = csi0.snapshot()
csi1.snapshot(blocking=False, image=img1)
img0.draw_image(
img1, 0, 0,
color_palette=image.PALETTE_IRONBOW,
alpha_palette=alpha_pal,
hint=image.BILINEAR,
)
Машинне навчання¶
ml — Машинне навчання запускає квантизовані моделі TFLite на Cortex‑M7 з ядрами CMSIS‑NN — достатньо швидко для компактних детекторів із кількома кадрами на секунду. Моделі у файловій системі /rom тільки для читання завантажуються безпосередньо з флеш-пам’яті без копіювання в RAM. Ось детектор облич BlazeFace 128×128, що накладає виявлені обличчя та їх шість орієнтирів на кожен кадр із камери видимого світла:
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces is a list of ((x, y, w, h), score, keypoints) tuples
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints is a ndarray of shape (6, 2)
# 0 - right eye (x, y)
# 1 - left eye (x, y)
# 2 - nose (x, y)
# 3 - mouth (x, y)
# 4 - right ear (x, y)
# 5 - left ear (x, y)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
Лазерний далекомір¶
Вбудований дальномір ST VL53L1CX на основі часу прольоту підключений до шини I²C 2. Використовуйте замороджений драйвер vl53l1x — драйвер датчика відстані VL53L1X ToF для отримання вимірювань відстані до ~4 м:
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¶
Вбудований LCD 4.3» має роздільну здатність 800 × 480 (WVGA) та керується через інтерфейс RGB-дисплея модуля display — драйвер дисплея — передайте framesize=display.FWVGA, щоб відповідати його нативній роздільній здатності:
import display
lcd = display.RGBDisplay(framesize=display.FWVGA, refresh=60)
lcd.backlight(True) # turn the LCD backlight on
lcd.write(img)
Підсвічування підключене до GPIO, тому backlight() приймає True / False (або будь-яке значення від 0 до 100, де 0 — вимкнено, а будь-яке ненульове — увімкнено):
lcd.backlight(False) # turn the backlight off
lcd.backlight(True) # back on
Сенсорний екран¶
Контролер ємнісного торкання — FT5X06; позиції мультиторкань та події жестів доступні через ft5x06 — Драйвер сенсорного екрана. Зареєструйте зворотний виклик для реагування на торкання та зчитуйте активні точки всередині нього:
import ft5x06
touch = ft5x06.FT5X06()
def on_touch(n):
for i in range(n):
x = touch.get_point_x(i)
y = touch.get_point_y(i)
print("touch", i, "at", x, y)
gesture = touch.get_gesture()
if gesture != ft5x06.GESTURE_NONE:
print("gesture:", gesture)
touch.touch_callback(on_touch)
Вивід HDMI¶
Прошивка також транслює кадровий буфер LCD на вбудований серіалізатор HDMI tfp410 — Контролер DVI/HDMI, тому зовнішній монітор відображає те саме, що й на LCD. Створіть екземпляр tfp410.TFP410, щоб увімкнути вивід HDMI:
import tfp410
hdmi = tfp410.TFP410()
Якщо потрібен лише вивід HDMI без використання вбудованого LCD, вимкніть підсвічування та збільшіть роздільну здатність кадрового буфера вище WVGA. TFP410 підтримує до 1280×720 @ 60 Гц, наприклад:
lcd = display.RGBDisplay(framesize=display.HD, refresh=60)
lcd.backlight(False) # the on‑board LCD can't render HD
hdmi = tfp410.TFP410()
Вбудована панель має фіксовану роздільну здатність 800×480, тому значення вище WVGA має сенс лише на зовнішньому HDMI-моніторі.
Щоб дізнатися, коли HDMI-монітор було підключено або відключено, зареєструйте зворотний виклик гарячого підключення на TFP410. Зворотний виклик спрацьовує з True при підключенні та False при відключенні:
def on_hotplug(connected):
print("HDMI", "connected" if connected else "disconnected")
hdmi.hotplug_callback(on_hotplug)
Ви також можете отримати стан з’єднання в будь-який момент за допомогою isconnected() (лише коли зворотний виклик не зареєстрований).
Порт HDMI також несе канали DDC (дані дисплея) та CEC (управління побутовою електронікою), що доступні через клас клас DisplayData – Дані дисплея. Використовуйте його для зчитування блоку EDID підключеного монітора (щоб адаптуватись до його нативної роздільної здатності / частоти оновлення) або для надсилання/отримання кадрів CEC з метою управління іншими HDMI-пристроями на тій самій лінії:
from display import DisplayData
dd = DisplayData(cec=True, ddc=True)
edid = dd.display_id() # EDID bytes from the monitor
print(len(edid), "byte EDID")
# Send a CEC "image view on" command (opcode 0x04) from address 1 to address 0
dd.send_frame(0, 1, b"\x04")
# ...or wait for an incoming CEC frame addressed to us (logical address 1)
src, data = dd.receive_frame(1, timeout=5_000)
print("CEC from", src, ":", data)
Wi‑Fi¶
Wi‑Fi працює через модуль Microchip WINC1500, доступний через інтерфейс class WINC – драйвер WiFi-модуля
import network, time
wlan = network.WINC()
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Примітка
Через дефіцит компонентів, деякі пристрої Pure Thermal постачались без встановленого модуля WINC1500. Якщо network.WINC генерує помилку або ніколи не підключається, перевірте плату на відсутність модуля Wi‑Fi — решта камери працює точно так само без нього.
Карта microSD¶
При вставці карти вона автоматично монтується в /sdcard та доступна через звичайну файлову систему:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Довідник шин¶
GPIO¶
Використовуйте machine.Pin для зчитування або керування будь-яким із виводів на шовкографії. Виходи — 3,3 В CMOS, 5 В толерантні на вході, можуть поглинати/джерелювати до 25 мА на вивід (120 мА всього по всьому заголовку).
from machine import Pin
out = Pin("P0", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("P1", Pin.IN, Pin.PULL_UP)
print(inp.value())
Будь-який вивід введення може також генерувати переривання на перепадах фронтів:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Шина |
TX |
RX |
|---|---|---|
UART1 |
P1 |
P0 |
UART3 |
P4 |
P5 |
from machine import UART
uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
Шина |
SCL |
SDA |
|---|---|---|
I2C2 |
P4 |
P5 |
I2C4 |
P7 |
P8 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Те саме апаратне забезпечення також може використовуватись у режимі веденого (slave) через machine.I2CTarget для надання доступу до області пам’яті іншому контролеру I²C:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
Вбудований роз’єм Qwiic надає доступ до однієї з цих шин I²C для plug-and-play модулів. Лінія Qwiic зміщена до 5 В через транзистори з відкритим стоком, тому шина обмежена лише стандартним режимом (100 кГц) та швидким режимом (400 кГц) — не намагайтеся запускати fast-mode-plus або вищі швидкості через заголовок Qwiic.
Роз’єм Qwiic виводить 5 В для живлення підключених модулів; він не може використовуватись для живлення самого Pure Thermal — живте плату через USB‑C або роз’єм LiPo-акумулятора.
SPI¶
Шина |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI2 |
P0 |
P1 |
P2 |
P3 |
from machine import SPI
from machine import Pin
spi = SPI(2, baudrate=10_000_000)
cs = Pin("P3", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
CAN (FDCAN)¶
Шина |
TX |
RX |
|---|---|---|
FDCAN2 |
P2 |
P3 |
from machine import CAN
can = CAN(2, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())
ADC та DAC¶
P6 — єдиний аналоговий вивід користувача. Його можна використовувати як 12-бітний вхід ADC або вихід DAC.
ADC — повна шкала до 3,3 В на виводі:
from machine import ADC import time adc = ADC("P6") while True: voltage = adc.read_u16() * 3.3 / 65535 print(voltage) time.sleep_ms(100)
DAC — через
pyb.DAC. 8-бітне значення покриває діапазон 0–3,3 В:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
У режимі ADC або DAC P6 є лише 3,3 В толерантним — не подавайте на нього 5 В.
PWM¶
Вивід |
Таймер / канал |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
Примітка
TIM1 зарезервований прошивкою для генерації тактового сигналу пікселів датчика камери, тому канали TIM1, що фізично розташовані на P0/P1/P2, не можна використовувати для призначеного PWM без порушення роботи камери.
TIM4 спільний із pyb.Servo — створення екземпляра сервоприводу перелаштовує весь таймер для роботи на частоті 50 Гц, тому не змішуйте machine.PWM на P7/P8 із pyb.Servo в одному скрипті.
Керуйте будь-яким із них через machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Програмні шини з бітовим перебором¶
machine.SoftI2C та machine.SoftSPI працюють на будь-якому GPIO, якщо вам потрібна додаткова шина.
Термальний датчик (зовнішній)¶
На додаток до вбудованого FLIR Lepton, прошивка також включає драйвер fir — драйвер теплового датчика (fir == далекий інфрачервоний діапазон) для зовнішньо підключених термальних сенсорів I²C:
MLX90621 — ІЧ-масив 16 × 4
MLX90640 — ІЧ-масив 32 × 24
MLX90641 — ІЧ-масив 16 × 12
AMG8833 — ІЧ-масив 8 × 8
Підключіть модуль до шини I²C плати та зчитуйте кадри за допомогою fir.init() + fir.snapshot()
import time
import image
import fir
fir.init() # auto‑detects the sensor
clock = time.clock()
while True:
clock.tick()
try:
img = fir.snapshot(x_scale=5, y_scale=5,
color_palette=image.PALETTE_IRONBOW,
hint=image.BICUBIC,
copy_to_fb=True)
except OSError:
continue
print(clock.fps())
Драйвер fir спілкується з датчиком лише через I²C 2 — підключіть модуль до P4 (SCL) та P5 (SDA).
Синхронізація¶
time¶
import time
time.sleep(1)
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
elapsed = time.ticks_diff(time.ticks_ms(), start)
Віртуальні таймери¶
from machine import Timer
one_shot = Timer(-1)
one_shot.init(period=5_000, mode=Timer.ONE_SHOT,
callback=lambda t: print("once"))
periodic = Timer(-1)
periodic.init(period=2_000, mode=Timer.PERIODIC,
callback=lambda t: print("tick"))
Значення періоду вказуються в мілісекундах. Викличте deinit(), щоб зупинити та звільнити слот.
Годинник реального часу¶
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0))
print(rtc.datetime())
Якщо підключено LiPo-акумулятор, RTC зберігає час навіть коли системні шини вимкнені (вимкнено через вбудовану кнопку живлення). При підключенні лише USB натискання кнопки живлення відключає живлення також від RTC — тому реальний час не збережеться після циклу живлення без підключеного акумулятора.
Сторожовий таймер¶
from machine import WDT
wdt = WDT(timeout=5_000)
while True:
# ...do work...
wdt.feed()
Інформація про завантаження та виконання¶
Вікно USB-завантажувача¶
При кожному увімкненні камера запускає короткий завантажувач (кілька секунд), що дозволяє OpenMV IDE оновити прошивку без необхідності переходу в режим DFU. Після закінчення вікна завантажувач передає управління boot.py, а потім main.py.
Запущений скрипт може повернутися до завантажувача на вимогу, викликавши machine.bootloader().
Файлова система та порядок завантаження¶
Прошивка Pure Thermal монтує до трьох файлових систем при завантаженні:
Внутрішня флеш-пам’ять — завжди монтується в
/flash. За замовчуванням міститьmain.pyтаREADME.txt; створюється при першому завантаженні.Карта microSD — якщо вставлено карту, монтується в
/sdcard.ROMFS — файлова система тільки для читання з прямим доступом до пам’яті в
/rom, використовується для постачання великих активів даних (наприклад, моделей ШІ), що виграють від доступу без копіювання. Автоматично монтується MicroPython при запуску, до запуску будь-якого користувацького Python-коду.
Після монтування робочий каталог встановлюється в /sdcard, якщо карта присутня, інакше в /flash. Інтерпретатор виконує скрипти з цього каталогу:
boot.pyвиконується при кожному м’якому скиданні.main.pyвиконується лише при холодному завантаженні, відразу післяboot.py.
Розміщення boot.py або main.py на SD-карті перекриває копію у флеш-пам’яті без її зміни.
При підключенні через USB завантажувальна файлова система (/sdcard, якщо карта присутня, інакше /flash) також відображається як USB-накопичувач на хості. Безпечно від’єднайте диск перед скиданням камери, щоб хост скинув свій кешований запис.
Примітка
Файли, створені або змінені кодом, що виконується на OpenMV Cam, не відображатимуться на хості до повторного монтування диска. Використовуйте SD-карту для будь-яких даних, які записує скрипт, та змонтуйте знову перед зчитуванням цих файлів із хоста.
Розміри сховища¶
Pure Thermal постачається з:
/flash— FAT-файлова система на 24 МБ, читання/запис./rom— ROMFS тільки для читання з прямим доступом до пам’яті на 8 МБ, використовується для постачання скриптів та моделей МН, що виграють від mmap-доступу без копіювання./sdcard— повний розмір будь-якої вставленої карти microSD (коли присутня), читання/запис.
Індикатор апаратного збою¶
Якщо RGB-індикатор стану користувача швидко циклічно перемикається між усіма кольорами — настільки швидко, що виглядає як блимаючий білий світлодіод, а не як окремі кольори — прошивка зазнала невідновного апаратного збою. Для відновлення перепрошийте мікропрограму.
Апаратні помилки¶
Ряд особливостей на рівні плати задокументований у апаратних помилках Pure Thermal. Ключові пункти, про які слід знати:
Перешкода роз’єму акумулятора — компоненти на PCB знаходяться безпосередньо під роз’ємом LiPo-акумулятора, і виступаючий клин на штекері кабелю акумулятора може зачепитись за них при від’єднанні кабелю, іноді відриваючи деталі з плати. Зріжте клин зі штекера кабелю бічними кусачками перед першим використанням.
RTC зупиняється при вимкненні плати — ємність навантаження на кристалі 32 кГц (Y2) завелика. Видалення C96 та C97 (пара, що фланкує кристал поряд із STM32) дозволяє RTC продовжувати роботу на резервному живленні. Більшість плат постачається з уже видаленими цими конденсаторами; якщо ваш RTC втрачає час при відключенні, перевірте ці позиції. Дивіться проблеми GitHub #1536 та #1600 для повного обговорення.
Індикатор заряджання залишається синім — зарядний пристрій може завершити цикл заряджання в діапазоні від 4,15 В до 4,19 В без перемикання індикатора з синього (заряджається) на зелений (заряджено). У цьому випадку акумулятор все одно повністю заряджений; довіряйте вимірюванню напруги, а не індикатору.
Шовкографія помилково підписує VIN як VBAT — пад у стандартній позиції VIN заголовка OpenMV на шовкографії підписаний як
VBATна Pure Thermal. Мітка неправильна, але на практиці це не має значення, оскільки пад не має електричного з’єднання в будь-якому випадку.
Бібліотеки програмного забезпечення¶
Дивіться індекс бібліотек для повного списку модулів — включно з тими, що є унікальними для збірки Pure Thermal.