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.
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¶
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_GREENiLED_BLUEfrom 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_IRje u hardveru spojen aktivan na visoko, dok ugrađeni program svaki drugi LED na ploči tretira kao aktivan na nisko, pa koristitelow()/high()umjestoon()/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žimain.pyiREADME.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.pyse izvršava pri svakom mekom resetiranju (hladno pokretanje,Ctrl‑Diz REPL-a ili kad god pokrenuta skripta završi).main.pyse izvršava samo pri hladnom pokretanju, neposredno nakonboot.py. Naknadna meka resetiranja ponovno pokrećuboot.py, ali prelaze izravno na REPL — za ponovno pokretanjemain.pymorate 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:
/flash— 32 KB FAT datotečni sustav, čitanje/pisanje./rom— 128 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.