OpenMV Cam M4

OpenMV Cam M4 je kompaktní deska pro strojové vidění s jádrem Cortex‑M4, postavená kolem čipu STMicroelectronics STM32F427 běžícího na 180 MHz s 256 KB interní SRAM a 1 MB interní flash paměti. Dodávaný senzor OV7725 snímá snímky 320×240 ve stupních šedi nebo RGB565 a 9pinová uživatelská lišta zpřístupňuje periferie UART, I²C, SPI, CAN, ADC/DAC a PWM.

Poznámka

OV7725 byl standardní senzor na produkčních deskách M4. Velmi rané varianty M4 byly dodávány místo něj se senzorem OmniVision OV2640 — se stejnou QVGA náhledovou pipeline, ovšem OV2640 dokáže navíc snímat až UXGA (1600×1200) JPEG snímky. Oba senzory jsou ovládány přes stejné API csi — kamerové senzory.

OpenMV Cam M4

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

Hlavní vlastnosti

  • STMicroelectronics STM32F427 Cortex‑M4 na 180 MHz.

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

  • 1 MB interní flash paměti (žádná externí QSPI flash).

  • Senzor OV7725 (nebo OV2640 u velmi raných variant M4) — 320×240 8bitové stupně šedi nebo RGB565; OV2640 dokáže navíc snímat až UXGA (1600×1200) JPEG.

  • Full‑speed USB (12 Mb/s) — vůči hostiteli se hlásí jako VCP + USB mass storage.

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

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

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

Poznámka

M4 nemá žádný čip pro správu napájení: nemá konektor pro baterii, nabíječku baterie, ADC pro měření napětí baterie, žádné LED stavu nabíjení / napájení ani hardwarové tlačítko napájení. Napájejte desku z USB nebo z VIN.

Rozložení pinů

Rozložení pinů OpenMV Cam M4 OV7725

Přehled pinů

Název pinu

Funkce

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

stáhněte k GND pro reset desky

BOOT0

stáhněte k 3,3 V při zapnutí pro DFU / ROM bootloader

SWCLK

ARM SWD hodiny (přístup debuggeru)

SWDIO

ARM SWD data (přístup debuggeru)

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

Napájecí piny

  • 3.3V — stabilizovaná 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 vestavěný regulátor.

  • GND — společná zem.

Poznámka

Když je přítomno současně USB i VIN, desku napájí to, které má vyšší napětí — vestavěné diody jednoduše vyberou silnější větev.

Varování

M4 můžete napájet přivedením 3,3 V přímo na pin 3.3V, pokud nechcete procházet přes vestavěný regulátor. V takovém případě nepřivádějte zároveň napájení z VIN nebo USB — zpětné napájení regulátoru při aktivním jiném zdroji může kameru trvale poškodit a zničit.

Tip

Pomocí odhadovače výdrže baterie můžete modelovat, jak dlouho M4 vydrží na baterii při daném pracovním cyklu aktivního / hlubokého spánku.

Piny pro obnovu a ladění

  • RESET — stáhněte k GND pro reset desky. Jeho uvolnění nechá MCU normálně nastartovat.

  • BOOT0 — stáhněte k 3,3 V při napájení desky pro vstup do STM32 ROM bootloaderu (režim DFU). OpenMV IDE tento režim používá k přeflashování vestavěného bootloaderu.

SWCLK a SWDIO jsou vyvedeny jako běžné piny lišty (nikoli jako vyhrazený SWD konektor). Pro ladění desky propojte RESET, SWCLK, SWDIO, GND a 3,3 V s adaptérem ST‑LINK nebo SEGGER J‑Link.

Vestavěné periferie

LED diody

M4 má jedinou uživatelskou RGB LED plus pár výkonných 850 nm IR LED:

  • 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 zachází se všemi ostatními vestavěnými LED jako s aktivními v nule, takže používejte low() / high() namísto on() / off() (které by smysl invertovaly):

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

Senzor kamery

Dodávaný senzor (OV7725 na standardních deskách, OV2640 na velmi raných variantách) je ovládán 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 M4 připájen k desce — nenachází se na vyměnitelném modulu.

Poznámka

Na deskách s OV7725 je pin FSIN (frame‑sync) senzoru zapojen k MCU, ale jeho podpora ve firmwaru nebyla přidána.

Na deskách s OV2640 jsou piny STROBE, FREX (frame exposure) a EXPST (exposure reset) senzoru zapojeny k MCU, ale jejich podpora ve firmwaru nebyla přidána.

Lišty pro serva

Zadní strana desky má dvě pájecí plošky pro konektory serva, které vyvádějí standardní 3pinovou lištu serva (signál / VIN / GND) pro P7 a P8. Signálové piny vedou přímo na kanály 1 a 2 TIM4 (stejné kanály, jaké používá pyb.Servo) a pin V+ na každé liště je zapojen přímo na VIN, takže serva odebírají proud ze vstupní větve, nikoli z 3,3 V regulátoru.

