OpenMV Cam H7 Plus

De OpenMV Cam H7 Plus combineert de STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) met 32 MB extern SDRAM, 32 MB QSPI-flashgeheugen, een hardware-JPEG-codec en de OV5640 5MP-cameramodule op een verwisselbare drager. Het extra geheugen is uitstekend geschikt voor opnames met hoge resolutie en grote afbeeldingsbuffers.

OpenMV Cam H7 Plus

Voor het volledige datasheet, foto’s en afmetingen, zie de productpagina van de OpenMV Cam H7 Plus.

Hoogtepunten

  • STMicroelectronics STM32H743 Cortex‑M7 op 480 MHz (1027 DMIPS).

  • Hardware JPEG-encoder/decoder.

  • 32 MB extern SDRAM (32‑bits @ 100 MHz, 400 MB/s) plus 1 MB intern SRAM.

  • 2 MB intern flashgeheugen + 32 MB extern QSPI-flashgeheugen (~100 MB/s leessnelheid).

  • OV5640 5MP-rolling‑shutter-sensor.

  • Full‑speed USB (12 Mb/s) — verschijnt op de host als VCP + USB-massaopslag.

  • microSD-aansluiting — SD tot 2 GB, SDHC tot 32 GB, SDXC tot 2 TB.

  • LiPo-batterijaansluiting (geen oplader aan boord — gebruik een opgeladen cel of voed via VIN/USB).

  • 10 I/O-pinnen, 5 V-tolerant met 3,3 V-uitgang, 25 mA per pin (120 mA totaal over de header), met interrupt-mogelijkheid. P6 is niet 5 V-tolerant wanneer deze in ADC- of DAC-modus wordt gebruikt.

  • RGB-gebruikers-LED en twee 850 nm IR-LED’s met hoog vermogen voor actieve belichting bij machine vision in omstandigheden met weinig licht.

Notitie

De H7 Plus heeft geen energiebeheerchip aan boord: er is geen batterijoplader, geen ADC voor de batterijspanning, geen oplaad- / energiestatus-LED’s en geen hardware-aan/uitknop. Sluit een vooraf opgeladen LiPo aan op de batterij-JST of voed het board via USB / VIN.

Pinout

OpenMV Cam H7 Plus OV5640 Pinout

Pinreferentie

Pinnaam

Functie

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

digitale I/O

RESET

naar GND trekken om het board te resetten

SYN

frame‑sync-pad — alleen bedraad naar de camerasensor

BOOT0

bij inschakelen naar 3,3 V trekken voor DFU / ROM-bootloader

LED_RED

rode kanaal van de RGB-LED (actief laag)

LED_GREEN

groene kanaal van de RGB-LED (actief laag)

LED_BLUE

blauwe kanaal van de RGB-LED (actief laag)

LED_IR

IR-LED’s met hoog vermogen (beide kanalen worden samen aangestuurd)

Notitie

De SYN-pad op de header is rechtstreeks verbonden met de trigger- / belichtingslijn van de camerasensor — deze loopt op de H7 Plus niet naar de MCU. Stuur of lees deze extern aan; je kunt deze niet schakelen vanuit MicroPython.

Voedingspinnen

  • 3.3V — gereguleerde 3,3 V-rail. Tot 250 mA beschikbaar voor shields (minder als de microSD-kaart in gebruik is). Anders dan bij de nieuwere camera’s is deze pin bidirectioneel — zie de waarschuwing hieronder.

  • VIN — 3,6 – 5 V-ingang. Voedt het board via de regelaar aan boord.

  • GND — gemeenschappelijke massa.

Er is ook een 3,7 V LiPo-aansluiting aanwezig, maar de H7 Plus heeft geen batterijoplader — sluit een vooraf opgeladen cel aan, of voed via VIN / USB.

Notitie

Wanneer zowel USB als VIN/LiPo aanwezig zijn, wint de VIN/LiPo-ingang — de voedingsschakelaar aan boord kiest deze boven USB om het board te voeden.

Waarschuwing

De batterijaansluiting en VIN zijn met elkaar verbonden op de H7 Plus. Sluit niet tegelijkertijd een LiPo aan en VIN — de twee voedingen werken elkaar tegen en kunnen de batterij, het board of beide beschadigen.

