OpenMV Cam M4

OpenMV Cam M4 on kompakti Cortex‑M4‑pohjainen konenäkölevy, joka on rakennettu STMicroelectronicsin STM32F427‑piirin ympärille (180 MHz, 256 KB sisäistä SRAM‑muistia ja 1 MB sisäistä flash-muistia). Mukana toimitettava OV7725-sensori ottaa 320×240 harmaasävy- tai RGB565-kehyksiä, ja 9‑nastainen käyttäjäliitin tuo esiin UART-, I²C-, SPI-, CAN-, ADC/DAC- ja PWM-oheislaitteet.

Muista

OV7725 oli vakiosensori tuotantovaiheen M4-levyissä. Hyvin varhaisissa M4-versioissa toimitettiin sen sijaan OmniVision OV2640 — sama QVGA-esikatseluputki, mutta OV2640 voi lisäksi ottaa jopa UXGA‑tarkkuuksisia (1600×1200) JPEG-kehyksiä. Molempia sensoreita ohjataan saman csi — kennot-rajapinnan kautta.

OpenMV Cam M4

Täydellinen tietolomake, valokuvat ja mitat löytyvät OpenMV Cam M4 -tuotesivulta.

Kohokohdat

  • STMicroelectronics STM32F427 Cortex‑M4, 180 MHz.

  • 256 KB sisäistä SRAM-muistia — ei ulkoista SDRAM-muistia.

  • 1 MB sisäistä flash-muistia (ei ulkoista QSPI flash-muistia).

  • OV7725-sensori (tai OV2640 hyvin varhaisissa M4-versioissa) — 320×240 8‑bittinen harmaasävy tai RGB565; OV2640 voi lisäksi ottaa jopa UXGA‑tarkkuuksisia (1600×1200) JPEG-kuvia.

  • Full‑speed USB (12 Mb/s) — näkyy isäntäkoneelle VCP- ja USB-massamuistilaitteena.

  • microSD-paikka — SD jopa 2 GB, SDHC jopa 32 GB, SDXC jopa 2 TB.

  • 9 I/O-nastaa, 5 V:n sietoiset 3,3 V:n lähdöllä, 25 mA nastaa kohti (yhteensä 120 mA koko liittimessä), keskeytyskykyiset. P6 ei ole 5 V:n sietoinen, kun sitä käytetään ADC- tai DAC-tilassa.

  • Käyttäjän RGB-LED ja kaksi suuritehoista 850 nm:n IR-LEDiä aktiiviseen valaisuun hämärässä konenäössä.

Muista

M4:ssä ei ole sisäänrakennettua virranhallintapiiriä: siinä ei ole akkuliitintä, akkulaturia, akkujännitteen ADC:tä, lataus- tai virtatilan LEDejä eikä laitteistollista virtapainiketta. Syötä levylle virtaa USB:n tai VIN:n kautta.

Nastajärjestys

OpenMV Cam M4 OV7725 -nastajärjestys

Nastaviite

Nastan nimi

Toiminto

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

vedä GND:hen nollataksesi levyn

BOOT0

vedä 3,3 V:hen käynnistyksen yhteydessä DFU- / ROM-käynnistyslatainta varten

SWCLK

ARM SWD -kello (vianetsijän pääsy)

SWDIO

ARM SWD -data (vianetsijän pääsy)

LED_RED

RGB-LEDin punainen kanava (aktiivinen matalalla)

LED_GREEN

RGB-LEDin vihreä kanava (aktiivinen matalalla)

LED_BLUE

RGB-LEDin sininen kanava (aktiivinen matalalla)

LED_IR

suuritehoiset IR-LEDit (molempia kanavia ohjataan yhdessä)

Virtanastat

  • 3.3V — säädelty 3,3 V:n kisko. Jopa 250 mA käytettävissä lisälaitteille (vähemmän, jos microSD-kortti on käytössä). Toisin kuin uudemmissa kameroissa, tämä nasta on kaksisuuntainen — katso alla oleva varoitus.

  • VIN — 3,6–5 V:n tulo. Syöttää levylle virtaa sisäisen säätimen kautta.

  • GND — yhteinen maa.

Muista

Kun sekä USB että VIN ovat läsnä, kumpi tahansa, jolla on korkeampi jännite, syöttää levylle virtaa — sisäiset diodit valitsevat yksinkertaisesti vahvemman kiskon.

Varoitus

