OpenMV Cam M7

OpenMV Cam M7 je deska pro strojové vidění s jádrem Cortex‑M7, postavená kolem čipu STMicroelectronics STM32F765 na 216 MHz s 512 KB interní SRAM a 2 MB interní flash paměti. Přibalený senzor OV7725 snímá snímky 640×480 ve stupních šedi nebo 320×240 v RGB565 rychlostí až 150 FPS a 10pinová uživatelská lišta zpřístupňuje periferie UART, I²C, SPI, CAN, ADC/DAC a PWM.

OpenMV Cam M7

Kompletní katalogový list, fotografie a rozměry najdete na produktové stránce OpenMV Cam M7.

Hlavní vlastnosti

  • STMicroelectronics STM32F765 Cortex‑M7 na 216 MHz.

  • 512 KB interní SRAM — žádná externí SDRAM.

  • 2 MB interní flash (žádná externí QSPI flash).

  • Senzor OV7725 — 640×480 ve stupních šedi nebo 320×240 v RGB565 rychlostí až 150 FPS.

  • Full‑speed USB (12 Mb/s) — vůči hostiteli se hlásí jako VCP + USB velkokapacitní úložiště.

  • Slot pro microSD — SD až 2 GB, SDHC až 32 GB, SDXC až 2 TB.

  • 10 I/O pinů, odolných vůči 5 V s výstupem 3,3 V, 25 mA na pin (celkem 120 mA přes celou lištu), s podporou přerušení. P6 není odolný vůči 5 V při použití v režimu ADC nebo DAC.

  • Uživatelská RGB LED a dvě výkonné IR LED 850 nm pro aktivní osvětlení při vidění za slabého světla.

Poznámka

M7 nemá žádný čip pro správu napájení na desce: nemá konektor na baterii, nabíječku baterie, ADC pro měření napětí baterie, LED pro indikaci nabíjení / stavu napájení ani hardwarové tlačítko napájení. Desku napájejte přes USB nebo VIN.

Rozložení pinů

Rozložení pinů OpenMV Cam M7 OV7725

Přehled pinů

Název pinu

Funkce

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

připojením na GND restartujete desku

SYN

pad pro synchronizaci snímků — připojen pouze k senzoru kamery

BOOT0

připojením na 3,3 V při zapnutí spustíte DFU / ROM bootloader

LED_RED

červený kanál RGB LED (aktivní v nule)

LED_GREEN

zelený kanál RGB LED (aktivní v nule)

LED_BLUE

modrý kanál RGB LED (aktivní v nule)

LED_IR

výkonné IR LED (oba kanály řízeny společně)

Poznámka

Pad SYN na liště je připojen přímo k spouštěcí / expoziční lince senzoru kamery — na M7 nevede k MCU. Řiďte jej nebo čtěte externě; z MicroPythonu jej přepínat nelze.

Napájecí piny

  • 3.3V — regulovaná napájecí větev 3,3 V. Pro shieldy je k dispozici až 250 mA (méně, pokud se používá microSD karta). Na rozdíl od novějších kamer je tento pin obousměrný — viz varování níže.

  • VIN — vstup 3,6 – 5 V. Napájí desku přes regulátor na desce.

  • GND — společná zem.

Poznámka

Pokud jsou přítomny USB i VIN zároveň, desku napájí ten s vyšším napětím — diody na desce jednoduše vyberou silnější větev.

Varování

M7 smíte napájet přivedením 3,3 V přímo na pin 3.3V, pokud nechcete jít přes regulátor na desce. V takovém případě současně nepřivádějte také napájení z VIN nebo USB — zpětné buzení regulátoru, zatímco je aktivní jiný zdroj, může trvale poškodit a zničit kameru.

Tip

Pomocí odhadu výdrže baterie můžete modelovat, jak dlouho M7 vydrží na baterii při daném poměru aktivního / hlubokého spánku.

Piny pro obnovu a ladění

  • RESET — připojením na GND restartujete desku. Jeho uvolnění nechá MCU normálně nastartovat.

  • BOOT0 — připojením na 3,3 V během napájení desky vstoupíte do STM32 ROM bootloaderu (režim DFU). OpenMV IDE tento režim používá k přeflashování bootloaderu na desce.

Deska zpřístupňuje ladicí lištu SWD (RST / SWCLK / SWDIO) vedle GPIO lišty, kompatibilní s adaptéry ST‑LINK a SEGGER J‑Link.

Periferie na desce

LED

