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.
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¶
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_GREENenLED_BLUEfrom 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_IRis in hardware actief hoog bedraad, terwijl de firmware elke andere LED aan boord als actief laag behandelt. Gebruik daaromlow()/high()in plaats vanon()/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 standaardmain.pyenREADME.txt; aangemaakt bij de allereerste boot.microSD-kaart — als een kaart is geplaatst, wordt deze gemount op
/sdcard.ROMFS — alleen-lezen, geheugengemapt bestandssysteem op
/romdat 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.pywordt uitgevoerd bij elke soft reset (koude boot,Ctrl‑Dvanuit de REPL, of wanneer het draaiende script terugkeert).main.pywordt alleen bij een koude boot uitgevoerd, direct naboot.py. Daaropvolgende soft resets draaienboot.pyopnieuw, maar gaan rechtstreeks naar de REPL — ommain.pyopnieuw 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:
/flash— 24 MB FAT-bestandssysteem, lezen/schrijven./rom— 8 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.