OpenMV Cam M4¶
OpenMV Cam M4 on kompakti Cortex‑M4‑pohjainen konenäkölevy, joka on rakennettu STMicroelectronicsin STM32F427‑piirin ympärille (180 MHz, 256 KB sisäistä SRAM‑muistia ja 1 MB sisäistä flash-muistia). Mukana toimitettava OV7725-sensori ottaa 320×240 harmaasävy- tai RGB565-kehyksiä, ja 9‑nastainen käyttäjäliitin tuo esiin UART-, I²C-, SPI-, CAN-, ADC/DAC- ja PWM-oheislaitteet.
Muista
OV7725 oli vakiosensori tuotantovaiheen M4-levyissä. Hyvin varhaisissa M4-versioissa toimitettiin sen sijaan OmniVision OV2640 — sama QVGA-esikatseluputki, mutta OV2640 voi lisäksi ottaa jopa UXGA‑tarkkuuksisia (1600×1200) JPEG-kehyksiä. Molempia sensoreita ohjataan saman csi — kennot-rajapinnan kautta.
Täydellinen tietolomake, valokuvat ja mitat löytyvät OpenMV Cam M4 -tuotesivulta.
Kohokohdat¶
STMicroelectronics STM32F427 Cortex‑M4, 180 MHz.
256 KB sisäistä SRAM-muistia — ei ulkoista SDRAM-muistia.
1 MB sisäistä flash-muistia (ei ulkoista QSPI flash-muistia).
OV7725-sensori (tai OV2640 hyvin varhaisissa M4-versioissa) — 320×240 8‑bittinen harmaasävy tai RGB565; OV2640 voi lisäksi ottaa jopa UXGA‑tarkkuuksisia (1600×1200) JPEG-kuvia.
Full‑speed USB (12 Mb/s) — näkyy isäntäkoneelle VCP- ja USB-massamuistilaitteena.
microSD-paikka — SD jopa 2 GB, SDHC jopa 32 GB, SDXC jopa 2 TB.
9 I/O-nastaa, 5 V:n sietoiset 3,3 V:n lähdöllä, 25 mA nastaa kohti (yhteensä 120 mA koko liittimessä), keskeytyskykyiset. P6 ei ole 5 V:n sietoinen, kun sitä käytetään ADC- tai DAC-tilassa.
Käyttäjän RGB-LED ja kaksi suuritehoista 850 nm:n IR-LEDiä aktiiviseen valaisuun hämärässä konenäössä.
Muista
M4:ssä ei ole sisäänrakennettua virranhallintapiiriä: siinä ei ole akkuliitintä, akkulaturia, akkujännitteen ADC:tä, lataus- tai virtatilan LEDejä eikä laitteistollista virtapainiketta. Syötä levylle virtaa USB:n tai VIN:n kautta.
Nastajärjestys¶
Nastaviite¶
Nastan nimi |
Toiminto |
|---|---|
P0 |
SPI2 MOSI |
P1 |
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 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
RESET |
vedä GND:hen nollataksesi levyn |
BOOT0 |
vedä 3,3 V:hen käynnistyksen yhteydessä DFU- / ROM-käynnistyslatainta varten |
SWCLK |
ARM SWD -kello (vianetsijän pääsy) |
SWDIO |
ARM SWD -data (vianetsijän pääsy) |
LED_RED |
RGB-LEDin punainen kanava (aktiivinen matalalla) |
LED_GREEN |
RGB-LEDin vihreä kanava (aktiivinen matalalla) |
LED_BLUE |
RGB-LEDin sininen kanava (aktiivinen matalalla) |
LED_IR |
suuritehoiset IR-LEDit (molempia kanavia ohjataan yhdessä) |
Virtanastat¶
3.3V — säädelty 3,3 V:n kisko. Jopa 250 mA käytettävissä lisälaitteille (vähemmän, jos microSD-kortti on käytössä). Toisin kuin uudemmissa kameroissa, tämä nasta on kaksisuuntainen — katso alla oleva varoitus.
VIN — 3,6–5 V:n tulo. Syöttää levylle virtaa sisäisen säätimen kautta.
GND — yhteinen maa.
Muista
Kun sekä USB että VIN ovat läsnä, kumpi tahansa, jolla on korkeampi jännite, syöttää levylle virtaa — sisäiset diodit valitsevat yksinkertaisesti vahvemman kiskon.
Varoitus
Voit halutessasi syöttää M4:lle virtaa johtamalla 3,3 V suoraan 3.3V-nastaan, jos et halua käyttää sisäistä säädintä. Siinä tapauksessa älä myöskään syötä VIN- tai USB-virtaa samanaikaisesti — säätimen takaa syöttäminen toisen virtalähteen ollessa aktiivinen voi vaurioittaa ja tuhota kameran pysyvästi.
Vihje
Käytä akun keston arvioijaa mallintaaksesi, kuinka kauan M4 toimii akulla tietyllä aktiivisuuden ja syväunen käyttöjaksolla.
Palautus- ja vianetsintänastat¶
RESET — vedä GND:hen nollataksesi levyn. Sen vapauttaminen antaa MCU:n käynnistyä normaalisti.
BOOT0 — vedä 3,3 V:hen samalla kun syötät levylle virtaa siirtyäksesi STM32:n ROM-käynnistyslataimeen (DFU-tila). OpenMV IDE käyttää tätä tilaa sisäisen käynnistyslataimen uudelleenflashaamiseen.
SWCLK ja SWDIO on tuotu esiin tavallisina liitinnastoina (ei erillistä SWD-liitintä). Kytke RESET, SWCLK, SWDIO, GND ja 3,3 V ST‑LINK- tai SEGGER J‑Link -sovittimeen levyn vianetsintää varten.
Sisäänrakennetut oheislaitteet¶
LEDit¶
M4:ssä on yksi käyttäjän RGB-LED sekä pari suuritehoista 850 nm:n IR-LEDiä:
Käyttäjän RGB-LED — ohjelmistolla ohjattava, tuotu esiin nimillä
LED_RED,LED_GREENjaLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
IR-LEDit — molempia LEDejä ohjataan yhdessä
LED_IR-nastan kautta.LED_IRon kytketty laitteistossa aktiiviseksi korkealla, kun taas laiteohjelmisto käsittelee kaikkia muita sisäisiä LEDejä aktiivisina matalalla, joten käytä menetelmiälow()/high()mieluummin kuinon()/off()(jotka kääntäisivät merkityksen):from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
Kamerasensori¶
Mukana toimitettavaa sensoria (OV7725 vakiolevyissä, OV2640 hyvin varhaisissa versioissa) ohjataan csi — kennot-moduulin kautta:
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()
Sensori on juotettu kiinni levyyn M4:ssä — se ei ole vaihdettavassa moduulissa.
Muista
OV7725-levyissä sensorin FSIN (kehystahdistus) -nasta on kytketty MCU:hun, mutta sille ei ole lisätty laiteohjelmiston tukea.
OV2640-levyissä sensorin STROBE-, FREX (kehyksen valotus) - ja EXPST (valotuksen nollaus) -nastat on kytketty MCU:hun, mutta niille ei ole lisätty laiteohjelmiston tukea.
Servoliittimet¶
Levyn taustapuolella on kaksi servoliittimen juotostyynyä, jotka tuovat esiin tavanomaisen 3‑nastaisen servoliittimen (signaali / VIN / GND) nastoille P7 ja P8. Signaalinastat kytkeytyvät suoraan TIM4:n kanaviin 1 ja 2 (samat kanavat, joita pyb.Servo käyttää), ja kunkin liittimen V+-nasta on kytketty suoraan VIN:iin, joten servot ottavat virtansa tulokiskosta eivätkä 3,3 V:n säätimestä.
Juota pari kulmaista 3‑nastaista liitintä tyynyihin ja kytke kaksi harrastusservoa pan‑and‑tilt‑telineen ohjaamiseksi:
from pyb import Servo
pan = Servo(1) # P7 — TIM4 CH1
tilt = Servo(2) # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)
microSD-kortti¶
Kun kortti asetetaan paikalleen, se liitetään automaattisesti kohtaan /sdcard ja sitä voi käyttää tavallisen tiedostojärjestelmän kautta:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Väyläviite¶
GPIO¶
Käytä machine.Pin lukeaksesi tai ohjataksesi mitä tahansa silkkipainettua nastaa. Lähdöt ovat 3,3 V CMOS, 5 V:n sietoiset tulopuolella, ja voivat upottaa/lähettää jopa 25 mA nastaa kohti (yhteensä 120 mA koko liittimessä).
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())
Mikä tahansa tulonasta voi myös laukaista keskeytyksen reunatransitioissa:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Väylä |
TX |
RX |
|---|---|---|
UART3 |
P4 |
P5 |
from machine import UART
uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
Väylä |
SCL |
SDA |
|---|---|---|
I2C2 |
P4 |
P5 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Samaa laitteistoa voi käyttää myös kohdetilassa (slave) machine.I2CTarget -rajapinnan kautta tuodaksesi muistialueen toisen I²C-ohjaimen käyttöön:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
Väylä |
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¶
Väylä |
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 ja DAC¶
P6 on ainoa käyttäjän analoginen nasta. Sitä voi käyttää joko 12‑bittisenä ADC-tulona tai DAC-lähtönä.
ADC — täysi asteikko 3,3 V:ssa nastassa:
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 —
pyb.DAC-luokan kautta. 8‑bittinen arvo kattaa 0–3,3 V:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
ADC- tai DAC-tilassa P6 on vain 3,3 V:n sietoinen — älä syötä siihen 5 V:tä.
PWM¶
Nasta |
Ajastin / kanava |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
Muista
TIM1 on varattu laiteohjelmiston käyttöön kamerasensorin pikselikellon tuottamiseen, joten TIM1:n kanavia, jotka ovat fyysisesti nastoissa P0/P1/P2, ei voi käyttää käyttäjän PWM:ään rikkomatta kameraa.
TIM4 on jaettu pyb.Servo -luokan kanssa — servon luominen konfiguroi koko ajastimen uudelleen 50 Hz:n toimintaan, joten älä sekoita machine.PWM -käyttöä nastoissa P7/P8 pyb.Servo -luokan kanssa samassa skriptissä.
Ohjaa mitä tahansa niistä machine.PWM -luokan kautta:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Ohjelmistolla bittipuksutetut väylät¶
machine.SoftI2C ja machine.SoftSPI toimivat millä tahansa GPIO:lla, jos tarvitset ylimääräisen väylän.
Lämpösensori (levyn ulkopuolella)¶
Laiteohjelmisto sisältää fir — lämpösensorin ajuri (fir == far infrared) -ajurin ulkoisesti kytketyille lämpökameroille:
MLX90621 — 16 × 4 IR-matriisi
MLX90640 — 32 × 24 IR-matriisi
MLX90641 — 16 × 12 IR-matriisi
AMG8833 — 8 × 8 IR-matriisi
Kytke moduuli levyn I²C-väylään ja lue kehyksiä komennoilla 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())
fir-ajuri kommunikoi sensorin kanssa vain I²C 2 -väylän kautta — kytke moduuli nastoihin P4 (SCL) ja P5 (SDA).
Ajoitus¶
time¶
time -moduuli kattaa estävät viiveet, monotoniset tikit ja kuluneen ajan mittauksen:
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)
Virtuaaliset ajastimet¶
machine.Timer ajoittaa jaksoittaisia tai kertaluonteisia takaisinkutsuja kuluttamatta laitteistoajastimen paikkaa. Anna -1 id:nä käyttääksesi virtuaalista (ohjelmistollista) ajastinta:
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"))
Jaksoarvot ovat millisekunteina. Kutsu deinit() pysäyttääksesi ajastimen ja vapauttaaksesi paikan.
Reaaliaikakello¶
machine.RTC pitää yllä seinäkelloaikaa nollausten yli:
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())
Vahtikoira¶
machine.WDT nollaa levyn, jos sovellus jumiutuu. Kun se on käynnistetty, sitä ei voi pysäyttää tai konfiguroida uudelleen — syötä sitä jaksoittain pääsilmukassasi:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Käynnistys- ja ajonaikainen tieto¶
USB-käynnistyslataimen aikaikkuna¶
Jokaisen käynnistyksen yhteydessä kamera ajaa lyhyen käynnistyslataimen (muutaman sekunnin), joka antaa OpenMV IDE:n päivittää laiteohjelmiston ilman, että käyttäjän tarvitsee siirtyä DFU-tilaan. Aikaikkunan päätyttyä käynnistyslatain luovuttaa hallinnan tiedostolle boot.py ja sitten tiedostolle main.py.
Ajossa oleva skripti voi siirtyä uudelleen käynnistyslataimeen pyydettäessä kutsumalla machine.bootloader()
import machine
machine.bootloader()
Tiedostojärjestelmä ja käynnistysjärjestys¶
M4:n laiteohjelmisto liittää käynnistyksen yhteydessä jopa kolme tiedostojärjestelmää:
Sisäinen flash-muisti — aina liitettynä kohtaan
/flash. Sisältää oletuksena tiedostotmain.pyjaREADME.txt; luodaan aivan ensimmäisellä käynnistyksellä.microSD-kortti — jos kortti on asetettu paikalleen, se liitetään kohtaan
/sdcard.ROMFS — vain luku, muistiin kartoitettu tiedostojärjestelmä kohdassa
/rom, jota käytetään suurten data-aineistojen (esim. tekoälymallien) toimittamiseen, jotka hyötyvät nollakopiointipääsystä. MicroPython liittää sen automaattisesti käynnistyksen yhteydessä, ennen kuin mitään käyttäjän Python-koodia ajetaan.
Liittämisen jälkeen työhakemistoksi asetetaan /sdcard, kun kortti on paikallaan, muuten /flash. Tulkki ajaa tämän jälkeen skriptit kyseisestä hakemistosta:
boot.pysuoritetaan jokaisen pehmeän nollauksen yhteydessä (kylmäkäynnistys,Ctrl‑DREPL:stä tai aina kun ajossa oleva skripti palaa).main.pysuoritetaan vain kylmäkäynnistyksellä, heti tiedostonboot.pyjälkeen. Seuraavat pehmeät nollaukset ajavat tiedostonboot.pyuudelleen, mutta siirtyvät suoraan REPL:iin — ajaaksesi tiedostonmain.pyuudelleen sinun on nollattava levy täysin.
Tiedoston boot.py tai main.py pudottaminen SD-kortille ohittaa flash-muistissa olevan kopion koskematta siihen — molempia tiedostoja etsitään käynnistyshakemistosta (/sdcard kun kortti on liitettynä, muuten /flash).
Tuoreesti flashatulla levyllä toimitettu oletustiedosto main.py vain vilkuttaa käyttäjän RGB-LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), jotta voit kertoa laiteohjelmiston käynnistyneen puhtaasti ilman mitään isäntää kytkettynä.
sys.path -muuttujaa laajennetaan sisältämään kaikki kolme tiedostojärjestelmää ja niiden lib/-alihakemistot, joten tuotavat moduulit voivat sijaita kohteissa /flash/lib, /sdcard/lib tai /rom/lib.
Pakottaaksesi järjestelmän ohittamaan asetetun SD-kortin (esimerkiksi ajaaksesi flash-muistin tiedoston main.py vaikka kortti olisi paikallaan), luo tyhjä tiedosto nimeltä SKIPSD kohteen /flash juureen.
USB:n kautta yhdistettäessä käynnistystiedostojärjestelmä (/sdcard jos kortti on paikallaan, muuten /flash) näkyy myös USB-massamuistiasemana isäntäkoneella, jolloin voit muokata tiedostoja boot.py, main.py ja mitä tahansa muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollaamista, jotta isäntä kirjoittaa välimuistissa olevat muutokset levylle.
Muista
Koska käyttöjärjestelmä käsittelee asemaa passiivisena lohkolaitteena, OpenMV Camilla ajettavan koodin luomat tai muokkaamat tiedostot eivät näy ennen kuin isäntä liittää aseman uudelleen. Jos sekä käyttöjärjestelmä että OpenMV Cam kirjoittavat samaa tiedostojärjestelmää samanaikaisesti, käyttöjärjestelmä voittaa ja korvaa kameran tekemät muutokset. Käytä SD-korttia kaikkeen dataan, jonka skripti kirjoittaa takaisin, ja liitä asema uudelleen ennen kuin luet näitä tiedostoja isännältä.
Muista
Käyttäjän RGB-LEDin punainen kanava voi syttyä hetkellisesti, kun isäntä lukee USB-massamuistiasemalta tai kirjoittaa sille — tämä on laiteohjelmiston ohjaama toiminnan ilmaisin, ei vika.
Tallennustilan koot¶
M4 toimitetaan seuraavin tallennustiloin:
/flash— 32 KB FAT-tiedostojärjestelmä, luku/kirjoitus./rom— 128 KB vain luku, muistiin kartoitettu ROMFS./sdcard— minkä tahansa asetetun microSD-kortin koko täysmäärä (kun paikallaan), luku/kirjoitus.
Hard fault -ilmaisin¶
Jos käyttäjän RGB-LED kiertää nopeasti kaikkien värien läpi — niin nopeasti, että se näyttää yleensä tuikkivalta valkoiselta LEDiltä erottuvien sävyjen sijaan — laiteohjelmisto on kohdannut palautumattoman hard faultin. Flashaa laiteohjelmisto uudelleen palautuaksesi; jos uudelleenflashaaminen ei auta, levy voi olla fyysisesti vaurioitunut.
Ohjelmistokirjastot¶
Katso kirjastohakemistosta täydellinen luettelo moduuleista — mukaan lukien ne, jotka ovat ainutlaatuisia M4-koonnokselle.