Voit halutessasi syöttää M4:lle virtaa johtamalla 3,3 V suoraan 3.3V-nastaan, jos et halua käyttää sisäistä säädintä. Siinä tapauksessa älä myöskään syötä VIN- tai USB-virtaa samanaikaisesti — säätimen takaa syöttäminen toisen virtalähteen ollessa aktiivinen voi vaurioittaa ja tuhota kameran pysyvästi.

Vihje

Käytä akun keston arvioijaa mallintaaksesi, kuinka kauan M4 toimii akulla tietyllä aktiivisuuden ja syväunen käyttöjaksolla.

Palautus- ja vianetsintänastat

  • RESET — vedä GND:hen nollataksesi levyn. Sen vapauttaminen antaa MCU:n käynnistyä normaalisti.

  • BOOT0 — vedä 3,3 V:hen samalla kun syötät levylle virtaa siirtyäksesi STM32:n ROM-käynnistyslataimeen (DFU-tila). OpenMV IDE käyttää tätä tilaa sisäisen käynnistyslataimen uudelleenflashaamiseen.

SWCLK ja SWDIO on tuotu esiin tavallisina liitinnastoina (ei erillistä SWD-liitintä). Kytke RESET, SWCLK, SWDIO, GND ja 3,3 V ST‑LINK- tai SEGGER J‑Link -sovittimeen levyn vianetsintää varten.

Sisäänrakennetut oheislaitteet

LEDit

M4:ssä on yksi käyttäjän RGB-LED sekä pari suuritehoista 850 nm:n IR-LEDiä:

  • Käyttäjän RGB-LED — ohjelmistolla ohjattava, tuotu esiin nimillä LED_RED, LED_GREEN ja LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • IR-LEDit — molempia LEDejä ohjataan yhdessä LED_IR-nastan kautta. LED_IR on kytketty laitteistossa aktiiviseksi korkealla, kun taas laiteohjelmisto käsittelee kaikkia muita sisäisiä LEDejä aktiivisina matalalla, joten käytä menetelmiä low() / high() mieluummin kuin on() / off() (jotka kääntäisivät merkityksen):

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

Kamerasensori

Mukana toimitettavaa sensoria (OV7725 vakiolevyissä, OV2640 hyvin varhaisissa versioissa) ohjataan csi — kennot-moduulin kautta:

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

Sensori on juotettu kiinni levyyn M4:ssä — se ei ole vaihdettavassa moduulissa.

Muista

OV7725-levyissä sensorin FSIN (kehystahdistus) -nasta on kytketty MCU:hun, mutta sille ei ole lisätty laiteohjelmiston tukea.

OV2640-levyissä sensorin STROBE-, FREX (kehyksen valotus) - ja EXPST (valotuksen nollaus) -nastat on kytketty MCU:hun, mutta niille ei ole lisätty laiteohjelmiston tukea.

Servoliittimet

Levyn taustapuolella on kaksi servoliittimen juotostyynyä, jotka tuovat esiin tavanomaisen 3‑nastaisen servoliittimen (signaali / VIN / GND) nastoille P7 ja P8. Signaalinastat kytkeytyvät suoraan TIM4:n kanaviin 1 ja 2 (samat kanavat, joita pyb.Servo käyttää), ja kunkin liittimen V+-nasta on kytketty suoraan VIN:iin, joten servot ottavat virtansa tulokiskosta eivätkä 3,3 V:n säätimestä.

Juota pari kulmaista 3‑nastaista liitintä tyynyihin ja kytke kaksi harrastusservoa pan‑and‑tilt‑telineen ohjaamiseksi:

from pyb import Servo

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

microSD-kortti

Kun kortti asetetaan paikalleen, se liitetään automaattisesti kohtaan /sdcard ja sitä voi käyttää tavallisen tiedostojärjestelmän kautta:

import os

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

Väyläviite

GPIO

Käytä machine.Pin lukeaksesi tai ohjataksesi mitä tahansa silkkipainettua nastaa. Lähdöt ovat 3,3 V CMOS, 5 V:n sietoiset tulopuolella, ja voivat upottaa/lähettää jopa 25 mA nastaa kohti (yhteensä 120 mA koko liittimessä).

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

Mikä tahansa tulonasta voi myös laukaista keskeytyksen reunatransitioissa:

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

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

UART

Väylä

TX

RX

UART3

P4

P5

from machine import UART

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

I²C

Väylä

SCL

SDA

I2C2

P4

P5

from machine import I2C

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

Samaa laitteistoa voi käyttää myös kohdetilassa (slave) machine.I2CTarget -rajapinnan kautta tuodaksesi muistialueen toisen I²C-ohjaimen käyttöön:

from machine import I2CTarget

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

SPI