Waarschuwing

Je mag de H7 Plus voeden door 3,3 V rechtstreeks op de 3.3V-pin te zetten als je niet via de regelaar aan boord wilt gaan. Pas in dat geval niet tegelijkertijd ook VIN- of USB-voeding toe — terugvoeden van de regelaar terwijl een andere voeding actief is, kan de camera permanent beschadigen en vernielen.

Tip

Gebruik de schatter voor batterijlevensduur om te modelleren hoe lang de H7 Plus op een batterij blijft draaien bij een bepaalde actief- / deep-sleep-arbeidscyclus.

Herstel- en debugpinnen

  • RESET — naar GND trekken om het board te resetten. Loslaten laat de MCU normaal opstarten.

  • BOOT0 — naar 3,3 V trekken tijdens het voeden van het board om de STM32-ROM-bootloader (DFU-modus) te starten. OpenMV IDE gebruikt deze modus om de bootloader aan boord opnieuw te flashen.

Het board heeft een SWD-debug-header (RST / SWCLK / SWDIO / SWO) naast de GPIO-header, compatibel met ST‑LINK- en SEGGER J‑Link-adapters.

Notitie

De SWO-trace-pin wordt gedeeld met de SPI-kloklijn van de camera-header. SWO kan niet tegelijkertijd worden gebruikt met een cameramodule die via SPI met de MCU communiceert — bijvoorbeeld de FLIR® Lepton® Adapter Module — kies het een of het ander.

Randapparaten aan boord

LED’s

De H7 Plus heeft één RGB-gebruikers-LED plus een paar 850 nm IR-LED’s met hoog vermogen:

  • RGB-gebruikers-LED — softwarematig bestuurbaar, beschikbaar als LED_RED, LED_GREEN en LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • IR-LED’s — beide LED’s worden samen aangestuurd via de LED_IR-pin. LED_IR is in hardware actief hoog bedraad, terwijl de firmware elke andere LED aan boord als actief laag behandelt. Gebruik daarom low() / high() in plaats van on() / off() (die de logica zouden omkeren):

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

Camerasensor

De OV5640 wordt aangestuurd via de csi — camerasensoren-module:

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

De OV5640 heeft een JPEG-compressor aan boord. Stel csi.CSI.pixformat in op csi.JPEG en de sensor levert gecomprimeerde frames rechtstreeks aan de cam over de camerabus, wat opnames met hoge resolutie praktisch maakt: csi.HD (1280×720), csi.FHD (1920×1080) en de volledige 5MP csi.WQXGA2 (2592×1944) streamen allemaal als JPEG. Stel de compressie af met csi.CSI.quality (0-100, hoger = grotere frames, meer detail):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

De sensor zit op een verwisselbare module — verwissel deze voor een van de andere OpenMV-cameramodules (global shutter, thermisch, hogere resolutie, enz.) zonder de rest van het board te wijzigen.

Machine learning

ml — Machine Learning draait gekwantiseerde TFLite-modellen op de Cortex‑M7 met CMSIS‑NN-kernels — snel genoeg voor compacte detectoren met een paar frames per seconde. Modellen op het alleen-lezen /rom-bestandssysteem laden rechtstreeks vanuit flashgeheugen zonder naar RAM te kopiëren. Hier is een 128×128 BlazeFace-detector die het gedetecteerde gezicht en de zes oriëntatiepunten ervan op elk frame als overlay weergeeft:

import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace

# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))

# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)

clock = time.clock()
while True:
    clock.tick()
    img = csi0.snapshot()

    # faces is a list of ((x, y, w, h), score, keypoints) tuples
    for r, score, keypoints in model.predict([img]):
        ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)

        # keypoints is a ndarray of shape (6, 2)
        # 0 - right eye (x, y)
        # 1 - left eye (x, y)
        # 2 - nose (x, y)
        # 3 - mouth (x, y)
        # 4 - right ear (x, y)
        # 5 - left ear (x, y)
        ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))

    print(clock.fps(), "fps")

microSD-kaart