M7 má jednu uživatelskou RGB LED a dvojici výkonných IR LED 850 nm:

  • Uživatelská RGB LED — softwarově ovladatelná, zpřístupněná jako LED_RED, LED_GREEN a LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • IR LED — obě LED jsou řízeny společně přes pin LED_IR. LED_IR je v hardwaru zapojena jako aktivní v jedničce, zatímco firmware považuje každou ostatní LED na desce za aktivní v nule, takže použijte low() / high() namísto on() / off() (které by logiku obrátily):

    from machine import LED
    
    ir = LED("LED_IR")
    ir.low()    # turn IR illumination ON
    ir.high()   # turn IR illumination OFF
    

Senzor kamery

OV7725 je řízen přes modul csi — kamerové senzory

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()

Senzor je na M7 připájen k desce — není na vyměnitelném modulu.

microSD karta

Když je karta vložena, automaticky se připojí na /sdcard a je použitelná přes běžný souborový systém:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

Přehled sběrnic

GPIO

Pomocí machine.Pin můžete číst nebo řídit kterýkoli z popsaných pinů. Výstupy jsou 3,3 V CMOS, na vstupní straně odolné vůči 5 V a mohou pohlcovat/dodávat až 25 mA na pin (celkem 120 mA přes celou lištu).

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())

Kterýkoli vstupní pin může také vyvolat přerušení při hranových přechodech:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Sběrnice

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

Sběrnice

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")

Stejný hardware lze také použít v cílovém (slave) režimu přes machine.I2CTarget k zpřístupnění paměťové oblasti jinému I²C řadiči:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

SPI

Sběrnice

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

Sběrnice

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 a DAC

P6 je jediný uživatelský analogový pin. Lze jej použít buď jako 12bitový vstup ADC, nebo jako výstup DAC.

  • ADC — plný rozsah při 3,3 V na pinu:

    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 — přes pyb.DAC. 8bitová hodnota pokrývá 0–3,3 V:

    from pyb import DAC
    
    dac = DAC("P6")
    voltage = 1.65
    dac.write(int(voltage / 3.3 * 255))
    

V režimu ADC nebo DAC je P6 odolný pouze vůči 3,3 V — nepřivádějte na něj 5 V.

PWM

Pin

Časovač / kanál

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM4 CH3

Poznámka

TIM1 je firmwarem vyhrazen pro generování pixelových hodin senzoru kamery, takže kanály TIM1, které jsou fyzicky na P0/P1/P2, nelze použít pro uživatelské PWM, aniž by to narušilo kameru.

TIM4 je sdílen s pyb.Servo — vytvoření instance serva překonfiguruje celý časovač na provoz 50 Hz, takže v jednom skriptu nekombinujte machine.PWM na P7/P8/P9 s pyb.Servo.

Kterýkoli z nich řiďte přes machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)

Softwarově emulované sběrnice (bit‑banging)

machine.SoftI2C a machine.SoftSPI fungují na libovolném GPIO, pokud potřebujete další sběrnici.

Teplotní senzor (mimo desku)

Firmware obsahuje ovladač fir — ovladač termálního senzoru (fir == far infrared, vzdálené infračervené záření) pro externě zapojené termovizní senzory:

  • MLX90621 — IR pole 16 × 4

  • MLX90640 — IR pole 32 × 24

  • MLX90641 — IR pole 16 × 12

  • AMG8833 — IR pole 8 × 8

Modul připojte na I²C sběrnici desky a snímky čtěte pomocí 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())

Ovladač fir komunikuje se senzorem pouze přes I²C 2 — modul zapojte na P4 (SCL) a P5 (SDA).

Časování

time

Modul time pokrývá blokující prodlevy, monotónní tiky a měření uplynulého času:

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)

Virtuální časovače

machine.Timer plánuje periodické nebo jednorázové callbacky, aniž by zabíral slot hardwarového časovače. Předáním -1 jako id použijete virtuální (softwarový) časovač:

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"))

Hodnoty periody jsou v milisekundách. Voláním deinit() časovač zastavíte a uvolníte slot.

Hodiny reálného času

machine.RTC udržuje reálný čas i přes restarty:

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())

Watchdog

machine.WDT restartuje desku, pokud aplikace zamrzne. Po spuštění jej nelze zastavit ani překonfigurovat — pravidelně jej obnovujte uvnitř hlavní smyčky:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Informace o spuštění a běhu

Okno USB bootloaderu

