OpenMV Cam M7¶
OpenMV Cam M7 — це плата технічного зору на базі Cortex‑M7, побудована навколо мікроконтролера STMicroelectronics STM32F765 з тактовою частотою 216 МГц, 512 КБ внутрішньої SRAM та 2 МБ внутрішньої флеш-пам’яті. Датчик OV7725 у комплекті знімає кадри 640×480 у відтінках сірого або 320×240 RGB565 зі швидкістю до 150 FPS, а 10-контактний роз’єм для користувача надає доступ до периферійних пристроїв UART, I²C, SPI, CAN, ADC/DAC та PWM.
Повний технічний паспорт, фотографії та розміри дивіться на сторінці продукту OpenMV Cam M7.
Основні характеристики¶
STMicroelectronics STM32F765 Cortex‑M7 з тактовою частотою 216 МГц.
512 КБ внутрішньої SRAM — без зовнішньої SDRAM.
2 МБ внутрішньої флеш-пам’яті (без зовнішньої QSPI флеш-пам’яті).
Датчик OV7725 — 640×480 у відтінках сірого або 320×240 RGB565 зі швидкістю до 150 FPS.
USB повної швидкості (12 Мб/с) — визначається хостом як VCP + USB-накопичувач.
Роз’єм microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.
10 виводів вводу/виводу, 5 В сумісні з виходом 3,3 В, 25 мА на вивід (120 мА сумарно по всьому роз’єму), підтримка переривань. Вивід P6 не є 5 В сумісним у режимі ADC або DAC.
Призначений для користувача RGB-світлодіод та два потужних ІЧ-світлодіоди 850 нм для активного підсвічування при слабкому освітленні.
Примітка
M7 не має мікросхеми керування живленням: немає роз’єму для батареї, зарядного пристрою, ADC напруги батареї, індикаторних світлодіодів зарядки/живлення та апаратної кнопки живлення. Живіть плату через USB або VIN.
Розпіновка¶
Довідник по виводах¶
Назва виводу |
Функція |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / CAN2 TX |
P3 |
SPI2 NSS (CS) / CAN2 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 на роз’ємі підключений безпосередньо до лінії тригера/витримки датчика камери — він не маршрутизується до MCU на M7. Керуйте ним або зчитуйте його зовнішньо; перемикати його з MicroPython неможливо.
Виводи живлення¶
3,3В — стабілізована шина 3,3 В. Доступно до 250 мА для шилдів (менше, якщо використовується microSD-карта). На відміну від новіших камер, цей вивід є двонаправленим — дивіться попередження нижче.
VIN — вхід 3,6–5 В. Живить плату через вбудований стабілізатор.
GND — спільна земля.
Примітка
Коли підключено і USB, і VIN, плату живить той, що має вищу напругу — вбудовані діоди просто вибирають сильнішу шину.
Попередження
Можна живити M7, подаючи 3,3 В безпосередньо на вивід 3.3V, якщо ви не хочете використовувати вбудований стабілізатор. У цьому випадку не подавайте одночасно VIN або USB — зворотне живлення стабілізатора при активному іншому джерелі може назавжди пошкодити та знищити камеру.
Порада
Використовуйте калькулятор ресурсу батареї, щоб моделювати, як довго M7 працюватиме від батареї при заданому циклі активності/глибокого сну.
Виводи відновлення та налагодження¶
RESET — підтягнути до GND для скидання плати. Відпускання дає MCU можливість запуститися нормально.
BOOT0 — підтягнути до 3,3 В при увімкненні плати для входу в ROM завантажувач STM32 (режим DFU). OpenMV IDE використовує цей режим для перепрошивки вбудованого завантажувача.
Плата має роз’єм для налагодження SWD (RST / SWCLK / SWDIO) поруч із роз’ємом GPIO, сумісний з адаптерами ST‑LINK та SEGGER J‑Link.
Вбудовані периферійні пристрої¶
Світлодіоди¶
M7 має один призначений для користувача RGB-світлодіод та пару потужних ІЧ-світлодіодів 850 нм:
Призначений для користувача RGB-світлодіод — керується програмно, доступний як
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
Датчик камери¶
OV7725 керується через модуль 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()
Датчик припаяний до плати на M7 — він не знаходиться на змінному модулі.
Карта 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¶
Шина |
TX |
RX |
|---|---|---|
CAN2 |
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"))
Значення 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()
Файлова система та порядок завантаження¶
Мікропрограма M7 монтує до трьох файлових систем при завантаженні:
Внутрішня флеш-пам’ять — завжди монтується за адресою
/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-накопичувача або записує на нього — це індикатор активності, що керується мікропрограмою, а не несправність.
Розміри сховища¶
M7 поставляється з:
/flash— FAT-файлова система 96 КБ, читання/запис./rom— файлова система ROMFS 256 КБ лише для читання з відображенням у пам’яті./sdcard— повний розмір вставленої карти microSD (якщо присутня), читання/запис.
Індикатор апаратного збою¶
Якщо RGB-світлодіод швидко циклічно перемикає всі кольори — достатньо швидко, щоб виглядати як мерехтливий білий LED, а не як окремі відтінки — мікропрограма зіткнулась з невиправним апаратним збоєм. Перепрошийте мікропрограму для відновлення; якщо перепрошивка не допомагає, плата може бути фізично пошкоджена.
Програмні бібліотеки¶
Перегляньте індекс бібліотек для повного переліку модулів — включно з тими, що є унікальними для збірки M7.