Wanneer een kaart is geplaatst, wordt deze automatisch gemount op /sdcard en is deze bruikbaar via het reguliere bestandssysteem:

import os

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

Busreferentie

GPIO

Gebruik machine.Pin om een van de op de zeefdruk aangegeven pinnen te lezen of aan te sturen. Uitgangen zijn 3,3 V CMOS, 5 V-tolerant aan de ingangszijde, en kunnen tot 25 mA per pin opnemen/leveren (120 mA totaal over de hele header).

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

Elke ingangspin kan ook een interrupt afvuren bij randovergangen:

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

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

UART

Bus

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

Bus

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

Dezelfde hardware kan ook in target- (slave-)modus worden gebruikt via machine.I2CTarget om een geheugengebied bloot te stellen aan een andere I²C-controller:

from machine import I2CTarget

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

SPI

Bus

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)

Bus

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

P6 is de enige analoge gebruikerspin. Deze kan worden gebruikt als 12‑bits ADC-ingang of als DAC-uitgang.

  • ADC — volledige schaal bij 3,3 V op de pin:

    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 — via pyb.DAC. De 8‑bits waarde bestrijkt 0–3,3 V:

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

In ADC- of DAC-modus is P6 alleen 3,3 V-tolerant — voed deze niet met 5 V.

PWM

Pin

Timer / kanaal

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Notitie

TIM1 is gereserveerd door de firmware om de pixelklok van de camerasensor te genereren, dus de TIM1-kanalen die fysiek op P0/P1/P2 zitten, kunnen niet voor gebruikers-PWM worden gebruikt zonder de camera te verstoren.

TIM4 wordt gedeeld met pyb.Servo — het instantiëren van een servo herconfigureert de hele timer voor 50 Hz-werking, dus combineer in hetzelfde script geen machine.PWM op P7/P8 met pyb.Servo.

Stuur een van deze aan via machine.PWM

from machine import Pin, PWM

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

Softwarematige bit‑banged bussen

machine.SoftI2C en machine.SoftSPI werken op elke GPIO als je een extra bus nodig hebt.

Thermische sensor (extern)

De firmware bevat de fir — thermische sensor-driver (fir == far infrared)-driver voor extern bedrade thermische beeldsensoren:

  • MLX90621 — 16 × 4 IR-array

  • MLX90640 — 32 × 24 IR-array

  • MLX90641 — 16 × 12 IR-array

  • AMG8833 — 8 × 8 IR-array

Bedraad de module naar de I²C-bus van het board en lees frames met 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())

De fir-driver communiceert alleen via I²C 2 met de sensor — bedraad de module naar P4 (SCL) en P5 (SDA).

Timing

time

De time-module dekt blokkerende vertragingen, monotone ticks en het meten van verstreken tijd:

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)

Virtuele timers

machine.Timer plant periodieke of eenmalige callbacks zonder een hardware-timerslot te verbruiken. Geef -1 op als id om een virtuele (software-)timer te gebruiken:

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

Periodewaarden zijn in milliseconden. Roep deinit() aan om te stoppen en het slot vrij te geven.

Real‑time clock

machine.RTC houdt de kloktijd bij over resets heen:

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 reset het board als de applicatie vastloopt. Eenmaal gestart kan deze niet worden gestopt of geherconfigureerd — voed deze periodiek binnen je hoofdlus:

from machine import WDT

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

Boot- en runtime-informatie

USB-bootloader-venster

Bij elke inschakeling draait de camera een korte bootloader (een paar seconden) waarmee OpenMV IDE de firmware kan bijwerken zonder dat de gebruiker de DFU-modus hoeft te openen. Nadat het venster is verlopen, draagt de bootloader over aan boot.py en vervolgens main.py.

Een draaiend script kan op verzoek opnieuw de bootloader binnengaan door machine.bootloader() aan te roepen:

import machine

machine.bootloader()

Bestandssysteem en bootvolgorde

