OpenMV Cam H7¶
De OpenMV Cam H7 is een machine vision-bord met Cortex‑M7 dat is opgebouwd rond de STMicroelectronics STM32H743 op 480 MHz met 1 MB intern SRAM, 2 MB intern flashgeheugen en een hardware-JPEG-codec. Het bord wordt geleverd in twee sensorrevisies — de H7 met de OV7725 en de H7 R2 met de ON Semi MT9M114 — maar de firmware, pinindeling en Python API zijn identiek.
Voor de volledige datasheet, foto’s en afmetingen, zie de productpagina van de OpenMV Cam H7.
Hoogtepunten¶
STMicroelectronics STM32H743 Cortex‑M7 op 480 MHz (1027 DMIPS).
Hardware JPEG-encoder/-decoder.
1 MB intern SRAM — geen extern SDRAM.
2 MB intern flashgeheugen (geen extern QSPI-flashgeheugen).
OV7725-sensor (of MT9M114 op de H7 R2).
Full‑speed USB (12 Mb/s) — verschijnt als VCP + USB-massaopslag voor de host.
microSD-aansluiting — SD tot 2 GB, SDHC tot 32 GB, SDXC tot 2 TB.
LiPo-batterijaansluiting (geen oplader aan boord — voorzie 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), interrupt-geschikt. P6 is niet 5 V-tolerant wanneer deze in ADC- of DAC-modus wordt gebruikt.
Gebruiker-RGB-LED en twee krachtige 850 nm IR-LED’s voor actieve verlichting bij vision met weinig licht.
Notitie
De H7 heeft geen voedingsbeheerchip aan boord: er is geen batterijoplader, geen ADC voor batterijspanning, geen LED’s voor oplaad- / voedingsstatus en geen hardware-aan/uit-knop. Sluit een voorgeladen LiPo aan op de batterij-JST of voed het bord via USB / VIN.
Pinindeling¶
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 |
TIM4 CH3 |
RESET |
trek naar GND om het bord te resetten |
SYN |
frame‑sync-pad — alleen bedraad naar de camerasensor |
BOOT0 |
trek bij inschakelen naar 3,3 V voor DFU / ROM-bootloader |
LED_RED |
rood kanaal van RGB-LED (actief laag) |
LED_GREEN |
groen kanaal van RGB-LED (actief laag) |
LED_BLUE |
blauw kanaal van RGB-LED (actief laag) |
LED_IR |
krachtige IR-LED’s (beide kanalen samen aangestuurd) |
Notitie
De SYN-pad op de header is rechtstreeks verbonden met de trigger- / belichtingslijn van de camerasensor — deze loopt op de H7 niet naar de MCU. Stuur of lees deze extern aan; je kunt hem niet schakelen vanuit MicroPython.
Voedingspinnen¶
3.3V — gestabiliseerde 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 bord via de regelaar aan boord.
GND — gemeenschappelijke aarde.
Er is ook een 3,7 V LiPo-aansluiting aanwezig, maar de H7 heeft geen batterijoplader — sluit een voorgeladen cel aan, of voorzie in plaats daarvan 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 bord te voeden.
Waarschuwing
De batterijaansluiting en VIN zijn met elkaar verbonden op de H7. Sluit niet tegelijkertijd een LiPo aan en leg VIN aan — de twee voedingen werken tegen elkaar in en kunnen de batterij, het bord of beide beschadigen.
Waarschuwing
Je mag de H7 voeden door 3,3 V rechtstreeks op de 3.3V-pin te zetten als je niet via de regelaar aan boord wilt gaan. Leg in dat geval niet ook tegelijkertijd VIN- of USB-voeding aan — het terugdrijven van de regelaar terwijl een andere voeding actief is, kan de camera permanent beschadigen en vernielen.
Tip
Gebruik de batterijlevensduurschatter om te modelleren hoe lang de H7 op een batterij draait voor een bepaalde actieve / deep-sleep-werkcyclus.
Herstel- en debugpinnen¶
RESET — trek naar GND om het bord te resetten. Loslaten laat de MCU normaal opstarten.
BOOT0 — trek naar 3,3 V terwijl je het bord voedt om de STM32 ROM-bootloader (DFU-modus) te starten. OpenMV IDE gebruikt deze modus om de bootloader aan boord opnieuw te flashen.
Het bord biedt een SWD-debugheader (RST / SWCLK / SWDIO) naast de GPIO-header, compatibel met ST‑LINK- en SEGGER J‑Link-adapters.
Randapparaten aan boord¶
LED’s¶
De H7 heeft één gebruiker-RGB-LED plus een paar krachtige 850 nm IR-LED’s:
Gebruiker-RGB-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, dus gebruiklow()/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 OV7725 (of MT9M114 op de H7 R2) 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 sensor zit op een verwisselbare module — vervang deze door een van de andere OpenMV-cameramodules (global shutter, thermisch, hogere resolutie, enz.) zonder de rest van het bord te wijzigen.
microSD-kaart¶
Wanneer er een kaart is geplaatst, wordt deze automatisch gemount op /sdcard en is 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 beschikbaar 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 — volle 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 dekt 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 — voer er geen 5 V op aan.
PWM¶
Pin |
Timer / kanaal |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM4 CH3 |
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 werking op 50 Hz, dus combineer in hetzelfde script geen machine.PWM op P7/P8/P9 met pyb.Servo.
Stuur ze aan via machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Softwarematig 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 beeldvormers:
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 bord 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 behandelt 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 gebruiken. 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 bord als de applicatie vastloopt. Eenmaal gestart kan deze niet worden gestopt of opnieuw geconfigureerd — voed hem periodiek in 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-bootloadervenster¶
Bij elke keer inschakelen 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 verstreken, draagt de bootloader over aan boot.py en vervolgens main.py.
Een draaiend script kan de bootloader op verzoek opnieuw openen door machine.bootloader() aan te roepen:
import machine
machine.bootloader()
Bestandssysteem en bootvolgorde¶
De H7-firmware mount bij het opstarten maximaal drie bestandssystemen:
Intern flashgeheugen — altijd gemount op
/flash. Bevat standaardmain.pyenREADME.txt; aangemaakt bij de allereerste boot.microSD-kaart — als er een kaart is geplaatst, wordt deze gemount op
/sdcard.ROMFS — alleen-lezen, in het geheugen gemapt bestandssysteem op
/romdat wordt gebruikt om grote data-assets (bijv. AI-modellen) te leveren die baat hebben bij zero‑copy-toegang. Wordt automatisch door MicroPython gemount bij het opstarten, voordat enige Python-gebruikerscode 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 (cold boot,Ctrl‑Dvanuit de REPL, of telkens wanneer het draaiende script terugkeert).main.pywordt alleen bij cold boot uitgevoerd, direct naboot.py. Latere soft resets voerenboot.pyopnieuw uit, maar gaan rechtstreeks naar de REPL — ommain.pyopnieuw uit te voeren, moet je het bord 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 bord wordt geleverd, laat alleen het blauwe kanaal van de gebruiker-RGB-LED knipperen als hartslag (twee korte pulsen, korte pauze), zodat je kunt zien dat de firmware netjes is opgestart zonder dat er een host is aangesloten.
sys.path wordt uitgebreid om alle drie de bestandssystemen en hun lib/-submappen te omvatten, 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 het flashgeheugen uit te voeren, zelfs met een kaart aanwezig), maak je een leeg bestand met de naam SKIPSD aan in de hoofdmap van /flash.
Wanneer verbonden via USB, verschijnt het bootbestandssysteem (/sdcard als er een kaart aanwezig is, anders /flash) ook als een USB-massaopslagschijf op de host, waarmee je boot.py, main.py en alle andere bestanden rechtstreeks kunt bewerken. Werp de schijf uit voordat je de camera reset zodat de host de gecachte schrijfacties leegmaakt.
Notitie
Omdat het besturingssysteem de schijf als een passief blokapparaat behandelt, verschijnen bestanden die zijn aangemaakt of gewijzigd door code die op de OpenMV Cam draait, pas wanneer de host de schijf opnieuw mount. Als zowel het besturingssysteem als de OpenMV Cam tegelijkertijd naar hetzelfde bestandssysteem schrijven, wint het besturingssysteem en overschrijft het de wijzigingen van de camera. 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 gebruiker-RGB-LED kan kort oplichten terwijl de host leest van of schrijft naar de USB-massaopslagschijf — dit is een door firmware aangestuurde activiteitsindicator, geen fout.
Opslaggroottes¶
De H7 wordt geleverd met:
/flash— 128 KB FAT-bestandssysteem, lezen/schrijven./rom— 128 KB alleen-lezen in het geheugen gemapt ROMFS./sdcard— volledige grootte van de geplaatste microSD-kaart (indien aanwezig), lezen/schrijven.
Hard‑fault-indicator¶
Als de gebruiker-RGB-LED snel door alle kleuren cyclet — snel genoeg dat het eerder op een knipperende witte LED lijkt dan op afzonderlijke tinten — dan heeft de firmware een onherstelbare hard fault opgelopen. Flash de firmware opnieuw om te herstellen; als opnieuw flashen niet helpt, is het bord mogelijk fysiek beschadigd.
Softwarebibliotheken¶
Zie de bibliotheekindex voor de volledige lijst met modules — inclusief welke uniek zijn voor de H7-build.