Väylä

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

Väylä

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

P6 on ainoa käyttäjän analoginen nasta. Sitä voi käyttää joko 12‑bittisenä ADC-tulona tai DAC-lähtönä.

  • ADC — täysi asteikko 3,3 V:ssa nastassa:

    from machine import ADC
    import time
    
    adc = ADC("P6")
    while True:
        voltage = adc.read_u16() * 3.3 / 65535
        print(voltage)
        time.sleep_ms(100)
    
  • DACpyb.DAC -luokan kautta. 8‑bittinen arvo kattaa 0–3,3 V:

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

ADC- tai DAC-tilassa P6 on vain 3,3 V:n sietoinen — älä syötä siihen 5 V:tä.

PWM

Nasta

Ajastin / kanava

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Muista

TIM1 on varattu laiteohjelmiston käyttöön kamerasensorin pikselikellon tuottamiseen, joten TIM1:n kanavia, jotka ovat fyysisesti nastoissa P0/P1/P2, ei voi käyttää käyttäjän PWM:ään rikkomatta kameraa.

TIM4 on jaettu pyb.Servo -luokan kanssa — servon luominen konfiguroi koko ajastimen uudelleen 50 Hz:n toimintaan, joten älä sekoita machine.PWM -käyttöä nastoissa P7/P8 pyb.Servo -luokan kanssa samassa skriptissä.

Ohjaa mitä tahansa niistä machine.PWM -luokan kautta:

from machine import Pin, PWM

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

Ohjelmistolla bittipuksutetut väylät

machine.SoftI2C ja machine.SoftSPI toimivat millä tahansa GPIO:lla, jos tarvitset ylimääräisen väylän.

Lämpösensori (levyn ulkopuolella)

Laiteohjelmisto sisältää fir — lämpösensorin ajuri (fir == far infrared) -ajurin ulkoisesti kytketyille lämpökameroille:

  • MLX90621 — 16 × 4 IR-matriisi

  • MLX90640 — 32 × 24 IR-matriisi

  • MLX90641 — 16 × 12 IR-matriisi

  • AMG8833 — 8 × 8 IR-matriisi

Kytke moduuli levyn I²C-väylään ja lue kehyksiä komennoilla 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-ajuri kommunikoi sensorin kanssa vain I²C 2 -väylän kautta — kytke moduuli nastoihin P4 (SCL) ja P5 (SDA).

Ajoitus

time

time -moduuli kattaa estävät viiveet, monotoniset tikit ja kuluneen ajan mittauksen:

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)

Virtuaaliset ajastimet

machine.Timer ajoittaa jaksoittaisia tai kertaluonteisia takaisinkutsuja kuluttamatta laitteistoajastimen paikkaa. Anna -1 id:nä käyttääksesi virtuaalista (ohjelmistollista) ajastinta:

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

Jaksoarvot ovat millisekunteina. Kutsu deinit() pysäyttääksesi ajastimen ja vapauttaaksesi paikan.

Reaaliaikakello

machine.RTC pitää yllä seinäkelloaikaa nollausten yli:

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

Vahtikoira

machine.WDT nollaa levyn, jos sovellus jumiutuu. Kun se on käynnistetty, sitä ei voi pysäyttää tai konfiguroida uudelleen — syötä sitä jaksoittain pääsilmukassasi:

from machine import WDT

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

Käynnistys- ja ajonaikainen tieto

USB-käynnistyslataimen aikaikkuna

Jokaisen käynnistyksen yhteydessä kamera ajaa lyhyen käynnistyslataimen (muutaman sekunnin), joka antaa OpenMV IDE:n päivittää laiteohjelmiston ilman, että käyttäjän tarvitsee siirtyä DFU-tilaan. Aikaikkunan päätyttyä käynnistyslatain luovuttaa hallinnan tiedostolle boot.py ja sitten tiedostolle main.py.

Ajossa oleva skripti voi siirtyä uudelleen käynnistyslataimeen pyydettäessä kutsumalla machine.bootloader()

import machine

machine.bootloader()

Tiedostojärjestelmä ja käynnistysjärjestys

M4:n laiteohjelmisto liittää käynnistyksen yhteydessä jopa kolme tiedostojärjestelmää:

  • Sisäinen flash-muisti — aina liitettynä kohtaan /flash. Sisältää oletuksena tiedostot main.py ja README.txt; luodaan aivan ensimmäisellä käynnistyksellä.

  • microSD-kortti — jos kortti on asetettu paikalleen, se liitetään kohtaan /sdcard.

  • ROMFS — vain luku, muistiin kartoitettu tiedostojärjestelmä kohdassa /rom, jota käytetään suurten data-aineistojen (esim. tekoälymallien) toimittamiseen, jotka hyötyvät nollakopiointipääsystä. MicroPython liittää sen automaattisesti käynnistyksen yhteydessä, ennen kuin mitään käyttäjän Python-koodia ajetaan.

