OpenMV Cam M7

OpenMV Cam M7 on Cortex‑M7‑pohjainen konenäkökortti, joka rakentuu STMicroelectronicsin STM32F765‑piirin ympärille 216 MHz:n kellotaajuudella, 512 KB:n sisäisellä SRAM‑muistilla ja 2 MB:n sisäisellä flash‑muistilla. Mukana toimitettava OV7725‑sensori kaappaa 640×480 harmaasävy‑ tai 320×240 RGB565‑kehyksiä jopa 150 FPS:n nopeudella, ja 10‑nastainen käyttäjäliitin tarjoaa UART‑, I²C‑, SPI‑, CAN‑, ADC/DAC‑ ja PWM‑oheislaitteet.

OpenMV Cam M7

Täydellinen datalehti, valokuvat ja mitat löytyvät OpenMV Cam M7 ‑tuotesivulta.

Kohokohdat

  • STMicroelectronics STM32F765 Cortex‑M7 216 MHz:llä.

  • 512 KB sisäistä SRAM‑muistia — ei ulkoista SDRAM‑muistia.

  • 2 MB sisäistä flash‑muistia (ei ulkoista QSPI‑flash‑muistia).

  • OV7725‑sensori — 640×480 harmaasävy tai 320×240 RGB565 jopa 150 FPS:n nopeudella.

  • Full‑speed USB (12 Mb/s) — näkyy isäntäkoneelle VCP:nä + USB‑massamuistina.

  • microSD‑liitin — SD jopa 2 GB, SDHC jopa 32 GB, SDXC jopa 2 TB.

  • 10 I/O‑nastaa, 5 V:n sietokyky 3,3 V:n lähdöllä, 25 mA per nasta (yhteensä 120 mA koko liittimen yli), keskeytyskykyiset. P6 ei siedä 5 V:ta ADC‑ tai DAC‑tilassa käytettäessä.

  • Käyttäjän RGB‑LED ja kaksi tehokasta 850 nm:n IR‑LEDiä aktiiviseen valaistukseen heikossa valossa.

Muista

M7:ssä ei ole emolevyn virranhallintapiiriä: siinä ei ole akkuliitintä, akkulaturia, akkujännitteen ADC:ta, lataus‑/virtatila‑LEDejä eikä laitteistopohjaista virtapainiketta. Syötä kortille virta USB:n tai VIN:n kautta.

Nastajärjestys

OpenMV Cam M7 OV7725 ‑nastajärjestys

Nastaviite

Nastan nimi

Toiminto

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

kytke GND:hen kortin nollaamiseksi

SYN

kehyssynkronointinasta — johdotettu vain kamerasensoriin

BOOT0

kytke 3,3 V:iin virrankytkennän yhteydessä DFU‑/ROM‑käynnistyslataimen käyttöä varten

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

tehokkaat IR‑LEDit (molemmat kanavat ohjataan yhdessä)

Muista

Liittimen SYN‑nasta on kytketty suoraan kamerasensorin liipaisin‑/valotuslinjaan — se ei reititä MCU:lle M7:ssä. Ohjaa tai lue sitä ulkoisesti; et voi vaihtaa sen tilaa MicroPythonista.

Virtanastat

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

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

  • GND — yhteinen maa.

Muista

Kun sekä USB että VIN ovat läsnä, kortille syöttää virtaa se, jolla on korkeampi jännite — emolevyn diodit valitsevat yksinkertaisesti vahvemman kiskon.

Varoitus

Voit halutessasi syöttää M7:lle virtaa antamalla 3,3 V suoraan 3.3V‑nastaan, jos et halua kulkea emolevyn säätimen kautta. Siinä tapauksessa älä syötä samanaikaisesti myös VIN‑ tai USB‑virtaa — säätimen takaisinajaminen toisen virtalähteen ollessa aktiivinen voi vahingoittaa kameraa pysyvästi ja tuhota sen.

Vihje

Käytä akun keston arviointityökalua mallintaaksesi, kuinka kauan M7 toimii akulla tietyllä aktiivisen / syväunitilan käyttösuhteella.

Palautus‑ ja virheenkorjausnastat

  • RESET — kytke GND:hen kortin nollaamiseksi. Sen vapauttaminen antaa MCU:n käynnistyä normaalisti.

  • BOOT0 — kytke 3,3 V:iin kortille virtaa syötettäessä siirtyäksesi STM32 ROM‑käynnistyslataimeen (DFU‑tila). OpenMV IDE käyttää tätä tilaa emolevyn käynnistyslataimen uudelleenflashaukseen.

