OpenMV Cam M4

OpenMV Cam M4 je kompaktna Cortex‑M4 ploča za strojni vid izgrađena oko STMicroelectronics STM32F427 na 180 MHz s 256 KB unutarnjeg SRAM-a i 1 MB unutarnje flash memorije. Priloženi senzor OV7725 snima sličice 320×240 u sivim tonovima ili RGB565, a 9‑pinski korisnički priključak izlaže periferije UART, I²C, SPI, CAN, ADC/DAC i PWM.

Napomena

OV7725 je bio standardni senzor na proizvodnim M4 pločama. Vrlo rane varijante M4 isporučivane su s OmniVision OV2640 — isti QVGA cjevovod za pregled, ali OV2640 može snimati i JPEG sličice do UXGA (1600×1200). Oba senzora upravljaju se kroz isti csi — senzori kamere API.

OpenMV Cam M4

Za potpuni podatkovni list, fotografije i dimenzije pogledajte stranicu proizvoda OpenMV Cam M4.

Istaknute značajke

  • STMicroelectronics STM32F427 Cortex‑M4 na 180 MHz.

  • 256 KB unutarnjeg SRAM-a — bez vanjskog SDRAM-a.

  • 1 MB unutarnje flash memorije (bez vanjske QSPI flash memorije).

  • Senzor OV7725 (ili OV2640 na vrlo ranim varijantama M4) — 320×240 8‑bitni sivi tonovi ili RGB565; OV2640 može dodatno snimati i JPEG do UXGA (1600×1200).

  • Full‑speed USB (12 Mb/s) — domaćinu se prikazuje kao VCP + USB masovna pohrana.

  • microSD utor — SD do 2 GB, SDHC do 32 GB, SDXC do 2 TB.

  • 9 I/O pinova, podnose 5 V s 3,3 V izlazom, 25 mA po pinu (ukupno 120 mA na priključku), sposobni za prekide. P6 nije otporan na 5 V kada se koristi u ADC ili DAC načinu rada.

  • Korisnički RGB LED i dva snažna 850 nm IR LED-a za aktivno osvjetljenje pri vidu u uvjetima slabog svjetla.

Napomena

M4 nema čip za upravljanje napajanjem na ploči: nema konektora za bateriju, punjača baterije, ADC-a za napon baterije, LED-ova za status punjenja / napajanja, kao ni hardverskog gumba za napajanje. Napajajte ploču preko USB-a ili VIN-a.

Raspored pinova

Raspored pinova OpenMV Cam M4 OV7725

Referenca pinova

Naziv pina

Funkcija

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

spojite na GND za resetiranje ploče

BOOT0

spojite na 3,3 V pri uključivanju za DFU / ROM bootloader

SWCLK

ARM SWD takt (pristup ispravljaču pogrešaka)

SWDIO

ARM SWD podaci (pristup ispravljaču pogrešaka)

LED_RED

crveni kanal RGB LED-a (aktivan na nisko)

LED_GREEN

zeleni kanal RGB LED-a (aktivan na nisko)

LED_BLUE

plavi kanal RGB LED-a (aktivan na nisko)

LED_IR

snažni IR LED-ovi (oba kanala upravljaju se zajedno)

Pinovi napajanja

  • 3.3V — regulirana naponska linija od 3,3 V. Dostupno do 250 mA za štitove (manje ako se koristi microSD kartica). Za razliku od novijih kamera, ovaj pin je dvosmjeran — pogledajte upozorenje u nastavku.

  • VIN — ulaz 3,6 – 5 V. Napaja ploču kroz regulator na ploči.

  • GND — zajedničko uzemljenje.

Napomena

Kada su prisutni i USB i VIN, ploču napaja onaj koji ima viši napon — diode na ploči jednostavno odabiru jaču liniju.

Upozorenje

