OpenMV Cam H7 Plus¶
OpenMV Cam H7 Plus поєднує мікроконтролер STMicroelectronics STM32H743 (Cortex‑M7 @ 480 МГц) із 32 МБ зовнішньої SDRAM, 32 МБ QSPI флеш-пам’яті, апаратним кодеком JPEG і модулем камери OV5640 5МП на знімному носії. Додаткова пам’ять добре підходить для захоплення зображень високої роздільної здатності та великих кадрових буферів.
Повний технічний опис, фотографії та розміри дивіться на сторінці продукту OpenMV Cam H7 Plus.
Основні характеристики¶
STMicroelectronics STM32H743 Cortex‑M7 на частоті 480 МГц (1027 DMIPS).
Апаратний кодек JPEG (кодування/декодування).
32 МБ зовнішньої SDRAM (32‑розрядна @ 100 МГц, 400 МБ/с) плюс 1 МБ внутрішньої SRAM.
2 МБ внутрішньої флеш-пам’яті + 32 МБ зовнішньої QSPI флеш-пам’яті (~100 МБ/с читання).
OV5640 — датчик 5МП із ковзним затвором.
USB повна швидкість (12 Мб/с) — відображається на хості як VCP + USB-масове сховище.
Роз’єм microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.
Роз’єм LiPo-акумулятора (без вбудованого зарядного пристрою — підключайте заряджений елемент або живіть від VIN/USB).
10 виводів вводу/виводу, стійкі до 5 В з виходом 3,3 В, 25 мА на вивід (120 мА сумарно по роз’єму), підтримують переривання. P6 не є стійким до 5 В у режимі ADC або DAC.
Користувацький RGB LED та два потужних ІЧ-світлодіоди 850 нм для активного освітлення при слабкому освітленні.
Примітка
H7 Plus не має вбудованого чипа управління живленням: немає зарядного пристрою акумулятора, немає ADC напруги акумулятора, немає світлодіодів стану заряду/живлення та немає апаратної кнопки живлення. Підключіть попередньо заряджений LiPo до JST-роз’єму або живіть плату від USB / VIN.
Розпіновка¶
Довідник по виводах¶
Назва виводу |
Функція |
|---|---|
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 |
контакт синхронізації кадру — з’єднаний тільки з датчиком камери |
BOOT0 |
підтягнути до 3,3 В при увімкненні для входу в DFU / ROM bootloader |
LED_RED |
червоний канал RGB LED (активний низький) |
LED_GREEN |
зелений канал RGB LED (активний низький) |
LED_BLUE |
синій канал RGB LED (активний низький) |
LED_IR |
потужні ІЧ-світлодіоди (обидва канали керуються разом) |
Примітка
Контакт SYN на роз’єму підключений безпосередньо до лінії тригера/витримки датчика камери — він не підключений до MCU на H7 Plus. Керуйте ним або зчитуйте зовнішньо; перемкнути його з MicroPython неможливо.
Виводи живлення¶
3.3V — шина 3,3 В після стабілізатора. До 250 мА доступно для модулів розширення (менше, якщо використовується карта microSD). На відміну від новіших камер, цей вивід є двонаправленим — дивіться попередження нижче.
VIN — вхід 3,6–5 В. Живить плату через вбудований стабілізатор.
GND — спільна земля.
Також присутній роз’єм для LiPo-акумулятора 3,7 В, але H7 Plus не має зарядного пристрою акумулятора — підключіть попередньо заряджений елемент або замість цього використовуйте VIN / USB.
Примітка
Якщо одночасно підключені USB і VIN/LiPo, вхід VIN/LiPo має пріоритет — вбудований перемикач живлення надає йому перевагу над USB для живлення плати.
Попередження
Роз’єм акумулятора та VIN з’єднані разом на H7 Plus. Не підключайте LiPo та одночасно подавайте VIN — два джерела живлення будуть конфліктувати і можуть пошкодити акумулятор, плату або обидва.
Попередження
Можна живити H7 Plus, подаючи 3,3 В безпосередньо на вивід 3.3V, якщо не потрібно проходити через вбудований стабілізатор. У цьому випадку не подавайте одночасно VIN або USB — зворотне живлення стабілізатора при активному іншому джерелі може назавжди пошкодити та знищити камеру.
Порада
Скористайтесь калькулятором часу роботи від акумулятора, щоб змоделювати, як довго H7 Plus працюватиме від акумулятора при заданому робочому циклі активності / глибокого сну.
Відновлення та виводи відлагодження¶
RESET — підтягнути до GND для скидання плати. Відпускання дозволяє MCU нормально запуститись.
BOOT0 — підтягнути до 3,3 В під час увімкнення плати для входу в ROM-завантажувач STM32 (режим DFU). OpenMV IDE використовує цей режим для перепрошивки вбудованого завантажувача.
Плата має роз’єм відлагодження SWD (RST / SWCLK / SWDIO / SWO) поряд із роз’ємом GPIO, сумісний з адаптерами ST‑LINK і SEGGER J‑Link.
Примітка
Контакт трасування SWO спільний з лінією тактового сигналу SPI роз’єму камери. SWO не може використовуватись одночасно з будь-яким модулем камери, що спілкується з MCU через SPI — наприклад, адаптерним модулем FLIR® Lepton® — оберіть одне або інше.
Вбудовані периферійні пристрої¶
Світлодіоди¶
H7 Plus має один користувацький RGB LED та пару потужних ІЧ-світлодіодів 850 нм:
Користувацький RGB LED — керований програмно, доступний як
LED_RED,LED_GREENтаLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
ІЧ-світлодіоди — обидва LED керуються разом через вивід
LED_IR.LED_IRпідключений в апаратурі як активний високий, тоді як мікропрограма обробляє всі інші вбудовані LED як активно низькі, тому використовуйтеlow()/high(), а неon()/off()(що інвертувало б логіку):from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
Датчик камери¶
OV5640 керується через модуль csi — датчики камери
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
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)
Датчик розміщений на знімному модулі — замінюйте його на будь-який інший модуль камери OpenMV (глобальний затвор, тепловізійний, вища роздільна здатність тощо) без зміни решти плати.
Машинне навчання¶
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")
Карта 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")
Те саме обладнання також можна використовувати в режимі цільового пристрою (ведений) через machine.I2CTarget для надання доступу до ділянки пам’яті іншому контролеру I²C:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
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, якщо потрібна додаткова шина.
Тепловий датчик (зовнішній)¶
Мікропрограма включає драйвер fir — драйвер теплового датчика (fir == далекий інфрачервоний діапазон) для зовнішньо підключених теплових датчиків:
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¶
Модуль time охоплює блокуючі затримки, монотонний лічильник тактів та вимірювання часу:
import time
time.sleep(1) # seconds
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
# ...do work...
elapsed = time.ticks_diff(time.ticks_ms(), start)
Віртуальні таймери¶
machine.Timer планує циклічні або одноразові зворотні виклики без використання слота апаратного таймера. Передайте -1 як ідентифікатор для використання віртуального (програмного) таймера:
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"))
Значення period задаються в мілісекундах. Викличте deinit() для зупинки та звільнення слота.
Годинник реального часу¶
machine.RTC зберігає час реального часу між перезавантаженнями:
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0)) # Y, M, D, weekday, h, m, s, subsec
print(rtc.datetime())
Сторожовий таймер¶
machine.WDT скидає плату, якщо застосунок завис. Після запуску його не можна зупинити або переналаштувати — скидайте його регулярно всередині основного циклу:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Завантаження та інформація про середовище виконання¶
Вікно USB-завантажувача¶
При кожному увімкненні камера запускає короткий завантажувач (кілька секунд), який дозволяє OpenMV IDE оновити мікропрограму без необхідності вводити режим DFU. Після закінчення вікна завантажувач передає управління boot.py, а потім main.py.
Запущений скрипт може повернутися в завантажувач на вимогу, викликавши machine.bootloader()
import machine
machine.bootloader()
Файлова система та порядок завантаження¶
Мікропрограма H7 Plus монтує до трьох файлових систем при завантаженні:
Внутрішня флеш-пам’ять — завжди монтується в
/flash. За замовчуванням міститьmain.pyтаREADME.txt; створюється при самому першому завантаженні.Карта microSD — якщо карта вставлена, монтується в
/sdcard.ROMFS — файлова система тільки для читання, відображена в пам’яті, за адресою
/rom, використовується для постачання великих ресурсів даних (наприклад, моделей штучного інтелекту), що виграють від доступу без копіювання. Автоматично монтується MicroPython при запуску, до виконання будь-якого Python-коду користувача.
Після монтування робоча директорія встановлюється в /sdcard, якщо карта присутня, інакше в /flash. Потім інтерпретатор запускає скрипти з цієї директорії:
boot.pyвиконується при кожному програмному скиданні (холодне завантаження,Ctrl‑Dз REPL або щоразу, коли запущений скрипт завершується).main.pyвиконується лише при холодному завантаженні, одразу післяboot.py. Подальші програмні скидання повторно запускаютьboot.py, але одразу переходять до REPL — щоб повторно запуститиmain.py, потрібно повністю скинути плату.
Розміщення boot.py або main.py на SD-карті перевизначає копію у флеш-пам’яті без її зміни — обидва файли шукаються в директорії завантаження (/sdcard, якщо карта змонтована, інакше /flash).
Стандартний main.py, що постачається на щойно прошитій платі, просто блимає синім каналом користувацького RGB LED як серцебиттям (два короткі імпульси, коротка пауза), щоб можна було переконатися, що мікропрограма завантажилась без проблем без підключеного хоста.
sys.path розширено для включення всіх трьох файлових систем та їх підкаталогів lib/, тому імпортовані модулі можуть знаходитись у /flash/lib, /sdcard/lib або /rom/lib.
Щоб змусити систему ігнорувати вставлену SD-карту (наприклад, для запуску main.py з флеш-пам’яті навіть при наявності карти), створіть порожній файл з назвою SKIPSD в кореневій директорії /flash.
При підключенні через USB завантажувальна файлова система (/sdcard, якщо карта присутня, інакше /flash) також відображається як USB-накопичувач на хості, що дозволяє редагувати boot.py, main.py та будь-які інші файли безпосередньо. Від’єднайте накопичувач перед скиданням камери, щоб хост скинув свої кешовані записи.
Примітка
Оскільки ОС обробляє накопичувач як пасивний блоковий пристрій, файли, створені або змінені кодом, що виконується на OpenMV Cam, не відображатимуться, поки хост не перемонтує накопичувач. Якщо ОС і OpenMV Cam записують в одну файлову систему одночасно, ОС матиме пріоритет і перезапише зміни, зроблені камерою. Використовуйте SD-карту для будь-яких даних, які записує скрипт, і перемонтуйте перед читанням цих файлів з хоста.
Примітка
Червоний канал користувацького RGB LED може ненадовго засвітитись, поки хост читає або записує на USB-накопичувач — це індикатор активності, керований мікропрограмою, а не несправність.
Розміри сховищ¶
H7 Plus поставляється з:
/flash— FAT-файлова система 24 МБ, читання/запис./rom— файлова система ROMFS тільки для читання з відображенням у пам’яті розміром 8 МБ, використовується для постачання скриптів та моделей МН, що виграють від доступу mmap без копіювання./sdcard— повний розмір будь-якої вставленої карти microSD (якщо присутня), читання/запис.
Індикатор апаратної помилки¶
Якщо користувацький RGB LED швидко циклічно перебирає всі кольори — достатньо швидко, що схоже скоріше на мигаючий білий LED, ніж на окремі відтінки — мікропрограма зіткнулась з невідновлюваною апаратною помилкою. Перепрошийте мікропрограму для відновлення; якщо перепрошивка не допомагає, плата може бути фізично пошкоджена.
Програмні бібліотеки¶
Дивіться індекс бібліотек для повного списку модулів — включаючи ті, що унікальні для збірки H7 Plus.