Kortti tarjoaa SWD‑virheenkorjausliittimen (RST / SWCLK / SWDIO) GPIO‑liittimen vieressä, yhteensopiva ST‑LINK‑ ja SEGGER J‑Link ‑sovittimien kanssa.

Emolevyn oheislaitteet

LEDit

M7:ssä on yksi käyttäjän RGB‑LED sekä pari tehokasta 850 nm:n IR‑LEDiä:

  • Käyttäjän RGB‑LED — ohjelmistolla ohjattava, tarjolla 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 — molemmat LEDit ohjataan yhdessä LED_IR‑nastan kautta. LED_IR on johdotettu laitteistossa aktiivinen korkealla, kun taas laiteohjelmisto käsittelee jokaista muuta emolevyn LEDiä aktiivisena matalalla, joten käytä low() / high() ‑metodeja eikä on() / off() ‑metodeja (jotka kääntäisivät logiikan):

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

Kamerasensori

OV7725:tä 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 kortille M7:ssä — se ei ole vaihdettavassa moduulissa.

microSD‑kortti

Kun kortti on asetettu, se liitetään automaattisesti polkuun /sdcard ja on käytettävissä tavallisen tiedostojärjestelmän kautta:

import os

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

Väyläviite

GPIO

Käytä machine.Pin ‑luokkaa minkä tahansa silkkipainetun nastan lukemiseen tai ohjaamiseen. Lähdöt ovat 3,3 V CMOS, 5 V:ta sietäviä tulopuolella ja voivat nieluttaa/syöttää jopa 25 mA per nasta (yhteensä 120 mA koko liittimen yli).

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 reunasiirtymissä:

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

UART1

P1

P0

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

I2C4

P7

P8

from machine import I2C

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

Samaa laitteistoa voi käyttää myös kohde‑ (orja) tilassa machine.I2CTarget ‑luokan kautta paljastaakseen muistialueen toiselle I²C‑ohjaimelle:

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:ssä nastalla:

    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 sietää vain 3,3 V:ta — älä syötä siihen 5 V:ta.

PWM

Nasta

Ajastin / kanava

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM4 CH3

Muista

TIM1 on laiteohjelmiston varaama kamerasensorin pikselikellon tuottamiseen, joten P0/P1/P2‑nastoilla fyysisesti olevia TIM1‑kanavia 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öä P7/P8/P9‑nastoilla ja pyb.Servo ‑luokkaa 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 bittikolkutellut väylät

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

Lämpösensori (kortin ulkopuolinen)

Laiteohjelmisto sisältää fir — lämpösensorin ajuri (fir == far infrared) ‑ajurin ulkoisesti johdotetuille lämpökuvantajille:

  • MLX90621 — 16 × 4 IR‑matriisi

  • MLX90640 — 32 × 24 IR‑matriisi

  • MLX90641 — 16 × 12 IR‑matriisi

  • AMG8833 — 8 × 8 IR‑matriisi

Johdota moduuli kortin 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 — johdota moduuli nastoihin P4 (SCL) ja P5 (SDA).

Ajoitus

time

time ‑moduuli kattaa estävät viiveet, monotoniset tikitykset 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)

Virtuaaliajastimet

machine.Timer ajastaa jaksottaisia tai kertaluonteisia takaisinkutsuja kuluttamatta laitteistoajastimen paikkaa. Anna -1 id:nä käyttääksesi virtuaalista (ohjelmisto) 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 ja vapauttaaksesi paikan.

Reaaliaikakello

machine.RTC säilyttää seinäkellon ajan 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 kortin, jos sovellus jumiutuu. Kun se on käynnistetty, sitä ei voi pysäyttää tai konfiguroida uudelleen — syötä sitä säännöllisesti pääsilmukkasi sisällä:

from machine import WDT

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

Käynnistys‑ ja ajonaikatiedot

USB‑käynnistyslataimen ikkuna

Jokaisen virrankytkennän yhteydessä kamera suorittaa lyhyen käynnistyslataimen (muutaman sekunnin), jonka avulla OpenMV IDE voi päivittää laiteohjelmiston ilman, että käyttäjän tarvitsee siirtyä DFU‑tilaan. Ikkunan umpeuduttua käynnistyslatain luovuttaa ohjauksen boot.py:lle ja sen jälkeen main.py:lle.

