OpenMV Cam M4¶
OpenMV Cam M4 — це компактна плата технічного зору на базі Cortex‑M4, побудована на мікроконтролері STMicroelectronics STM32F427 з тактовою частотою 180 МГц, 256 КБ внутрішньої SRAM та 1 МБ внутрішньої флеш-пам’яті. Датчик OV7725 у комплекті забезпечує захоплення кадрів 320×240 у відтінках сірого або RGB565, а 9-контактний роз’єм користувача надає доступ до периферійних пристроїв UART, I²C, SPI, CAN, ADC/DAC та PWM.
Примітка
OV7725 був стандартним датчиком на серійних платах M4. Дуже ранні варіанти M4 поставлялися з OmniVision OV2640 — той самий конвеєр попереднього перегляду QVGA, але OV2640 також може захоплювати кадри JPEG до UXGA (1600×1200). Обидва датчики керуються через однаковий API csi — датчики камери.
Повний технічний паспорт, фотографії та розміри дивіться на сторінці продукту OpenMV Cam M4.
Основні характеристики¶
STMicroelectronics STM32F427 Cortex‑M4 з тактовою частотою 180 МГц.
256 КБ внутрішньої SRAM — без зовнішньої SDRAM.
1 МБ внутрішньої флеш-пам’яті (без зовнішньої QSPI флеш-пам’яті).
Датчик OV7725 (або OV2640 на дуже ранніх варіантах M4) — 320×240 8-бітний у відтінках сірого або RGB565; OV2640 може додатково захоплювати до UXGA (1600×1200) JPEG.
USB повної швидкості (12 Мб/с) — відображається як VCP + USB-накопичувач на хості.
Роз’єм microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.
9 виводів вводу/виводу, 5 В толерантні з виходом 3,3 В, 25 мА на вивід (120 мА всього по роз’єму), здатні генерувати переривання. P6 не є 5 В толерантним у режимі ADC або DAC.
Користувацький RGB LED та два потужних ІЧ-світлодіоди 850 нм для активного освітлення при зйомці в умовах слабкого освітлення.
Примітка
M4 не має вбудованого чіпу керування живленням: відсутній роз’єм для акумулятора, зарядний пристрій, ADC напруги акумулятора, індикатори заряду/живлення та апаратна кнопка живлення. Живіть плату від USB або VIN.
Розпіновка¶
Довідник виводів¶
Назва виводу |
Функція |
|---|---|
P0 |
SPI2 MOSI |
P1 |
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 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
RESET |
підключити до GND для скидання плати |
BOOT0 |
підключити до 3,3 В при увімкненні для завантажувача DFU / ROM |
SWCLK |
тактовий сигнал ARM SWD (доступ відладчика) |
SWDIO |
шина даних ARM SWD (доступ відладчика) |
LED_RED |
червоний канал RGB LED (активний низький рівень) |
LED_GREEN |
зелений канал RGB LED (активний низький рівень) |
LED_BLUE |
синій канал RGB LED (активний низький рівень) |
LED_IR |
потужні ІЧ-світлодіоди (обидва канали керуються разом) |
Контакти живлення¶
3.3V — стабілізована шина 3,3 В. До 250 мА доступно для розширень (менше, якщо використовується карта microSD). На відміну від новіших камер, цей вивід є двонаправленим — дивіться попередження нижче.
VIN — вхід 3,6–5 В. Живить плату через вбудований стабілізатор.
GND — спільна земля.
Примітка
Якщо підключені одночасно USB і VIN, плату живить той, у кого вища напруга — вбудовані діоди просто вибирають сильнішу шину.
Попередження
Можна живити M4, подаючи 3,3 В безпосередньо на вивід 3.3V, якщо ви не хочете використовувати вбудований стабілізатор. У такому разі не підключайте одночасно VIN або USB — зворотне живлення стабілізатора під час дії іншого джерела може назавжди пошкодити та вивести камеру з ладу.
Порада
Використовуйте калькулятор ресурсу акумулятора, щоб розрахувати, як довго M4 працюватиме від акумулятора для заданого робочого циклу активності / глибокого сну.
Виводи відновлення та налагодження¶
RESET — підключити до GND для скидання плати. Після відпускання MCU запускається в нормальному режимі.
BOOT0 — підключити до 3,3 В під час подачі живлення на плату для входу в ROM-завантажувач STM32 (режим DFU). OpenMV IDE використовує цей режим для перепрошивки вбудованого завантажувача.
SWCLK та SWDIO розведені як звичайні контакти роз’єму (без спеціального роз’єму SWD). Підключіть RESET, SWCLK, SWDIO, GND та 3,3 В до адаптера ST‑LINK або SEGGER J‑Link для налагодження плати.
Вбудована периферія¶
Світлодіоди¶
M4 має один користувацький 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
Датчик камери¶
Вбудований датчик (OV7725 на стандартних платах, OV2640 на дуже ранніх варіантах) керується через модуль 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()
Датчик припаяний до плати на M4 — він не розміщений на змінному модулі.
Примітка
На платах OV7725 вивід FSIN (синхронізація кадру) датчика підключений до MCU, але підтримка цього виводу в мікропрограмі ще не реалізована.
На платах OV2640 виводи датчика STROBE, FREX (витримка кадру) та EXPST (скидання витримки) підключені до MCU, але підтримка їх у мікропрограмі ще не реалізована.
Роз’єми для сервоприводів¶
На зворотній стороні плати є дві контактні площадки роз’єму сервоприводу, які виводять стандартний 3-контактний роз’єм сервоприводу (сигнал / VIN / GND) для P7 і P8. Сигнальні виводи безпосередньо відповідають каналам 1 і 2 TIM4 (ті самі канали, які використовує pyb.Servo), а вивід V+ на кожному роз’ємі підключений безпосередньо до VIN, тому сервоприводи споживають струм від вхідної шини, а не від стабілізатора 3,3 В.
Припаяйте пару прямокутних 3-контактних роз’ємів до контактних площадок і підключіть два хобі-сервоприводи для керування нахилом і поворотом:
from pyb import Servo
pan = Servo(1) # P7 — TIM4 CH1
tilt = Servo(2) # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)
Карта microSD¶
Коли карта вставлена, вона автоматично монтується в /sdcard і доступна через звичайну файлову систему:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Довідник шин¶
GPIO¶
Використовуйте machine.Pin для читання або керування будь-яким з позначених виводів. Виходи — CMOS 3,3 В, 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 |
|---|---|---|
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 |
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 |
Примітка
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 як 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()
Файлова система та порядок завантаження¶
Мікропрограма M4 монтує до трьох файлових систем при завантаженні:
Внутрішня флеш-пам’ять — завжди монтується в
/flash. За замовчуванням міститьmain.pyтаREADME.txt; створюється під час першого завантаження.Карта microSD — якщо карта вставлена, вона монтується в
/sdcard.ROMFS — файлова система лише для читання з відображенням у пам’яті в
/rom, призначена для зберігання великих ресурсів даних (наприклад, моделей AI), які виграють від прямого доступу без копіювання. Монтується автоматично 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-накопичувач — це індикатор активності, керований мікропрограмою, а не ознака несправності.
Обсяги пам’яті¶
M4 постачається з:
/flash— файлова система FAT об’ємом 32 КБ, читання/запис./rom— пам’ять лише для читання об’ємом 128 КБ з відображенням у пам’яті ROMFS./sdcard— повний розмір вставленої карти microSD (якщо є), читання/запис.
Індикатор апаратного збою¶
Якщо RGB LED швидко циклічно перемикає всі кольори — достатньо швидко, щоб виглядати як миготливий білий LED, а не окремі відтінки — мікропрограма зіткнулася з неусувним апаратним збоєм. Перепрошийте мікропрограму для відновлення; якщо перепрошивка не допомагає, плата може бути фізично пошкоджена.
Програмні бібліотеки¶
Дивіться індекс бібліотек для повного списку модулів — включно з тими, що є унікальними для збірки M4.