De H7 Plus-firmware mount bij het booten tot drie bestandssystemen:

  • Intern flashgeheugen — altijd gemount op /flash. Bevat standaard main.py en README.txt; aangemaakt bij de allereerste boot.

  • microSD-kaart — als een kaart is geplaatst, wordt deze gemount op /sdcard.

  • ROMFS — alleen-lezen, geheugengemapt bestandssysteem op /rom dat wordt gebruikt om grote data-assets te leveren (bijv. AI-modellen) die baat hebben bij zero-copy-toegang. Wordt bij het opstarten automatisch door MicroPython gemount, voordat enige gebruikers-Python draait.

Na het mounten wordt de werkmap ingesteld op /sdcard wanneer de kaart aanwezig is, anders /flash. De interpreter draait vervolgens scripts vanuit die map:

  • boot.py wordt uitgevoerd bij elke soft reset (koude boot, Ctrl‑D vanuit de REPL, of wanneer het draaiende script terugkeert).

  • main.py wordt alleen bij een koude boot uitgevoerd, direct na boot.py. Daaropvolgende soft resets draaien boot.py opnieuw, maar gaan rechtstreeks naar de REPL — om main.py opnieuw te draaien moet je het board volledig resetten.

Het plaatsen van een boot.py of main.py op de SD-kaart overschrijft de kopie in het flashgeheugen zonder deze aan te raken — beide bestanden worden opgezocht in de bootmap (/sdcard wanneer de kaart is gemount, anders /flash).

De standaard main.py die op een vers geflasht board wordt geleverd, laat alleen het blauwe kanaal van de RGB-gebruikers-LED knipperen als een hartslag (twee korte pulsen, korte pauze), zodat je kunt zien dat de firmware schoon is opgestart zonder dat er een host is aangesloten.

sys.path wordt uitgebreid met alle drie de bestandssystemen en hun lib/-submappen, zodat importeerbare modules in /flash/lib, /sdcard/lib of /rom/lib kunnen staan.

Om het systeem te dwingen een geplaatste SD-kaart te negeren (bijvoorbeeld om de main.py in flash te draaien zelfs als er een kaart aanwezig is), maak je een leeg bestand met de naam SKIPSD aan in de root van /flash.

Wanneer verbonden via USB, wordt ook het bootbestandssysteem (/sdcard als er een kaart aanwezig is, anders /flash) op de host opgesomd als een USB-massaopslagstation, waarmee je boot.py, main.py en alle andere bestanden rechtstreeks kunt bewerken. Werp het station uit voordat je de camera reset zodat de host zijn gebufferde schrijfacties wegschrijft.

Notitie

Omdat het OS het station als een passief blokapparaat behandelt, verschijnen bestanden die zijn aangemaakt of gewijzigd door code die op de OpenMV Cam draait pas zodra de host het station opnieuw mount. Als zowel het OS als de OpenMV Cam tegelijkertijd naar hetzelfde bestandssysteem schrijven, wint het OS en overschrijft het wijzigingen die de camera heeft gemaakt. Gebruik de SD-kaart voor alle data die het script terugschrijft, en mount opnieuw voordat je die bestanden vanaf de host leest.

Notitie

Het rode kanaal van de RGB-gebruikers-LED kan kort oplichten terwijl de host leest van of schrijft naar het USB-massaopslagstation — dit is een door firmware aangestuurde activiteitsindicator, geen fout.

Opslaggroottes

De H7 Plus wordt geleverd met:

  • /flash24 MB FAT-bestandssysteem, lezen/schrijven.

  • /rom8 MB alleen-lezen geheugengemapt ROMFS, gebruikt om scripts en ML-modellen te leveren die baat hebben bij zero-copy-mmap-toegang.

  • /sdcard — volledige grootte van de geplaatste microSD-kaart (indien aanwezig), lezen/schrijven.

Hard‑fault-indicator

Als de RGB-gebruikers-LED snel door alle kleuren cyclet — snel genoeg dat het meer op een flikkerende witte LED dan op afzonderlijke tinten lijkt — dan is de firmware op een onherstelbare hard fault gestuit. Flash de firmware opnieuw om te herstellen; als opnieuw flashen niet helpt, is het board mogelijk fysiek beschadigd.

Softwarebibliotheken

Zie de bibliotheekindex voor de volledige lijst met modules — inclusief welke uniek zijn voor de H7 Plus-build.