Při každém zapnutí kamera spustí krátký bootloader (několik sekund), který umožňuje OpenMV IDE aktualizovat firmware, aniž by uživatel musel vstupovat do režimu DFU. Po vypršení okna bootloader předá řízení boot.py a poté main.py.

Běžící skript může bootloader na vyžádání znovu spustit voláním machine.bootloader()

import machine

machine.bootloader()

Souborový systém a pořadí spouštění

Firmware M7 při spuštění připojí až tři souborové systémy:

  • Interní flash — vždy připojena na /flash. Ve výchozím stavu obsahuje main.py a README.txt; vytvořena při úplně prvním spuštění.

  • microSD karta — pokud je karta vložena, je připojena na /sdcard.

  • ROMFS — souborový systém pouze pro čtení mapovaný do paměti na /rom, používaný k dodávání velkých datových prostředků (např. AI modelů), které těží z přístupu bez kopírování. Připojen automaticky MicroPythonem při startu, ještě před spuštěním jakéhokoli uživatelského Python kódu.

Po připojení je pracovní adresář nastaven na /sdcard, pokud je karta přítomna, jinak na /flash. Interpret pak spouští skripty z tohoto adresáře:

  • boot.py se spustí při každém softwarovém resetu (studený start, Ctrl‑D z REPL nebo kdykoli běžící skript skončí).

  • main.py se spustí pouze při studeném startu, ihned po boot.py. Následné softwarové resety znovu spustí boot.py, ale skočí rovnou do REPL — k opětovnému spuštění main.py musíte desku zcela restartovat.

Umístěním boot.py nebo main.py na SD kartu přepíšete kopii ve flash paměti, aniž byste se jí dotkli — oba soubory se hledají v zaváděcím adresáři (/sdcard, když je karta připojena, jinak /flash).

Výchozí main.py dodávaný na čerstvě naflashované desce pouze bliká modrým kanálem uživatelské RGB LED jako kontrolka srdečního tepu (dva krátké pulzy, krátká pauza), takže poznáte, že firmware naběhl čistě i bez připojeného hostitele.

sys.path je rozšířen tak, aby zahrnoval všechny tři souborové systémy a jejich podadresáře lib/, takže importovatelné moduly mohou být uloženy v /flash/lib, /sdcard/lib nebo /rom/lib.

Chcete‑li systém přimět ignorovat vloženou SD kartu (například ke spuštění main.py z flash paměti i s přítomnou kartou), vytvořte v kořeni /flash prázdný soubor s názvem SKIPSD.

Při připojení přes USB se zaváděcí souborový systém (/sdcard, pokud je karta přítomna, jinak /flash) na hostiteli také hlásí jako USB velkokapacitní úložiště, což vám umožňuje přímo upravovat boot.py, main.py a jakékoli další soubory. Před restartem kamery jednotku vysuňte (eject), aby hostitel vyprázdnil svůj cache zápis.

Poznámka

Protože OS s jednotkou zachází jako s pasivním blokovým zařízením, soubory vytvořené nebo upravené kódem běžícím na OpenMV Cam se neobjeví, dokud hostitel jednotku znovu nepřipojí. Pokud OS i OpenMV Cam zapisují do stejného souborového systému zároveň, OS zvítězí a přepíše změny provedené kamerou. Pro veškerá data, která skript zapisuje zpět, použijte SD kartu a před čtením těchto souborů z hostitele kartu znovu připojte.

Poznámka

Červený kanál uživatelské RGB LED se může krátce rozsvítit, zatímco hostitel čte z USB velkokapacitního úložiště nebo do něj zapisuje — jde o indikátor aktivity řízený firmwarem, nikoli o závadu.

Velikosti úložišť

M7 se dodává s:

  • /flash — FAT souborový systém 96 KB, pro čtení/zápis.

  • /rom — ROMFS 256 KB pouze pro čtení, mapovaný do paměti.

  • /sdcard — plná velikost vložené microSD karty (pokud je přítomna), pro čtení/zápis.

Indikátor hard‑fault

Pokud uživatelská RGB LED rychle cykluje všemi barvami — dost rychle na to, aby spíše vypadala jako blikající bílá LED než jako jednotlivé odstíny — firmware narazil na neobnovitelnou kritickou chybu (hard fault). K obnově firmware přeflashujte; pokud přeflashování nepomůže, deska může být fyzicky poškozena.

Softwarové knihovny

Úplný seznam modulů — včetně toho, které jsou jedinečné pro sestavení M7 — najdete v indexu knihoven.