Připájejte do plošek pár pravoúhlých 3pinových lišt a připojte dvě modelářská serva pro pohon pan‑and‑tilt držáku:

from pyb import Servo

pan  = Servo(1)              # P7 — TIM4 CH1
tilt = Servo(2)              # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)

microSD karta

Když je karta vložena, je automaticky připojena 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ě tolerantní k 5 V a dokážou pojmout/dodat 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 přechodech hrany:

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

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

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ý ADC vstup, nebo jako DAC výstup.

  • 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 tolerantní pouze k 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

Poznámka

TIM1 je firmwarem rezervován 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 se narušila funkce kamery.

TIM4 je sdílen s pyb.Servo — instanciování serva překonfiguruje celý časovač na provoz 50 Hz, takže v jednom skriptu nekombinujte machine.PWM na P7/P8 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ě bit‑bangované sběrnice

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

Termální senzor (mimo desku)

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

  • MLX90621 — IR pole 16 × 4

  • MLX90640 — IR pole 32 × 24

  • MLX90641 — IR pole 16 × 12

  • AMG8833 — IR pole 8 × 8

Připojte modul k I²C sběrnici desky a načítejte snímky 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 — připojte modul k P4 (SCL) a P5 (SDA).

Časování

time

Modul time pokrývá blokující zpoždění, 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 spotřeboval slot hardwarového časovače. Předejte jako id hodnotu -1 pro použití virtuálního (softwarového) časovače:

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. Pro zastavení a uvolnění slotu zavolejte deinit().

Hodiny reálného času

machine.RTC udržuje reálný čas napříč resety:

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 resetuje desku, pokud aplikace zamrzne. Po spuštění jej nelze zastavit ani překonfigurovat — periodicky jej obsluhujte uvnitř hlavní smyčky:

from machine import WDT

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

Informace o bootu a běhovém prostředí

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 vstoupit do režimu DFU. Po vypršení okna předá bootloader řízení souboru boot.py a poté main.py.

Běžící skript může na vyžádání znovu vstoupit do bootloaderu zavoláním machine.bootloader()

import machine

machine.bootloader()

Souborový systém a pořadí bootu

Firmware M4 při bootu připojuje 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 bootu.

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

  • ROMFS — souborový systém určený pouze pro čtení, mapovaný do paměti na /rom, používaný k dodávání velkých datových souborů (např. AI modelů), které těží z přístupu bez kopírování. MicroPython jej připojuje automaticky 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, je‑li karta přítomna, jinak na /flash. Interpret pak spouští skripty z tohoto adresáře:

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

  • main.py se spustí pouze při studeném bootu, ihned po boot.py. Následné softové resety znovu spustí boot.py, ale skočí rovnou do REPL — abyste znovu spustili main.py, musíte desku plně resetovat.

Umístění boot.py nebo main.py na SD kartu přepíše kopii ve flash paměti, aniž by se jí dotklo — oba soubory jsou vyhledávány v boot adresáři (/sdcard, je‑li 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 tepem (dva krátké pulzy, krátká pauza), takže poznáte, že firmware nastartoval čistě, 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 umístěny v /flash/lib, /sdcard/lib nebo /rom/lib.

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

Při připojení přes USB se boot souborový systém (/sdcard, je‑li karta přítomna, jinak /flash) na hostiteli zároveň hlásí jako USB mass‑storage disk, což vám umožní přímo upravovat boot.py, main.py a jakékoli další soubory. Před resetem kamery disk odpojte, aby hostitel vyprázdnil svůj cache zápisů.

Poznámka

Protože OS zachází s diskem 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 disk znovu nepřipojí. Pokud OS i OpenMV Cam zapisují do stejného souborového systému současně, vyhraje OS a přepíše změny provedené kamerou. Pro jakákoli data, která skript zapisuje zpět, používejte SD kartu a před čtením těchto souborů z hostitele ji 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 mass‑storage disku nebo na něj zapisuje — jde o firmwarem řízený indikátor aktivity, nikoli o závadu.

Velikosti úložišť

M4 se dodává s:

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

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

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

Indikátor tvrdé chyby (hard fault)

Pokud uživatelská RGB LED rychle cykluje všemi barvami — tak rychle, že to spíše vypadá jako třpytivá bílá LED než jako jednotlivé odstíny — firmware narazil na neopravitelnou tvrdou chybu (hard fault). Pro obnovu firmware přeflashujte; pokud přeflashování nepomůže, deska může být fyzicky poškozena.

Softwarové knihovny

Kompletní seznam modulů — včetně toho, které z nich jsou jedinečné pro build M4 — najdete v indexu knihoven.