M4 možete napajati dovođenjem 3,3 V izravno na pin 3.3V ako ne želite prolaziti kroz regulator na ploči. U tom slučaju nemojte istovremeno dovoditi i VIN ili USB napajanje — povratno napajanje regulatora dok je aktivno drugo napajanje može trajno oštetiti i uništiti kameru.

Savjet

Upotrijebite procjenitelj trajanja baterije za modeliranje koliko će dugo M4 raditi na bateriji za zadani omjer aktivnog rada / dubokog mirovanja.

Pinovi za oporavak i ispravljanje pogrešaka

  • RESET — spojite na GND za resetiranje ploče. Otpuštanjem se MCU pokreće normalno.

  • BOOT0 — spojite na 3,3 V tijekom napajanja ploče za ulazak u STM32 ROM bootloader (DFU način rada). OpenMV IDE koristi ovaj način za ponovno upisivanje bootloadera na ploči.

SWCLK i SWDIO izvedeni su kao obični pinovi priključka (ne kao namjenski SWD konektor). Spojite RESET, SWCLK, SWDIO, GND i 3,3 V na ST‑LINK ili SEGGER J‑Link adapter za ispravljanje pogrešaka na ploči.

Periferije na ploči

LED-ovi

M4 ima jedan korisnički RGB LED te par snažnih 850 nm IR LED-ova:

  • Korisnički RGB LED — softverski upravljiv, izložen kao LED_RED, LED_GREEN i LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • IR LED-ovi — oba LED-a upravljaju se zajedno kroz pin LED_IR. LED_IR je u hardveru spojen aktivan na visoko, dok ugrađeni program svaki drugi LED na ploči tretira kao aktivan na nisko, pa koristite low() / high() umjesto on() / off() (koji bi obrnuli logiku):

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

Senzor kamere

Priloženi senzor (OV7725 na standardnim pločama, OV2640 na vrlo ranim varijantama) upravlja se kroz modul csi — senzori kamere

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 zalemljen na ploču — nije na zamjenjivom modulu.

Napomena

Na pločama s OV7725 pin senzora FSIN (sinkronizacija sličice) spojen je na MCU, ali podrška u ugrađenom programu za njega nije dodana.

Na pločama s OV2640 pinovi senzora STROBE, FREX (ekspozicija sličice) i EXPST (resetiranje ekspozicije) spojeni su na MCU, ali podrška u ugrađenom programu za njih nije dodana.

Priključci za servo motore

Stražnja strana ploče ima dva leme za servo konektor koja izvode standardni 3‑pinski servo priključak (signal / VIN / GND) za P7 i P8. Signalni pinovi izravno se preslikavaju na kanale 1 i 2 TIM4 (iste kanale koje koristi pyb.Servo), a V+ pin na svakom priključku spojen je izravno na VIN, pa servo motori vuku struju iz ulazne linije, a ne iz regulatora od 3,3 V.

Zalemite par 3‑pinskih priključaka pod pravim kutom u leme i spojite dva hobi servo motora za pogon nosača za zakretanje i naginjanje:

from pyb import Servo

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

microSD kartica

Kada je kartica umetnuta, automatski se montira na /sdcard i može se koristiti kroz uobičajeni datotečni sustav:

import os

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

Referenca sabirnica

GPIO

Upotrijebite machine.Pin za čitanje ili upravljanje bilo kojim od pinova označenih na ploči. Izlazi su 3,3 V CMOS, podnose 5 V na ulaznoj strani i mogu uvlačiti/dovoditi do 25 mA po pinu (ukupno 120 mA na cijelom priključku).

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

Bilo koji ulazni pin može također pokrenuti prekid pri prijelazima ruba:

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

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

UART

Sabirnica

TX

RX

UART3

P4

P5

from machine import UART

uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

Sabirnica

SCL

SDA

I2C2

P4

P5

from machine import I2C

i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

