OpenMV Cam M7¶
OpenMV Cam M7 to płytka wizji maszynowej oparta na rdzeniu Cortex‑M7, zbudowana wokół układu STMicroelectronics STM32F765 taktowanego z częstotliwością 216 MHz, wyposażona w 512 KB wewnętrznej pamięci SRAM i 2 MB wewnętrznej pamięci flash. Dołączony sensor OV7725 przechwytuje ramki 640×480 w skali szarości lub 320×240 RGB565 z prędkością do 150 FPS, a 10‑pinowe złącze użytkownika udostępnia urządzenia peryferyjne UART, I²C, SPI, CAN, ADC/DAC oraz PWM.
Pełną dokumentację techniczną, zdjęcia i wymiary znajdziesz na stronie produktu OpenMV Cam M7.
Najważniejsze cechy¶
STMicroelectronics STM32F765 Cortex‑M7 taktowany z częstotliwością 216 MHz.
512 KB wewnętrznej pamięci SRAM — brak zewnętrznej pamięci SDRAM.
2 MB wewnętrznej pamięci flash (brak zewnętrznej pamięci flash QSPI).
Sensor OV7725 — 640×480 w skali szarości lub 320×240 RGB565 z prędkością do 150 FPS.
USB Full‑speed (12 Mb/s) — widoczne dla hosta jako VCP + pamięć masowa USB.
Gniazdo microSD — SD do 2 GB, SDHC do 32 GB, SDXC do 2 TB.
10 pinów I/O, tolerujących 5 V z wyjściem 3,3 V, 25 mA na pin (łącznie 120 mA na całym złączu), z obsługą przerwań. P6 nie toleruje 5 V, gdy jest używany w trybie ADC lub DAC.
Użytkownikowa dioda RGB oraz dwie diody IR 850 nm dużej mocy zapewniające aktywne oświetlenie przy słabym świetle.
Informacja
M7 nie ma układu zarządzania zasilaniem na płytce: brak złącza akumulatora, brak ładowarki akumulatora, brak ADC do pomiaru napięcia akumulatora, brak diod statusu ładowania / zasilania i brak sprzętowego przycisku zasilania. Zasilaj płytkę z USB lub VIN.
Rozkład wyprowadzeń¶
Opis wyprowadzeń¶
Nazwa pinu |
Funkcja |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / CAN2 TX |
P3 |
SPI2 NSS (CS) / CAN2 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 |
pole synchronizacji ramki (frame‑sync) — podłączone wyłącznie do sensora kamery |
BOOT0 |
zewrzyj do 3,3 V przy włączeniu zasilania dla DFU / bootloadera ROM |
LED_RED |
czerwony kanał diody RGB (aktywny stanem niskim) |
LED_GREEN |
zielony kanał diody RGB (aktywny stanem niskim) |
LED_BLUE |
niebieski kanał diody RGB (aktywny stanem niskim) |
LED_IR |
diody IR dużej mocy (oba kanały sterowane wspólnie) |
Informacja
Pole SYN na złączu jest podłączone bezpośrednio do linii wyzwalania / ekspozycji sensora kamery — w modelu M7 nie prowadzi ono do MCU. Steruj nim lub odczytuj je zewnętrznie; nie możesz go przełączać z poziomu MicroPython.
Piny zasilania¶
3.3V — stabilizowana szyna 3,3 V. Do 250 mA dostępne dla nakładek (mniej, jeśli 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.
Informacja
Gdy obecne są jednocześnie USB i VIN, płytkę zasila to źródło, które ma wyższe napięcie — wbudowane diody po prostu wybierają mocniejszą szynę.
Ostrzeżenie
Możesz zasilać M7, 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 przy aktywnym innym źródle może trwale uszkodzić i zniszczyć kamerę.
Wskazówka
Skorzystaj z kalkulatora żywotności akumulatora, aby oszacować, jak długo M7 będzie działać na akumulatorze przy zadanym cyklu pracy aktywnej / głębokiego uśpienia.
Piny odzyskiwania i debugowania¶
RESET — zewrzyj do GND, aby zresetować płytkę. Zwolnienie pozwala MCU uruchomić się normalnie.
BOOT0 — zewrzyj do 3,3 V podczas 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 i SEGGER J‑Link.
Wbudowane urządzenia peryferyjne¶
Diody LED¶
M7 ma pojedynczą użytkownikową diodę RGB oraz parę diod IR 850 nm dużej mocy:
Użytkownikowa dioda RGB — 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 sprzętowo podłączony jako aktywny stanem wysokim, podczas gdy oprogramowanie układowe traktuje każdą inną wbudowaną diodę 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 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()
W modelu M7 sensor jest przylutowany do płytki — nie znajduje się na wymiennym module.
Karta microSD¶
Po włożeniu karty jest ona automatycznie montowana w /sdcard i dostępna przez zwykły system plików:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Opis magistral¶
GPIO¶
Użyj machine.Pin, aby odczytywać lub sterować dowolnym z opisanych na nadruku pinów. Wyjścia są typu 3,3 V CMOS, tolerują 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ż wyzwalać przerwanie przy zmianach zbocza:
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¶
Magistrala |
TX |
RX |
|---|---|---|
CAN2 |
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 to jedyny użytkownikowy pin analogowy. 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. Wartość 8‑bitowa 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 toleruje tylko 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 PWM użytkownika bez zakłócenia pracy 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 mieszaj 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 termiczny (zewnętrzny)¶
Oprogramowanie układowe zawiera sterownik fir — sterownik sensora termicznego (fir == far infrared, daleka podczerwień) dla zewnętrznie podłączonych kamer termowizyjnych:
MLX90621 — macierz IR 16 × 4
MLX90640 — macierz IR 32 × 24
MLX90641 — macierz IR 16 × 12
AMG8833 — macierz 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 okresowe 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 mię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 zrekonfigurować — odświeżaj go okresowo w 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 czasie wykonywania¶
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 wchodzenia przez użytkownika 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 ponownie wejść do bootloadera na żądanie, wywołując machine.bootloader()
import machine
machine.bootloader()
System plików i kolejność rozruchu¶
Oprogramowanie układowe M7 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 rozruchu.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 zyskują na dostępie bez kopiowania. Montowany automatycznie przez MicroPython przy starcie, przed uruchomieniem jakiegokolwiek kodu Python użytkownika.
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 zakończy działanie).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 boot.py lub main.py na karcie SD nadpisuje kopię w pamięci flash bez jej naruszania — 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żytkownikowej diody RGB jako sygnał życia (dwa krótkie impulsy, krótka przerwa), dzięki czemu możesz stwierdzić, że oprogramowanie układowe uruchomiło się poprawnie, bez podłączonego hosta.
sys.path jest rozszerzany o wszystkie trzy systemy plików i ich podkatalogi lib/, dzięki czemu importowalne moduły mogą znajdować się w /flash/lib, /sdcard/lib lub /rom/lib.
Aby wymusić zignorowanie przez system 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ż wykrywany przez hosta jako napęd pamięci masowej USB, co pozwala bezpośrednio edytować boot.py, main.py i wszelkie inne pliki. Wysuń napęd przed zresetowaniem kamery, aby host opróżnił buforowane zapisy.
Informacja
Ponieważ system operacyjny traktuje napęd 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 napędu. 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 wprowadzone przez kamerę. Używaj karty SD dla wszelkich danych, które skrypt zapisuje, i montuj ją ponownie przed odczytem tych plików z hosta.
Informacja
Czerwony kanał użytkownikowej diody RGB może na chwilę się zaświecić, gdy host odczytuje z napędu pamięci masowej USB lub na niego zapisuje — jest to sterowany przez oprogramowanie układowe wskaźnik aktywności, a nie błąd.
Rozmiary pamięci¶
M7 jest dostarczany z:
/flash— system plików FAT o pojemności 96 KB, do odczytu/zapisu./rom— mapowany w pamięci ROMFS o pojemności 256 KB, tylko do odczytu./sdcard— pełny rozmiar włożonej karty microSD (gdy jest obecna), do odczytu/zapisu.
Wskaźnik krytycznego błędu (hard‑fault)¶
Jeśli użytkownikowa dioda RGB szybko przełącza się przez wszystkie kolory — na tyle szybko, że zwykle wygląda jak migocząca biała dioda zamiast wyraźnych barw — oznacza to, że oprogramowanie układowe napotkało nieodwracalny krytyczny błąd (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 programowe¶
Pełną listę modułów — w tym informację, które z nich są unikalne dla wersji M7 — znajdziesz w indeksie bibliotek.