Liittämisen jälkeen työhakemistoksi asetetaan /sdcard, kun kortti on paikallaan, muuten /flash. Tulkki ajaa tämän jälkeen skriptit kyseisestä hakemistosta:

  • boot.py suoritetaan jokaisen pehmeän nollauksen yhteydessä (kylmäkäynnistys, Ctrl‑D REPL:stä tai aina kun ajossa oleva skripti palaa).

  • main.py suoritetaan vain kylmäkäynnistyksellä, heti tiedoston boot.py jälkeen. Seuraavat pehmeät nollaukset ajavat tiedoston boot.py uudelleen, mutta siirtyvät suoraan REPL:iin — ajaaksesi tiedoston main.py uudelleen sinun on nollattava levy täysin.

Tiedoston boot.py tai main.py pudottaminen SD-kortille ohittaa flash-muistissa olevan kopion koskematta siihen — molempia tiedostoja etsitään käynnistyshakemistosta (/sdcard kun kortti on liitettynä, muuten /flash).

Tuoreesti flashatulla levyllä toimitettu oletustiedosto main.py vain vilkuttaa käyttäjän RGB-LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), jotta voit kertoa laiteohjelmiston käynnistyneen puhtaasti ilman mitään isäntää kytkettynä.

sys.path -muuttujaa laajennetaan sisältämään kaikki kolme tiedostojärjestelmää ja niiden lib/-alihakemistot, joten tuotavat moduulit voivat sijaita kohteissa /flash/lib, /sdcard/lib tai /rom/lib.

Pakottaaksesi järjestelmän ohittamaan asetetun SD-kortin (esimerkiksi ajaaksesi flash-muistin tiedoston main.py vaikka kortti olisi paikallaan), luo tyhjä tiedosto nimeltä SKIPSD kohteen /flash juureen.

USB:n kautta yhdistettäessä käynnistystiedostojärjestelmä (/sdcard jos kortti on paikallaan, muuten /flash) näkyy myös USB-massamuistiasemana isäntäkoneella, jolloin voit muokata tiedostoja boot.py, main.py ja mitä tahansa muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollaamista, jotta isäntä kirjoittaa välimuistissa olevat muutokset levylle.

Muista

Koska käyttöjärjestelmä käsittelee asemaa passiivisena lohkolaitteena, OpenMV Camilla ajettavan koodin luomat tai muokkaamat tiedostot eivät näy ennen kuin isäntä liittää aseman uudelleen. Jos sekä käyttöjärjestelmä että OpenMV Cam kirjoittavat samaa tiedostojärjestelmää samanaikaisesti, käyttöjärjestelmä voittaa ja korvaa kameran tekemät muutokset. Käytä SD-korttia kaikkeen dataan, jonka skripti kirjoittaa takaisin, ja liitä asema uudelleen ennen kuin luet näitä tiedostoja isännältä.

Muista

Käyttäjän RGB-LEDin punainen kanava voi syttyä hetkellisesti, kun isäntä lukee USB-massamuistiasemalta tai kirjoittaa sille — tämä on laiteohjelmiston ohjaama toiminnan ilmaisin, ei vika.

Tallennustilan koot

M4 toimitetaan seuraavin tallennustiloin:

  • /flash32 KB FAT-tiedostojärjestelmä, luku/kirjoitus.

  • /rom128 KB vain luku, muistiin kartoitettu ROMFS.

  • /sdcard — minkä tahansa asetetun microSD-kortin koko täysmäärä (kun paikallaan), luku/kirjoitus.

Hard fault -ilmaisin

Jos käyttäjän RGB-LED kiertää nopeasti kaikkien värien läpi — niin nopeasti, että se näyttää yleensä tuikkivalta valkoiselta LEDiltä erottuvien sävyjen sijaan — laiteohjelmisto on kohdannut palautumattoman hard faultin. Flashaa laiteohjelmisto uudelleen palautuaksesi; jos uudelleenflashaaminen ei auta, levy voi olla fyysisesti vaurioitunut.

Ohjelmistokirjastot

Katso kirjastohakemistosta täydellinen luettelo moduuleista — mukaan lukien ne, jotka ovat ainutlaatuisia M4-koonnokselle.