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-светодиод и два мощных ИК-светодиода на 850 нм для активной подсветки при съёмке в условиях слабого освещения.
Примечание
У 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_GREEN |
зелёный канал RGB-светодиода (активный низкий уровень) |
LED_BLUE |
синий канал RGB-светодиода (активный низкий уровень) |
LED_IR |
мощные ИК-светодиоды (оба канала управляются вместе) |
Примечание
Контакт SYN на разъёме подключён напрямую к линии триггера / экспозиции датчика камеры — на H7 он не заведён на MCU. Управляйте им или считывайте его внешними средствами; из MicroPython переключить его нельзя.
Выводы питания¶
3.3V — стабилизированная шина 3,3 В. До 250 мА доступно для шилдов (меньше, если используется карта microSD). В отличие от более новых камер этот вывод двунаправленный — см. предупреждение ниже.
VIN — вход 3,6–5 В. Питает плату через встроенный стабилизатор.
GND — общая земля.
Также имеется разъём для LiPo на 3,7 В, но у H7 нет зарядного устройства для аккумулятора — подключайте заранее заряженный элемент или подавайте питание через VIN / USB.
Примечание
Когда присутствует и USB, и VIN/LiPo, приоритет имеет вход VIN/LiPo — встроенный коммутатор питания выбирает его, а не USB, для питания платы.
Предупреждение
На H7 разъём аккумулятора и VIN объединены. Не подключайте 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.
Встроенные периферийные устройства¶
Светодиоды¶
У H7 есть один пользовательский RGB-светодиод плюс пара мощных ИК-светодиодов на 850 нм:
Пользовательский RGB-светодиод — программно управляемый, доступен как
LED_RED,LED_GREENиLED_BLUE:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
ИК-светодиоды — оба светодиода управляются вместе через вывод
LED_IR.LED_IRподключён в аппаратуре как активный высокий уровень, тогда как прошивка считает все остальные встроенные светодиоды активными низкими, поэтому используйте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")
То же оборудование можно использовать и в режиме целевого устройства (slave) через 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)
Программно эмулируемые (bit-banged) шины¶
machine.SoftI2C и machine.SoftSPI работают на любом GPIO, если вам нужна дополнительная шина.
Тепловизионный датчик (внешний)¶
Прошивка включает драйвер fir — драйвер теплового датчика (fir == far infrared, дальний инфракрасный) для внешне подключённых тепловизоров:
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 в качестве id, чтобы использовать виртуальный (программный) таймер:
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-светодиода в качестве индикатора работы (два коротких импульса, короткая пауза), так что вы можете понять, что прошивка загрузилась корректно, без подключения к хосту.
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-светодиода может кратковременно загораться, пока хост читает с USB-накопителя или записывает на него — это индикатор активности, управляемый прошивкой, а не неисправность.
Размеры хранилища¶
H7 поставляется с:
/flash— файловая система FAT объёмом 128 КБ, чтение/запись./rom— отображённая в память файловая система ROMFS объёмом 128 КБ, только для чтения./sdcard— полный объём вставленной карты microSD (при наличии), чтение/запись.
Индикатор аппаратного сбоя (hard fault)¶
Если пользовательский RGB-светодиод быстро перебирает все цвета — настолько быстро, что это скорее похоже на мерцающий белый светодиод, чем на отдельные оттенки, — прошивка столкнулась с невосстановимым аппаратным сбоем (hard fault). Перепрошейте прошивку для восстановления; если перепрошивка не помогает, плата может быть физически повреждена.
Программные библиотеки¶
Полный список модулей — включая те, что уникальны для сборки H7, — см. в индексе библиотек.