OpenMV Cam H7

OpenMV Cam H7 on Cortex-M7-pohjainen konenäkölevy, joka rakentuu STMicroelectronics STM32H743 -piirin ympärille 480 MHz:n taajuudella, 1 Mt:n sisäisellä SRAM:lla, 2 Mt:n sisäisellä flash-muistilla ja laitteistopohjaisella JPEG-koodekilla. Levystä on kaksi sensoriversiota — H7 sensorilla OV7725 ja H7 R2 sensorilla ON Semi MT9M114 — mutta laiteohjelmisto, nastajärjestys ja Python-API ovat identtiset.

OpenMV Cam H7

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

Kohokohdat

  • STMicroelectronics STM32H743 Cortex-M7 480 MHz:n taajuudella (1027 DMIPS).

  • Laitteistopohjainen JPEG-enkooderi/dekooderi.

  • 1 Mt sisäistä SRAM:ia — ei ulkoista SDRAM:ia.

  • 2 Mt sisäistä flash-muistia (ei ulkoista QSPI-flash-muistia).

  • OV7725-sensori (tai MT9M114 H7 R2 -versiossa).

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

  • microSD-paikka — SD enintään 2 Gt, SDHC enintään 32 Gt, SDXC enintään 2 Tt.

  • LiPo-akkuliitin (ei sisäänrakennettua laturia — käytä ladattua kennoa tai syötä virtaa VIN/USB:n kautta).

  • 10 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 valaistukseen heikossa valossa.

Muista

H7:ssä ei ole sisäänrakennettua virranhallintapiiriä: siinä ei ole akkulaturia, akkujännitteen ADC:tä, lataus- tai virtatilan LEDejä eikä laitteistopohjaista virtapainiketta. Liitä esiladattu LiPo akun JST-liittimeen tai syötä levylle virtaa USB:n / VIN:n kautta.

Nastajärjestys

OpenMV Cam H7 OV7725 -nastajärjestys

Nastaviite

Nastan nimi

Toiminto

P0

UART1 RX / SPI2 MOSI

P1

UART1 TX / SPI2 MISO

P2

SPI2 SCK / FDCAN2 TX

P3

SPI2 NSS (CS) / FDCAN2 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

vedä GND:hen nollataksesi levyn

SYN

kehyssynkronointinasta — kytketty vain kamerasensoriin

BOOT0

vedä 3,3 V:iin virrankytkennän yhteydessä DFU- / ROM-käynnistyslatainta 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

suuritehoiset IR-LEDit (molemmat kanavat ajetaan yhdessä)

Muista

Liittimen SYN-nasta on kytketty suoraan kamerasensorin laukaisu-/valotuslinjaan — se ei reititydy MCU:lle H7:ssä. Ohjaa tai lue sitä ulkoisesti; sitä ei voi vaihtaa MicroPythonista.

Virtanastat

  • 3.3V — säädelty 3,3 V:n linja. Käytettävissä enintään 250 mA 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ää virtaa levylle sisäänrakennetun säätimen kautta.

  • GND — yhteinen maa.

Levyssä on myös 3,7 V:n LiPo-liitin, mutta H7:ssä ei ole akkulaturia — liitä esiladattu kenno tai syötä virtaa VIN:n / USB:n kautta.

Muista

Kun sekä USB että VIN/LiPo ovat kytkettyinä, VIN/LiPo-tulo voittaa — sisäänrakennettu virtakytkin valitsee sen USB:n sijaan levyn virransyöttöön.

Varoitus

Akkuliitin ja VIN on kytketty yhteen H7:ssä. Älä kytke LiPoa ja syötä VIN-jännitettä samanaikaisesti — kaksi virtalähdettä taistelevat keskenään ja voivat vahingoittaa akkua, levyä tai molempia.

Varoitus

Voit halutessasi syöttää H7:lle virtaa johtamalla 3,3 V suoraan 3.3V-nastaan, jos et halua käyttää sisäänrakennettua säädintä. Siinä tapauksessa älä syötä myös VIN- tai USB-virtaa samanaikaisesti — 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 H7 toimii akulla tietyllä aktiivisen / syväunitilan käyttösuhteella.

Palautus- ja vianjäljitysnastat

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

  • BOOT0 — vedä 3,3 V:iin levyn virrankytkennän yhteydessä siirtyäksesi STM32 ROM-käynnistyslataimeen (DFU-tila). OpenMV IDE käyttää tätä tilaa sisäänrakennetun käynnistyslataimen uudelleenflashaukseen.

Levyssä on SWD-vianjäljitysliitin (RST / SWCLK / SWDIO) GPIO-liittimen vieressä, yhteensopiva ST-LINK- ja SEGGER J-Link -sovittimien kanssa.

Sisäänrakennetut oheislaitteet

LEDit

H7: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, esitetty 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 ajetaan yhdessä LED_IR-nastan kautta. LED_IR on kytketty laitteistossa aktiiviseksi korkealla, kun taas laiteohjelmisto käsittelee kaikkia muita sisäänrakennettuja LEDejä aktiivisina 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ä (tai MT9M114:ää H7 R2 -versiossa) 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 sijaitsee irrotettavassa moduulissa — vaihda se mihin tahansa muuhun OpenMV-kameramoduuliin (global shutter, lämpökamera, korkeampi resoluutio jne.) muuttamatta muuta levyä.

