OpenMV Cam H7¶
OpenMV Cam H7 to płytka do wizji maszynowej oparta na rdzeniu Cortex‑M7, zbudowana wokół układu STMicroelectronics STM32H743 taktowanego zegarem 480 MHz, z 1 MB wewnętrznej pamięci SRAM, 2 MB wewnętrznej pamięci flash oraz sprzętowym kodekiem JPEG. Płytka jest dostępna w dwóch wersjach sensora — H7 z sensorem OV7725 oraz H7 R2 z sensorem ON Semi MT9M114 — jednak oprogramowanie układowe, rozkład wyprowadzeń i API Pythona są identyczne.
Pełną dokumentację techniczną, zdjęcia i wymiary znajdziesz na stronie produktu OpenMV Cam H7.
Najważniejsze cechy¶
STMicroelectronics STM32H743 Cortex‑M7 taktowany zegarem 480 MHz (1027 DMIPS).
Sprzętowy enkoder/dekoder JPEG.
1 MB wewnętrznej pamięci SRAM — bez zewnętrznej pamięci SDRAM.
2 MB wewnętrznej pamięci flash (bez zewnętrznej pamięci flash QSPI).
Sensor OV7725 (lub MT9M114 w wersji H7 R2).
USB Full‑speed (12 Mb/s) — widoczne dla hosta jako VCP oraz pamięć masowa USB.
Gniazdo microSD — karty SD do 2 GB, SDHC do 32 GB, SDXC do 2 TB.
Złącze akumulatora LiPo (bez wbudowanej ładowarki — podłącz naładowane ogniwo lub zasilaj z VIN/USB).
10 pinów I/O, tolerancja 5 V z wyjściem 3,3 V, 25 mA na pin (łącznie 120 mA na całym złączu), z obsługą przerwań. Pin P6 nie jest tolerancyjny na 5 V w trybie ADC lub DAC.
Użytkownicza dioda RGB LED oraz dwie diody IR 850 nm o dużej mocy do aktywnego oświetlenia w warunkach słabego światła.
Informacja
H7 nie posiada wbudowanego układu zarządzania zasilaniem: nie ma ładowarki akumulatora, przetwornika ADC pomiaru napięcia akumulatora, diod LED stanu ładowania / zasilania ani sprzętowego przycisku zasilania. Podłącz wcześniej naładowane ogniwo LiPo do złącza JST akumulatora lub zasilaj płytkę z USB / VIN.
Rozkład wyprowadzeń¶
Wykaz wyprowadzeń¶
Nazwa pinu |
Funkcja |
|---|---|
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 |
zewrzyj do GND, aby zresetować płytkę |
SYN |
pad synchronizacji ramki — podłączony wyłącznie do sensora kamery |
BOOT0 |
podciągnij do 3,3 V przy włączeniu zasilania dla trybu DFU / bootloadera ROM |
LED_RED |
czerwony kanał diody RGB LED (aktywny stanem niskim) |
LED_GREEN |
zielony kanał diody RGB LED (aktywny stanem niskim) |
LED_BLUE |
niebieski kanał diody RGB LED (aktywny stanem niskim) |
LED_IR |
diody IR o dużej mocy (oba kanały sterowane wspólnie) |
Informacja
Pad SYN na złączu jest podłączony bezpośrednio do linii wyzwalania / ekspozycji sensora kamery — w wersji H7 nie prowadzi do mikrokontrolera. Steruj nim lub odczytuj go zewnętrznie; nie da się go przełączać z poziomu MicroPython.
Piny zasilania¶
3.3V — stabilizowana szyna 3,3 V. Dostępne do 250 mA dla shieldów (mniej, gdy używana jest karta microSD). W przeciwieństwie do nowszych kamer ten pin jest dwukierunkowy — zobacz ostrzeżenie poniżej.
VIN — wejście 3,6 – 5 V. Zasila płytkę przez wbudowany stabilizator.
GND — wspólna masa.
Obecne jest również złącze akumulatora LiPo 3,7 V, jednak H7 nie posiada ładowarki akumulatora — podłącz wcześniej naładowane ogniwo lub zasilaj z VIN / USB.
Informacja
Gdy obecne są jednocześnie USB i VIN/LiPo, pierwszeństwo ma wejście VIN/LiPo — wbudowany przełącznik zasilania wybiera je zamiast USB do zasilania płytki.
Ostrzeżenie
W wersji H7 złącze akumulatora i VIN są połączone ze sobą. Nie podłączaj jednocześnie akumulatora LiPo i napięcia VIN — oba źródła będą ze sobą rywalizować i mogą uszkodzić akumulator, płytkę lub oba.
Ostrzeżenie
Możesz zasilać H7, podając 3,3 V bezpośrednio na pin 3.3V, jeśli nie chcesz korzystać z wbudowanego stabilizatora. W takim przypadku nie podawaj jednocześnie zasilania VIN ani USB — wsteczne zasilanie stabilizatora podczas aktywności innego źródła może trwale uszkodzić i zniszczyć kamerę.
Wskazówka
Skorzystaj z kalkulatora żywotności akumulatora, aby oszacować, jak długo H7 będzie działać na akumulatorze przy danym cyklu pracy aktywny / głęboki uśpienie.
Piny odzyskiwania i debugowania¶
RESET — zewrzyj do GND, aby zresetować płytkę. Zwolnienie pozwala mikrokontrolerowi normalnie się uruchomić.
BOOT0 — podciągnij do 3,3 V podczas włączania zasilania płytki, aby wejść do bootloadera ROM STM32 (tryb DFU). OpenMV IDE używa tego trybu do ponownego wgrania wbudowanego bootloadera.
Płytka udostępnia złącze debugowania SWD (RST / SWCLK / SWDIO) obok złącza GPIO, zgodne z adapterami ST‑LINK oraz SEGGER J‑Link.
Wbudowane urządzenia peryferyjne¶
Diody LED¶
H7 posiada pojedynczą użytkowniczą diodę RGB LED oraz parę diod IR 850 nm o dużej mocy:
Użytkownicza dioda RGB LED — sterowana programowo, udostępniona jako
LED_RED,LED_GREENiLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Diody IR — obie diody są sterowane wspólnie przez pin
LED_IR.LED_IRjest w sprzęcie podłączony jako aktywny stanem wysokim, podczas gdy oprogramowanie układowe traktuje każdą inną wbudowaną diodę LED jako aktywną stanem niskim, więc używajlow()/high()zamiaston()/off()(które odwróciłyby logikę):from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
Sensor kamery¶
Sensor OV7725 (lub MT9M114 w wersji H7 R2) jest sterowany przez moduł csi — sensory kamery
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()
Sensor znajduje się na wymiennym module — wymień go na dowolny z pozostałych modułów kamer OpenMV (z migawką globalną, termowizyjny, o wyższej rozdzielczości itp.) bez zmieniania reszty płytki.
Karta microSD¶
Po włożeniu karty jest ona automatycznie montowana w /sdcard i może być używana przez standardowy system plików:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Wykaz magistral¶
GPIO¶
Użyj machine.Pin, aby odczytać lub sterować dowolnym z pinów opisanych na nadruku. Wyjścia działają w standardzie 3,3 V CMOS, są tolerancyjne na 5 V po stronie wejścia i mogą przyjmować/dostarczać do 25 mA na pin (łącznie 120 mA na całym złączu).
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())
Każdy pin wejściowy może również wyzwolić przerwanie na zboczach sygnału:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Magistrala |
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¶
Magistrala |
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")
Ten sam sprzęt może być również używany w trybie urządzenia docelowego (slave) przez machine.I2CTarget, aby udostępnić obszar pamięci innemu kontrolerowi I²C:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
Magistrala |
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)¶
Magistrala |
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 i DAC¶
P6 jest jedynym użytkowniczym pinem analogowym. Może być używany jako 12‑bitowe wejście ADC lub wyjście DAC.
ADC — pełna skala przy 3,3 V na pinie:
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 — przez
pyb.DAC. 8‑bitowa wartość obejmuje zakres 0–3,3 V:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
W trybie ADC lub DAC pin P6 jest tolerancyjny tylko na 3,3 V — nie podawaj na niego 5 V.
PWM¶
Pin |
Licznik czasu / kanał |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM4 CH3 |
Informacja
TIM1 jest zarezerwowany przez oprogramowanie układowe do generowania zegara pikseli sensora kamery, więc kanały TIM1, które fizycznie znajdują się na P0/P1/P2, nie mogą być używane do użytkowniczego PWM bez zakłócenia działania kamery.
TIM4 jest współdzielony z pyb.Servo — utworzenie instancji serwa rekonfiguruje cały licznik czasu do pracy z częstotliwością 50 Hz, więc nie łącz machine.PWM na P7/P8/P9 z pyb.Servo w tym samym skrypcie.
Steruj dowolnym z nich przez machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Programowe magistrale bit‑bang¶
machine.SoftI2C i machine.SoftSPI działają na dowolnym GPIO, jeśli potrzebujesz dodatkowej magistrali.
Sensor termowizyjny (zewnętrzny)¶
Oprogramowanie układowe zawiera sterownik fir — sterownik sensora termicznego (fir == far infrared, daleka podczerwień) dla zewnętrznie podłączonych kamer termowizyjnych:
MLX90621 — matryca IR 16 × 4
MLX90640 — matryca IR 32 × 24
MLX90641 — matryca IR 16 × 12
AMG8833 — matryca IR 8 × 8
Podłącz moduł do magistrali I²C płytki i odczytuj ramki za pomocą 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())
Sterownik fir komunikuje się z sensorem wyłącznie przez I²C 2 — podłącz moduł do P4 (SCL) i P5 (SDA).
Pomiar czasu¶
time¶
Moduł time obejmuje blokujące opóźnienia, monotoniczne takty oraz pomiar upływającego czasu:
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)
Wirtualne liczniki czasu¶
machine.Timer planuje cykliczne lub jednorazowe wywołania zwrotne bez zajmowania sprzętowego slotu licznika czasu. Przekaż -1 jako id, aby użyć wirtualnego (programowego) licznika czasu:
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"))
Wartości okresu podawane są w milisekundach. Wywołaj deinit(), aby zatrzymać i zwolnić slot.
Zegar czasu rzeczywistego¶
machine.RTC utrzymuje czas zegarowy pomiędzy resetami:
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 resetuje płytkę, jeśli aplikacja się zawiesi. Po uruchomieniu nie można go zatrzymać ani ponownie skonfigurować — karm go okresowo wewnątrz głównej pętli:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informacje o rozruchu i działaniu¶
Okno bootloadera USB¶
Przy każdym włączeniu zasilania kamera uruchamia krótki bootloader (kilka sekund), który pozwala OpenMV IDE zaktualizować oprogramowanie układowe bez konieczności ręcznego wchodzenia w tryb DFU. Po upływie tego okna bootloader przekazuje sterowanie do boot.py, a następnie main.py.
Działający skrypt może na żądanie ponownie wejść do bootloadera, wywołując machine.bootloader()
import machine
machine.bootloader()
System plików i kolejność rozruchu¶
Oprogramowanie układowe H7 montuje przy rozruchu do trzech systemów plików:
Wewnętrzna pamięć flash — zawsze montowana w
/flash. Domyślnie przechowujemain.pyiREADME.txt; tworzona przy pierwszym uruchomieniu.Karta microSD — jeśli karta jest włożona, jest montowana w
/sdcard.ROMFS — tylko do odczytu, mapowany w pamięci system plików w
/romużywany do dostarczania dużych zasobów danych (np. modeli AI), które korzystają z dostępu bez kopiowania. Montowany automatycznie przez MicroPython przy starcie, przed uruchomieniem jakiegokolwiek użytkowniczego kodu Pythona.
Po zamontowaniu katalog roboczy jest ustawiany na /sdcard, gdy karta jest obecna, w przeciwnym razie na /flash. Interpreter uruchamia następnie skrypty z tego katalogu:
boot.pyjest wykonywany przy każdym miękkim resecie (zimny rozruch,Ctrl‑Dz REPL lub za każdym razem, gdy działający skrypt zwraca sterowanie).main.pyjest wykonywany tylko przy zimnym rozruchu, bezpośrednio poboot.py. Kolejne miękkie resety ponownie uruchamiająboot.py, ale przechodzą prosto do REPL — aby ponownie uruchomićmain.py, musisz w pełni zresetować płytkę.
Umieszczenie pliku boot.py lub main.py na karcie SD nadpisuje kopię w pamięci flash, nie zmieniając jej — oba pliki są wyszukiwane w katalogu rozruchowym (/sdcard, gdy karta jest zamontowana, w przeciwnym razie /flash).
Domyślny main.py dostarczany na świeżo wgranej płytce po prostu miga niebieskim kanałem użytkowniczej diody RGB LED jako sygnałem życia (dwa krótkie impulsy, krótka przerwa), dzięki czemu wiesz, że oprogramowanie układowe uruchomiło się poprawnie bez podłączonego hosta.
sys.path jest rozszerzany o wszystkie trzy systemy plików oraz ich podkatalogi lib/, dzięki czemu moduły do importowania mogą znajdować się w /flash/lib, /sdcard/lib lub /rom/lib.
Aby zmusić system do zignorowania włożonej karty SD (na przykład w celu uruchomienia main.py z pamięci flash nawet przy obecnej karcie), utwórz pusty plik o nazwie SKIPSD w katalogu głównym /flash.
Po podłączeniu przez USB rozruchowy system plików (/sdcard, jeśli karta jest obecna, w przeciwnym razie /flash) jest również wyliczany jako dysk pamięci masowej USB na hoście, co pozwala bezpośrednio edytować boot.py, main.py i wszelkie inne pliki. Wysuń dysk przed zresetowaniem kamery, aby host opróżnił zapisy z bufora podręcznego.
Informacja
Ponieważ system operacyjny traktuje dysk jako pasywne urządzenie blokowe, pliki utworzone lub zmodyfikowane przez kod działający na OpenMV Cam nie pojawią się, dopóki host ponownie nie zamontuje dysku. Jeśli zarówno system operacyjny, jak i OpenMV Cam zapisują ten sam system plików w tym samym czasie, system operacyjny wygra i nadpisze zmiany dokonane przez kamerę. Używaj karty SD do wszelkich danych zapisywanych przez skrypt i ponownie montuj dysk przed odczytaniem tych plików z hosta.
Informacja
Czerwony kanał użytkowniczej diody RGB LED może na krótko zaświecić się, gdy host odczytuje z dysku pamięci masowej USB lub na niego zapisuje — jest to sterowany oprogramowaniem układowym wskaźnik aktywności, a nie usterka.
Rozmiary pamięci¶
H7 jest dostarczany z:
/flash— system plików FAT o pojemności 128 KB, do odczytu/zapisu./rom— mapowany w pamięci system plików ROMFS o pojemności 128 KB, tylko do odczytu./sdcard— pełny rozmiar włożonej karty microSD (gdy jest obecna), do odczytu/zapisu.
Wskaźnik awarii krytycznej (hard‑fault)¶
Jeśli użytkownicza dioda RGB LED szybko przełącza się przez wszystkie kolory — na tyle szybko, że zwykle wygląda jak migocząca biała dioda LED zamiast wyraźnych barw — oznacza to, że oprogramowanie układowe napotkało nieodwracalną awarię krytyczną (hard fault). Wgraj ponownie oprogramowanie układowe, aby przywrócić działanie; jeśli ponowne wgranie nie pomoże, płytka może być fizycznie uszkodzona.
Biblioteki oprogramowania¶
Pełną listę modułów — w tym informację, które z nich są charakterystyczne wyłącznie dla wersji H7 — znajdziesz w indeksie bibliotek.