OpenMV Cam H7¶
OpenMV Cam H7 — це плата технічного зору на базі Cortex‑M7, побудована навколо мікроконтролера STMicroelectronics STM32H743 з тактовою частотою 480 МГц, 1 МБ внутрішньої SRAM, 2 МБ внутрішньої флеш-пам’яті та апаратним кодеком JPEG. Плата випускається у двох ревізіях датчика — H7 з OV7725 та H7 R2 з ON Semi MT9M114 — однак мікропрограма, розводка виводів і Python API є ідентичними.
Повний технічний опис, фотографії та розміри дивіться на сторінці продукту OpenMV Cam H7.
Основні характеристики¶
STMicroelectronics STM32H743 Cortex‑M7 з тактовою частотою 480 МГц (1027 DMIPS).
Апаратний кодер/декодер JPEG.
1 МБ внутрішньої SRAM — без зовнішньої SDRAM.
2 МБ внутрішньої флеш-пам’яті (без зовнішньої QSPI флеш-пам’яті).
Датчик OV7725 (або MT9M114 на H7 R2).
Full‑speed 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 нм ІЧ LED для активного підсвічування у слабоосвітленому середовищі.
Примітка
H7 не має вбудованого чіпа керування живленням: відсутні зарядний пристрій, 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 |
TIM4 CH3 |
RESET |
з’єднати з GND для скидання плати |
SYN |
контакт синхронізації кадрів — підключений лише до датчика камери |
BOOT0 |
з’єднати з 3,3 В при увімкненні для входу в DFU / ROM завантажувач |
LED_RED |
червоний канал RGB LED (активний рівень низький) |
LED_GREEN |
зелений канал RGB LED (активний рівень низький) |
LED_BLUE |
синій канал RGB LED (активний рівень низький) |
LED_IR |
потужні ІЧ LED (обидва канали керуються разом) |
Примітка
Контакт SYN на роз’ємі підключений безпосередньо до лінії тригера/витримки датчика камери — він не підключений до MCU на H7. Керуйте ним або зчитуйте його зовнішньо; перемикати його з MicroPython неможливо.
Виводи живлення¶
3.3V — стабілізований рівень 3,3 В. До 250 мА доступні для шилдів (менше, якщо використовується карта microSD). На відміну від новіших камер, цей вивід є двонаправленим — дивіться попередження нижче.
VIN — вхід 3,6 – 5 В. Живить плату через вбудований стабілізатор.
GND — спільна земля.
Також присутній роз’єм для LiPo‑акумулятора 3,7 В, але H7 не має зарядного пристрою — підключайте заздалегідь заряджений елемент або використовуйте VIN / USB.
Примітка
Якщо одночасно підключено USB і VIN/LiPo, живлення від VIN/LiPo матиме пріоритет — вбудований перемикач живлення вибере його замість USB.
Попередження
Роз’єм акумулятора і VIN з’єднані разом на H7. Не підключайте LiPo і VIN одночасно — два джерела живлення конкуруватимуть між собою і можуть пошкодити акумулятор, плату або обидва компоненти.
Попередження
Можна живити H7, подаючи 3,3 В безпосередньо на вивід 3.3V, якщо не хочете використовувати вбудований стабілізатор. У такому разі не подавайте одночасно напругу на VIN або USB — зворотне живлення стабілізатора при активному іншому джерелі може назавжди пошкодити та вивести з ладу камеру.
Порада
Скористайтеся калькулятором часу роботи від акумулятора, щоб змоделювати, скільки H7 пропрацює від акумулятора для заданого циклу активної роботи / глибокого сну.
Виводи відновлення та налагодження¶
RESET — з’єднати з GND для скидання плати. Після відпускання MCU запускається в штатному режимі.
BOOT0 — підтягнути до 3,3 В під час подачі живлення для входу в ROM‑завантажувач STM32 (режим DFU). OpenMV IDE використовує цей режим для перепрошивки вбудованого завантажувача.
Плата має роз’єм SWD для налагодження (RST / SWCLK / SWDIO) поряд із заголовком GPIO, сумісний з адаптерами ST‑LINK і SEGGER J‑Link.
Вбудована периферія¶
LED-індикатори¶
H7 має один користувацький RGB LED та пару потужних 850 нм ІЧ LED:
Користувацький 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 керуються разом через вивід
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
Датчик камери¶
OV7725 (або MT9M114 на H7 R2) керується через модуль 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()
Датчик розміщений на знімному модулі — замініть його на будь-який інший модуль камери OpenMV (глобальний затвор, тепловізійний, з вищою роздільною здатністю тощо) без зміни решти плати.
Карта 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 |
P9 |
TIM4 CH3 |
Примітка
TIM1 зарезервований мікропрограмою для генерації тактового сигналу пікселів датчика камери, тому канали TIM1, фізично розташовані на P0/P1/P2, не можна використовувати для PWM без порушення роботи камери.
TIM4 є спільним з pyb.Servo — ініціалізація сервоприводу перенаштовує весь таймер для роботи на частоті 50 Гц, тому не слід поєднувати machine.PWM на P7/P8/P9 з 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"))
Значення периоду задаються в мілісекундах. Викличте 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 монтує до трьох файлових систем при завантаженні:
Внутрішня флеш-пам’ять — завжди монтується в
/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 постачається з:
/flash— FAT‑файлова система 128 КБ, читання/запис./rom— 128 КБ файлова система ROMFS лише для читання, відображена в пам’ять./sdcard— повний розмір вставленої картки microSD (якщо вставлено), читання/запис.
Індикатор апаратного збою¶
Якщо RGB LED користувача швидко циклічно проходить усі кольори — достатньо швидко, щоб виглядати як миготливий білий LED, а не окремі відтінки — мікропрограма зазнала невідновного апаратного збою. Перепрошийте мікропрограму для відновлення; якщо перепрошивка не допомагає, плата може бути фізично пошкоджена.
Програмні бібліотеки¶
Дивіться індекс бібліотек для повного списку модулів — включаючи ті, що є унікальними для збірки H7.