Isti hardver može se koristiti i u ciljnom (slave) načinu rada kroz machine.I2CTarget za izlaganje memorijskog područja drugom I²C kontroleru:

from machine import I2CTarget

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

SPI

Sabirnica

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

Sabirnica

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

P6 je jedini korisnički analogni pin. Može se koristiti ili kao 12‑bitni ADC ulaz ili kao DAC izlaz.

  • ADC — puni raspon pri 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 — kroz pyb.DAC. 8‑bitna vrijednost pokriva 0–3,3 V:

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

U ADC ili DAC načinu rada P6 podnosi samo 3,3 V — nemojte mu dovoditi 5 V.

PWM

Pin

Mjerač vremena / kanal

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Napomena

TIM1 je rezerviran od strane ugrađenog programa za generiranje takta piksela senzora kamere, pa se TIM1 kanali koji su fizički na P0/P1/P2 ne mogu koristiti za korisnički PWM bez ometanja kamere.

TIM4 se dijeli s pyb.Servo — instanciranje servo motora ponovno konfigurira cijeli mjerač vremena za rad na 50 Hz, pa nemojte miješati machine.PWM na P7/P8 s pyb.Servo u istoj skripti.

Upravljajte bilo kojim od njih putem machine.PWM

from machine import Pin, PWM

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

Softverski bit‑bang sabirnice

machine.SoftI2C i machine.SoftSPI rade na bilo kojem GPIO-u ako vam je potrebna dodatna sabirnica.

Termalni senzor (izvan ploče)

Ugrađeni program uključuje upravljački program fir — upravljački program termalnog senzora (fir == daleko infracrveno) za vanjski spojene termalne snimače:

  • MLX90621 — IR niz 16 × 4

  • MLX90640 — IR niz 32 × 24

  • MLX90641 — IR niz 16 × 12

  • AMG8833 — IR niz 8 × 8

Spojite modul na I²C sabirnicu ploče i čitajte sličice pomoću 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())

Upravljački program fir komunicira sa senzorom samo preko I²C 2 — spojite modul na P4 (SCL) i P5 (SDA).

Vremenske operacije

time

Modul time pokriva blokirajuća kašnjenja, monotone takte i mjerenje proteklog vremena:

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)

Virtualni mjerači vremena

machine.Timer zakazuje periodične ili jednokratne povratne pozive bez trošenja utora hardverskog mjerača vremena. Proslijedite -1 kao id za korištenje virtualnog (softverskog) mjerača vremena:

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

Vrijednosti perioda su u milisekundama. Pozovite deinit() za zaustavljanje i oslobađanje utora.

Sat stvarnog vremena

machine.RTC čuva vrijeme prema zidnom satu kroz resetiranja:

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 resetira ploču ako se aplikacija zaglavi. Nakon pokretanja ne može se zaustaviti niti ponovno konfigurirati — periodično ga hranite unutar glavne petlje:

from machine import WDT

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

Informacije o pokretanju i izvođenju

Prozor USB bootloadera

Pri svakom uključivanju kamera pokreće kratak bootloader (nekoliko sekundi) koji omogućuje OpenMV IDE-u ažuriranje ugrađenog programa bez potrebe da korisnik ulazi u DFU način rada. Nakon isteka prozora bootloader predaje upravljanje datoteci boot.py pa zatim main.py.

Pokrenuta skripta može na zahtjev ponovno ući u bootloader pozivom machine.bootloader()

import machine

machine.bootloader()

Datotečni sustav i redoslijed pokretanja

Ugrađeni program M4 pri pokretanju montira do tri datotečna sustava:

  • Unutarnja flash memorija — uvijek montirana na /flash. Prema zadanom sadrži main.py i README.txt; stvara se pri prvom pokretanju.

  • microSD kartica — ako je kartica umetnuta, montira se na /sdcard.

  • ROMFS — datotečni sustav samo za čitanje, memorijski mapiran, na /rom, koji se koristi za isporuku velikih podatkovnih resursa (npr. AI modela) koji imaju koristi od pristupa bez kopiranja. MicroPython ga montira automatski pri pokretanju, prije nego što se pokrene bilo koji korisnički Python.