microSD-kortti

Kun kortti on asetettu, se liitetään automaattisesti polkuun /sdcard ja sitä voi käyttää tavanomaisen tiedostojärjestelmän kautta:

import os

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

Väyläviite

GPIO

Käytä machine.Pin -luokkaa lukeaksesi tai ohjataksesi mitä tahansa silkkipainettua nastaa. Lähdöt ovat 3,3 V:n CMOS-tasoa, 5 V:n sietoisia tulopuolella, ja voivat nieluttaa/syöttää enintään 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 reunasiirtymillä:

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 kohdetilassa (slave) machine.I2CTarget -luokan kautta, jolloin muistialue voidaan tuoda 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 (FDCAN)

Väylä

TX

RX

FDCAN2

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 alueen 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: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 fyysisesti nastoissa P0/P1/P2 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 -toimintoa nastoissa P7/P8/P9 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 bittiniputellut väylät

machine.SoftI2C ja machine.SoftSPI toimivat millä tahansa GPIO-nastalla, jos tarvitset lisäväylän.

Lämpösensori (levyn ulkopuolinen)

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 ajastaa jaksottaiset tai kertaluonteiset takaisinkutsut kuluttamatta laitteistopohjaisen ajastimen paikkaa. Anna -1 id:ksi käyttääksesi virtuaalista (ohjelmistopohjaista) 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 pitää yllä kellonaikaa 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ä säännöllisesti pääsilmukassasi:

from machine import WDT

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

Käynnistys- ja ajonaikaiset tiedot

USB-käynnistyslataimen ikkuna

Jokaisen virrankytkennän yhteydessä kamera ajaa lyhyen käynnistyslataimen (muutaman sekunnin), jonka avulla OpenMV IDE voi päivittää laiteohjelmiston ilman, että käyttäjän tarvitsee siirtyä DFU-tilaan. Ikkunan päätyttyä käynnistyslatain luovuttaa ohjauksen tiedostolle boot.py ja sitten tiedostolle main.py.

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

import machine

machine.bootloader()

Tiedostojärjestelmä ja käynnistysjärjestys

H7:n laiteohjelmisto liittää käynnistyksen yhteydessä enintään kolme tiedostojärjestelmää:

  • Sisäinen flash-muisti — liitetään aina polkuun /flash. Sisältää oletuksena tiedostot main.py ja README.txt; luodaan ensimmäisen käynnistyksen yhteydessä.

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

  • ROMFS — vain luettava, muistiin kuvattu tiedostojärjestelmä polussa /rom, jota käytetään suurten data-aineistojen (esim. AI-mallien) toimittamiseen, jotka hyötyvät nollakopioidusta käytöstä. 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, muutoin /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äynnistyksessä, heti tiedoston boot.py jälkeen. Seuraavat pehmeät nollaukset ajavat tiedoston boot.py uudelleen mutta siirtyvät suoraan REPL:ään — ajaaksesi tiedoston main.py uudelleen sinun täytyy nollata levy täysin.

Tiedoston boot.py tai main.py pudottaminen SD-kortille ohittaa flash-muistissa olevan kopion koskematta siihen — molemmat tiedostot etsitään käynnistyshakemistosta (/sdcard, kun kortti on liitetty, muutoin /flash).

Vastaflashatussa levyssä toimitettava oletustiedosto main.py vain vilkuttaa käyttäjän RGB-LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), jotta voit todeta laiteohjelmiston käynnistyneen puhtaasti ilman mitään isäntäkonetta kytkettynä.

sys.path laajennetaan sisältämään 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 tiedoston main.py vaikka kortti olisi paikallaan), luo tyhjä tiedosto nimeltä SKIPSD polun /flash juureen.

Kun yhteys on muodostettu USB:n kautta, käynnistystiedostojärjestelmä (/sdcard, jos kortti on paikallaan, muutoin /flash) näkyy myös USB-massamuistiasemana isäntäkoneella, jolloin voit muokata tiedostoja boot.py, main.py ja muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollaamista, jotta isäntäkone tyhjentää välimuistiin tallennetut kirjoitukset.

Muista

Koska käyttöjärjestelmä käsittelee asemaa passiivisena lohkolaitteena, OpenMV Camissa 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, jonka skripti kirjoittaa takaisin, ja liitä asema uudelleen ennen kuin luet näitä tiedostoja isäntäkoneelta.

Muista

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

Tallennustilan koot

H7 toimitetaan seuraavalla kokoonpanolla:

  • /flash128 kt:n FAT-tiedostojärjestelmä, luku/kirjoitus.

  • /rom128 kt:n vain luettava muistiin kuvattu ROMFS.

  • /sdcard — asetetun microSD-kortin koko kokonaisuudessaan (kun se on paikallaan), luku/kirjoitus.

Vakavan virheen ilmaisin

Jos käyttäjän RGB-LED käy nopeasti läpi kaikkia värejä — niin nopeasti, että se yleensä näyttää kimaltelevalta valkoiselta LEDiltä erillisten värisävyjen sijaan — laiteohjelmisto on kohdannut palautumattoman vakavan virheen. Flashaa laiteohjelmisto uudelleen palautuaksesi; jos uudelleenflashaus ei auta, levy saattaa olla fyysisesti vaurioitunut.

Ohjelmistokirjastot

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