Käynnissä oleva skripti voi siirtyä takaisin käynnistyslataimeen pyynnöstä kutsumalla machine.bootloader()

import machine

machine.bootloader()

Tiedostojärjestelmä ja käynnistysjärjestys

M7:n laiteohjelmisto liittää käynnistyksessä jopa kolme tiedostojärjestelmää:

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

  • microSD‑kortti — jos kortti on asetettu, se liitetään polkuun /sdcard.

  • ROMFS — vain luku ‑muistiin kartoitettu tiedostojärjestelmä polussa /rom, jota käytetään suurten data‑aineistojen (esim. tekoälymallien) toimittamiseen, jotka hyötyvät nollakopiointikäytöstä. MicroPython liittää sen automaattisesti käynnistyksessä, ennen kuin yhtään käyttäjän Python‑koodia ajetaan.

Liittämisen jälkeen työhakemistoksi asetetaan /sdcard, kun kortti on läsnä, muuten /flash. Tulkki suorittaa sen jälkeen skriptejä kyseisestä hakemistosta:

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

  • main.py suoritetaan vain kylmäkäynnistyksessä, heti boot.py:n jälkeen. Seuraavat pehmeät nollaukset ajavat boot.py:n uudelleen mutta siirtyvät suoraan REPL:iin — ajaaksesi main.py:n uudelleen sinun on nollattava kortti kokonaan.

boot.py‑ tai main.py‑tiedoston pudottaminen SD‑kortille ohittaa flash‑muistissa olevan kopion koskematta siihen — molemmat tiedostot haetaan käynnistyshakemistosta (/sdcard, kun kortti on liitetty, muuten /flash).

Tuoreelle flashatulle kortille toimitettava oletus‑main.py vain vilkuttaa käyttäjän RGB‑LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), joten voit todeta laiteohjelmiston käynnistyneen puhtaasti ilman isäntäkoneen liittämistä.

sys.path laajennetaan kattamaan kaikki kolme tiedostojärjestelmää ja niiden lib/ ‑alihakemistot, joten tuotavat moduulit voivat sijaita poluissa /flash/lib, /sdcard/lib tai /rom/lib.

Pakottaaksesi järjestelmän jättämään asetetun SD‑kortin huomiotta (esimerkiksi ajaaksesi flash‑muistin main.py:n vaikka kortti on läsnä), luo tyhjä tiedosto nimeltä SKIPSD /flash‑muistin juureen.

Kun kamera on yhdistetty USB:n kautta, käynnistystiedostojärjestelmä (/sdcard, jos kortti on läsnä, muuten /flash) luetteloidaan myös USB‑massamuistiasemana isäntäkoneella, jolloin voit muokata boot.py‑, main.py‑ ja muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollausta, jotta isäntäkone tyhjentää välimuistissa olevat kirjoitukset.

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äkone liittää aseman uudelleen. Jos sekä käyttöjärjestelmä että OpenMV Cam kirjoittavat samaan tiedostojärjestelmään samanaikaisesti, käyttöjärjestelmä voittaa ja ylikirjoittaa kameran tekemät muutokset. Käytä SD‑korttia kaikkeen dataan, jota skripti kirjoittaa takaisin, ja liitä uudelleen ennen kuin luet kyseisiä tiedostoja isäntäkoneelta.

Muista

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

Tallennustilan koot

M7 toimitetaan seuraavasti:

  • /flash96 KB FAT‑tiedostojärjestelmä, luku/kirjoitus.

  • /rom256 KB vain luku ‑muistiin kartoitettu ROMFS.

  • /sdcard — minkä tahansa asetetun microSD‑kortin täysi koko (kun läsnä), luku/kirjoitus.

Hard fault ‑ilmaisin

Jos käyttäjän RGB‑LED kiertää nopeasti läpi kaikki värit — niin nopeasti, että se yleensä näyttää tuikkivalta valkoiselta LEDiltä erillisten värisävyjen sijaan — laiteohjelmisto on kohdannut korjaamattoman hard fault ‑virheen. Flashaa laiteohjelmisto uudelleen palautuaksesi; jos uudelleenflashauksesta ei ole apua, kortti voi olla fyysisesti vaurioitunut.

Ohjelmistokirjastot

Katso kirjastoindeksistä täydellinen luettelo moduuleista — mukaan lukien ne, jotka ovat ainutlaatuisia M7‑käännökselle.