Nakon montiranja, radni direktorij postavlja se na /sdcard kada je kartica prisutna, inače na /flash. Interpreter zatim pokreće skripte iz tog direktorija:

  • boot.py se izvršava pri svakom mekom resetiranju (hladno pokretanje, Ctrl‑D iz REPL-a ili kad god pokrenuta skripta završi).

  • main.py se izvršava samo pri hladnom pokretanju, neposredno nakon boot.py. Naknadna meka resetiranja ponovno pokreću boot.py, ali prelaze izravno na REPL — za ponovno pokretanje main.py morate potpuno resetirati ploču.

Stavljanje datoteke boot.py ili main.py na SD karticu nadjačava kopiju u flash memoriji bez njezine izmjene — obje se datoteke traže u direktoriju za pokretanje (/sdcard kada je kartica montirana, inače /flash).

Zadani main.py isporučen na svježe upisanoj ploči samo treperi plavim kanalom korisničkog RGB LED-a kao otkucaj srca (dva kratka impulsa, kratka stanka), tako da možete raspoznati da se ugrađeni program uredno pokrenuo bez ikakvog povezanog domaćina.

sys.path je proširen tako da uključuje sva tri datotečna sustava i njihove poddirektorije lib/, pa moduli koji se mogu uvoziti mogu biti u /flash/lib, /sdcard/lib ili /rom/lib.

Da biste prisilili sustav da zanemari umetnutu SD karticu (na primjer da pokrenete main.py iz flash memorije čak i kada je kartica prisutna), stvorite praznu datoteku naziva SKIPSD u korijenu /flash.

Kada je povezan preko USB-a, datotečni sustav za pokretanje (/sdcard ako je kartica prisutna, inače /flash) također se na domaćinu prikazuje kao USB uređaj za masovnu pohranu, što vam omogućuje izravno uređivanje boot.py, main.py i bilo kojih drugih datoteka. Izbacite pogon prije resetiranja kamere kako bi domaćin ispraznio svoje predmemorirane zapise.

Napomena

Budući da OS tretira pogon kao pasivni blok uređaj, datoteke koje stvori ili izmijeni kod koji se izvodi na OpenMV Cam neće se pojaviti dok domaćin ponovno ne montira pogon. Ako i OS i OpenMV Cam istovremeno pišu u isti datotečni sustav, OS će pobijediti i prepisati promjene koje je napravila kamera. Za sve podatke koje skripta zapisuje koristite SD karticu i ponovno je montirajte prije čitanja tih datoteka s domaćina.

Napomena

Crveni kanal korisničkog RGB LED-a može se nakratko upaliti dok domaćin čita s USB uređaja za masovnu pohranu ili piše na njega — to je indikator aktivnosti pokretan ugrađenim programom, a ne kvar.

Veličine pohrane

M4 se isporučuje s:

  • /flash32 KB FAT datotečni sustav, čitanje/pisanje.

  • /rom128 KB memorijski mapiran ROMFS samo za čitanje.

  • /sdcard — puna veličina umetnute microSD kartice (kada je prisutna), čitanje/pisanje.

Indikator kritične pogreške (hard fault)

Ako korisnički RGB LED brzo izmjenjuje sve boje — dovoljno brzo da obično izgleda kao treptavi bijeli LED umjesto zasebnih nijansi — ugrađeni program naišao je na nepopravljivu kritičnu pogrešku (hard fault). Ponovno upišite ugrađeni program za oporavak; ako ponovno upisivanje ne pomogne, ploča je možda fizički oštećena.

Softverske biblioteke

Pogledajte indeks biblioteka za potpuni popis modula — uključujući one koji su jedinstveni za M4 build.