OpenMV N6¶
OpenMV N6 perustuu STMicroelectronicsin STM32N657-piiriin (Cortex‑M55 @ 800 MHz), jossa on 1 GHz:n sirun sisäinen NPU teholla 600 GOPS INT8. Kortti yhdistää NPU:n PAG7936 1 MP global‑shutter -sensoriin irrotettavalla kantajalla, gigabitin Ethernetin, USB‑C high‑speedin, Wi‑Fin sekä Bluetooth 5.1:n, ja suorittaa YOLOv8/YOLOv11-päättelyä 30 FPS:llä rinnakkain live-videon suoratoiston kanssa.
Täydellinen datalehti, valokuvat ja mitat löytyvät OpenMV N6 -tuotesivulta.
Kohokohdat¶
STM32N657 Cortex‑M55 800 MHz:llä (1280 DMIPS), mukana ARM Helium 128‑bittinen SIMD — 6,4 gigaopsin vektoriläpäisykyky.
1 GHz NPU, 600 GOPS INT8 — suorittaa YOLOv8/YOLOv11-tunnistusta 30 FPS:llä.
ISP jopa 5 MP:n RAW Bayer -kuville, 2D GPU skaalaukseen ja 3D-kiertoon, H.264-koodaus 1080p:hen sekä laitteistopohjainen JPEG-koodekki.
64 MB ulkoista SDRAM-muistia (16‑bittinen @ 200 MHz DDR, 800 MB/s) sekä 4,2 MB sisäistä SRAM-muistia ja 32 MB octal flash-muistia (200 MHz DDR, 400 MB/s).
PAG7936 1 MP:n väri-global‑shutter -sensori.
Sisäänrakennettu IMU (kiihtyvyysanturi + gyroskooppi) ja mikrofoni äänen ja liikkeen yhdistämiseen.
High‑speed USB‑C (480 Mb/s, 1,5 A virtaraja), gigabitin Ethernet (PoE-yhteensopiva shieldin kautta), Wi‑Fi a/b/g/n + Bluetooth 5.1 (siruantenni tai U.FL-vaihtoehto).
microSD-paikka — SD jopa 2 GB, SDHC jopa 32 GB, SDXC jopa 2 TB.
LiPo-laturi (500 mA pikalataus), akkujännitteen ADC, RTC jossa 8 KB varmuusmuistia ja oma varmuusakun nasta.
18 I/O-nastaa, kaikki 3,3 V lähtö / 3,3 V sietävät, 20 mA per nasta, keskeytyskykyiset.
Käyttäjän RGB-LED, käyttäjäpainike ja erillinen tila-LED lataukselle / USB:lle / VIN-virralle.
Varoitus
N6:n I/O-nastat eivät siedä 5 V:tä. Älä yhdistä laitetta suoraan 5 V:n mikro-ohjaimeen kuten Arduino Megaan. Syötä N6:lle virtaa vain VIN:in kautta.
Nastat¶
Nastaviite¶
Nastan nimi |
Toiminto |
|---|---|
P0 |
SPI2 MOSI / I2S2 SDO |
P1 |
SPI2 MISO / I2S2 SDI |
P2 |
SPI2 SCLK / UART4 TX / CAN1 TX / I2S2 CK |
P3 |
SPI2 SS / UART4 RX / CAN1 RX / I2S2 WS |
P4 |
I2C2 SCL / UART3 TX / TIM2 CH3 / I3C2 SCL |
P5 |
I2C2 SDA / UART3 RX / TIM2 CH4 / I3C2 SDA |
P6 |
TIM12 CH1 (ei ADC:tä tällä nastalla — katso |
P6_ADC |
oma 12‑bittinen ADC-tulo (kytketty sisäisesti P6:een) |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM17 CH1 |
P10 |
TIM15 CH2 / kehyssynkronoinnin I/O |
P11 |
herätys (aktiivinen matalalla, WKUP3) |
P12 |
RESET — vedä GND:hen nollataksesi kortin (ei GPIO) |
P13 |
UART7 RX |
P14 |
UART7 TX |
P15 |
SPI4 CS |
P16 |
SPI4 SCK |
P17 |
SPI4 MISO |
P18 |
SPI4 MOSI |
SW |
käyttäjäpainike (aktiivinen matalalla) |
ONOFF (SW2) |
syväunesta herätyksen painike (aktiivinen matalalla, WKUP2) |
ST |
matala VIN-virralla, korkea USB-virralla |
CHG |
aktiivinen matalalla; matala kun kytketty LiPo-akku latautuu |
PG |
aktiivinen matalalla; matala kun VIN- tai USB-virta on saatavilla |
BAT_ADC |
sisäinen ADC-kanava joka mittaa kytketyn LiPo-akun jännitettä |
LED_RED |
RGB-LEDin punainen kanava (aktiivinen matalalla) |
LED_GREEN |
RGB-LEDin vihreä kanava (aktiivinen matalalla) |
LED_BLUE |
RGB-LEDin sininen kanava (aktiivinen matalalla) |
Muista
P10:n kehyssynkronointilinja on jaettu väylä. Se on kytketty samanaikaisesti mikro-ohjaimeen, kamerasensorin trigger‑/valotusnastaan ja käyttäjäliittimeen. Suunta on sovelluskohtainen — mikro-ohjain, sensori tai ulkoinen signaali voi ohjata sitä riippuen siitä, miten sensori on konfiguroitu (jotkin sensorit voivat käyttää samaa nastaa trigger-tulona tai valotuslähtönä). Varmista, että vain yksi ohjaaja on aktiivinen kerrallaan.
Muista
ONOFF ja P11 viitataan aina päällä olevaan RAW-kiskoon (eivät kytkettyyn 3,3 V:n kiskoon), joten ne pysyvät toimintakykyisinä, kun muu kortti on syväunessa / matalan tehon tilassa. Molemmat tulot ovat aktiivisia matalalla.
Nämä nastat kulkevat tasonsiirtimien läpi, jotta ne voivat toimia RAW-kiskolla. Jos tarvitset ehdottomasti 3,3 V:n suoraa GPIO-käyttäytymistä ONOFF- tai P11-nastassa (esimerkiksi ohjataksesi niitä 3,3 V:n mikro-ohjaimesta ilman siirrintä), kortilla on ylösvetö- ja 0‑ohmin jumper-tyynyt, joilla siirtimen voi ohittaa. Tämä on edistynyt laitteistomuokkaus — useimpien käyttäjien kannattaa jättää se rauhaan.
Muista
P15–P18 on jaettu Gigabit Ethernet PHY:n kanssa, joka on kytketty ja oletuksena aktiivinen. Käyttääksesi näitä nastoja käyttäjän I/O:na sinun on uudelleenjuotettava kortin takana oleva 0‑ohmin vastus GPIO-asentoon. Tämä poistaa käytöstä vain gigabitin Ethernetin — 10/100 Mb/s Ethernet toimii edelleen omilla nastoillaan.
Virtanastat¶
3.3V — säädelty 3,3 V:n kisko. N6:ssa vain lähtö — älä syötä ulkoista virtaa tähän nastaan. Jopa 1 A saatavilla shieldeille.
VIN — 5 V:n tulo. Syöttää virtaa kortille ja sisäänrakennetulle LiPo-laturille.
RAW — tulo/lähtö, aina päällä (3,6 V – 5 V). Kuljettaa kulloinkin aktiivisen lähteen (VIN, USB tai kytketty akku), ja sitä voi käyttää myös tulona. RAW:ia on ohjattava sarjadiodin kautta, kun siihen syötetään virtaa — muuten virta valuu takaisin VIN:iin/USB:hen ja vahingoittaa syöttöä tai sisäänrakennettua suojausta.
GND — yhteinen maa.
Muista
Sisäänrakennettu virranhallintapiiri valitsee automaattisesti sen lähteen USB:stä tai VIN:istä, jolla on korkeampi jännite, syöttääkseen virtaa kortille ja akkulaturille. Jos LiPo on kytketty, se latautuu jäljelle jäävällä marginaalilla, ja ohjain siirtyy takaisin akkuun pitääkseen kortin käynnissä, jos VIN/USB laskee tai irrotetaan.
Muista
Kortin takana on juotostyynyt ulkoiselle 3,3 V:n RTC-varmuusakulle. Nappipariston kytkeminen näihin tyynyihin pitää RTC:n ja 8 KB:n varmuusmuistin käynnissä, kun muu kortti on virrattomana.
Vihje
Käytä akun keston arviointityökalua mallintaaksesi, kuinka kauan N6 toimii akulla tietyllä aktiivisen / syväunen työsuhteella.
Ethernet-nastat¶
N6 tuo Ethernet PHY:n MDI-parit esiin omilla tyynyillä GPIO-liittimen vieressä. MDI-nastoja ei ole turvallista kytkeä suoraan RJ45:een — Ethernet-magnetiikka (eristysmuuntaja, joko magjackiin sisäänrakennettu tai shieldillä) on pakollinen PHY:n ja kaapelin välissä. OpenMV PoE -shield sisältää sen; jos teet oman liittimen, käytä magnetiikalla varustettua RJ45:tä tai ulkoista muuntajaa.
ETH_LED — linkin/aktiivisuuden LED. Aktiivinen matalalla kun linkki on pystyssä; vilkkuu liikenteen aikana.
DA P / DA N — pari A (TX 10/100:ssa, käytössä kaikilla nopeuksilla).
DB P / DB N — pari B (RX 10/100:ssa, käytössä kaikilla nopeuksilla).
DC P / DC N — pari C, käytössä vain gigabitillä.
DD P / DD N — pari D, käytössä vain gigabitillä.
10/100 Mb/s tarvitsee vain parit A ja B. Gigabit tarvitsee kaikki neljä paria A–D.
Palautus- ja debug-nastat¶
RESET — vedä GND:hen nollataksesi kortin. Vapauttaminen antaa mikro-ohjaimen käynnistyä normaalisti.
BOOT0 — vedä 3,3 V:iin korttia virroittaessasi siirtyäksesi ROM-käynnistyslataintilaan. OpenMV IDE käyttää tätä tilaa sisäänrakennetun käynnistyslataimen uudelleenflashaukseen.
BOOT1 — kytkin, joka asettaa kortin kehittäjätilaan ST:n työkalujen kanssa käytettäväksi (ARM 10‑nastaiseen SWD/JTAG-liittimeen kytketty ST‑LINK). Jätä tämä pois käytöstä normaalia käyttöä varten OpenMV-laiteohjelmiston ja -työkalujen kanssa.
Oma ARM 10‑nastainen SWD/JTAG -liitin on asennettu, yhteensopiva ST‑LINK- ja SEGGER J‑Link -adaptereiden kanssa.
Sisäänrakennetut oheislaitteet¶
LEDit¶
N6:ssa on kaksi RGB-LEDiä:
Käyttäjän RGB-LED — ohjelmallisesti ohjattava, esitetty muodossa
LED_RED,LED_GREENjaLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Virta-LED — ohjataan suoraan sisäänrakennetulla virranhallintalaitteistolla, ei ohjelmallista ohjausta. Käytä sitä nähdäksesi yhdellä silmäyksellä, mitä syöttö tekee.
Käytön aikana:
Kanava
Merkitys
Sininen
VIN syöttää kortille virtaa (pois päältä USB:llä)
Vihreä
USB- tai VIN-virta saatavilla
Punainen
kytketty LiPo-akku latautuu
Syväunessa kaikki kanavat ovat pois päältä punaista lukuun ottamatta, joka palaa edelleen LiPon latautuessa.
Virran tilanastat¶
Kolme aktiivisesti matalalla olevaa tilatuloa antaa laiteohjelmiston nähdä, mitä sisäänrakennettu virranhallintapiiri tekee:
ST — matala kun kortti toimii VIN:illä, korkea kun toimii USB-virralla.
CHG — matala kun kytketty LiPo-akku latautuu.
PG — matala kun VIN- tai USB-virta on saatavilla.
from machine import Pin
on_vin = not Pin("ST", Pin.IN).value()
charging = not Pin("CHG", Pin.IN).value()
power_ok = not Pin("PG", Pin.IN).value()
Kamerasensori¶
PAG7936:ta ohjataan csi — kennot -moduulin kautta:
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.HD) # 1280×800
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
Sensori sijaitsee irrotettavassa moduulissa — vaihda se mihin tahansa muuhun OpenMV-kameramoduuliin (global shutter, lämpö, korkeampi resoluutio jne.) muuttamatta muuta korttia.
PAG7936 tukee triggeröityä tilaa — pikseli-integraatio kohdistuu täsmälleen jokaiseen csi.CSI.snapshot-kutsuun vapaasti käyvän kehyskellon sijaan, mikä on hyödyllistä kaappauksen synkronoinnissa ulkoiseen tapahtumaan tai toiseen sensoriin. Ota se käyttöön csi.CSI.ioctl-kutsulla parametrilla csi.IOCTL_SET_TRIGGERED_MODE. Kehysnopeus laskee noin puoleen vapaasti käyvästä tilasta, koska luku ei enää limity seuraavan kehyksen integraation kanssa:
cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)
NPU¶
N6:n 1 GHz:n Neural‑ART NPU (600 GOPS INT8) on esitetty ml — Koneoppiminen -moduulin kautta. Vain luettavalla /rom-tiedostojärjestelmällä tallennetut mallit latautuvat suoraan flash-muistista kopioimatta RAM:iin, joten jopa suuret tunnistimet mahtuvat mukavasti live-kehyspuskurin rinnalle. Suorita YOLOv8-tunnistin jokaiselle kehykselle ja piirrä ennusteet live-kuvan päälle:
import csi
import time
import ml
from ml.postprocessing.ultralytics import YoloV8
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
# Load YOLO V8 model from ROM FS.
model = ml.Model("/rom/yolov8n_192.tflite", postprocess=YoloV8(threshold=0.4))
print(model)
# Visualization parameters.
n = len(model.labels)
model_class_colors = [
(int(255 * i // n), int(255 * (n - i - 1) // n), 255)
for i in range(n)
]
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# boxes is a list of list per class of ((x, y, w, h), score) tuples
boxes = model.predict([img])
# Draw bounding boxes around the detected objects
for i, class_detections in enumerate(boxes):
rects = [r for r, score in class_detections]
labels = [model.labels[i] for j in range(len(rects))]
colors = [model_class_colors[i] for j in range(len(rects))]
ml.utils.draw_predictions(img, rects, labels, colors, format=None)
print(clock.fps(), "fps")
Mikrofoni¶
Sisäänrakennettu mikki kaapataan audio — Audio-moduuli -moduulin kautta. Jokainen puskuri saapuu etumerkillisenä 16‑bittisenä PCM bytearray-objektina, mikä tekee triviaaliksi syöttää se ulab/numpy -moduuliin nopeaa DSP:tä varten. Yksinkertainen äänekkyyden tunnistin — tulosta aina kun RMS-äänenvoimakkuus ylittää kynnysarvon:
import audio
from ulab import numpy as np
def loudness(pcmbuf):
samples = np.array(np.frombuffer(pcmbuf, dtype=np.int16), dtype=np.float)
rms = np.sqrt(np.mean(samples ** 2))
if rms > 10000:
print("Loud!", int(rms))
audio.init(channels=1, frequency=16000, gain_db=24)
audio.start_streaming(loudness)
while True:
pass
IMU¶
Kameramoduulin alla oleva sisäänrakennettu kiihtyvyysanturi + gyroskooppi on esitetty imu — imu-sensori -moduulin kautta:
import imu
import time
while True:
print(imu.acceleration_mg()) # (x, y, z) in milli‑g
print(imu.angular_rate_mdps()) # (x, y, z) in milli‑deg/s
time.sleep_ms(100)
Wi‑Fi¶
Sisäänrakennettu CYW43439 on esitetty network — verkkomääritykset -moduulin kautta asema-rajapintana. Yhdistämisen jälkeen ipconfig("addr4") palauttaa (ip, netmask) -parin:
import network, time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Bluetooth¶
Sama CYW43439 tuo esiin myös Bluetooth 5.1:n. Käytä aioble — Asynkroninen BLE -moduulia asyncio-ystävälliseen BLE:hen — esimerkiksi mainosta itseäsi oheislaitteena ja odota keskuksen yhdistävän:
import asyncio
import aioble
async def run():
while True:
conn = await aioble.advertise(250_000, name="OpenMV-N6")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
Ethernet¶
Kun RJ45 (magnetiikalla) on kytketty MDI-tyynyihin, gigabit-PHY näkyy LAN-rajapintana. DHCP käynnistyy automaattisesti, kun linkki nousee pystyyn:
import network, time
lan = network.LAN()
lan.active(True)
while not lan.isconnected():
time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])
microSD-kortti¶
Kun kortti asetetaan, se liitetään automaattisesti polkuun /sdcard ja on käytettävissä tavallisen tiedostojärjestelmän kautta:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Väyläviite¶
GPIO¶
Käytä machine.Pin -luokkaa lukeaksesi tai ohjataksesi mitä tahansa silkkipainettua nastaa. Lähdöt ovat 3,3 V CMOS ja voivat upottaa/syöttää jopa 20 mA per nasta.
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 reunan siirtymissä:
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 |
UART4 |
P2 |
P3 |
UART7 |
P14 |
P13 |
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 voidaan käyttää myös kohde- (slave) tilassa machine.I2CTarget -luokan kautta esittääksesi muistialueen toiselle I²C-ohjaimelle:
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 |
SPI4 |
P18 |
P17 |
P16 |
P15 |
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 |
|---|---|---|
CAN1 |
P2 |
P3 |
Muista
CAN:ia ei vielä tueta tällä kortilla laiteohjelmistossa v5.0.0.
from machine import CAN
can = CAN(1, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())
ADC¶
Molemmat ADC-kanavat kulkevat operaatiovahvistinpuskuroidun jännitteenjakajan läpi ennen mikro-ohjaimeen saapumista, joten read_u16() on kuvattu eri täysasteikon tulojännitteeseen kummallakin nastalla.
Nasta |
Täysasteikko |
Huomautukset |
|---|---|---|
P6_ADC |
~3,3 V |
yleiskäyttöinen tyyny, kytketty sisäisesti P6:een |
BAT_ADC |
~5,0 V |
sisäinen kanava LiPo-akulle |
from machine import ADC
import time
adc = ADC("P6_ADC")
bat = ADC("BAT_ADC")
while True:
print("P6:", adc.read_u16() * 3.3 / 65535, "V")
print("BAT:", bat.read_u16() * 5.0 / 65535, "V")
time.sleep_ms(100)
PWM¶
Nasta |
Ajastin / kanava |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM12 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM17 CH1 |
P10 |
TIM15 CH2 |
Ohjaa mitä tahansa niistä machine.PWM -luokan kautta:
from machine import Pin, PWM
pwm = PWM(Pin("P6"), freq=1_000, duty_u16=32768)
Ohjelmistolla bit-bangatut väylät¶
machine.SoftI2C ja machine.SoftSPI toimivat millä tahansa GPIO:lla, jos tarvitset ylimääräisen väylän.
Lämpösensori (kortin ulkopuolinen)¶
Laiteohjelmisto sisältää fir — lämpösensorin ajuri (fir == far infrared) -ajurin ulkoisesti kytketyille lämpökuvantajille:
MLX90621 — 16 × 4 IR-matriisi
MLX90640 — 32 × 24 IR-matriisi
MLX90641 — 16 × 12 IR-matriisi
AMG8833 — 8 × 8 IR-matriisi
Kytke moduuli kortin 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 tickit 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)
Virtuaaliajastimet¶
machine.Timer ajastaa jaksollisia tai kertaluonteisia takaisinkutsuja kuluttamatta laitteistoajastinpaikkaa. Anna -1 id:ksi käyttääksesi virtuaalista (ohjelmisto)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 ja vapauttaaksesi paikan.
Reaaliaikakello¶
machine.RTC pitää seinäkellonajan nollausten yli ja (valinnaisella 3,3 V:n varmuusakulla, joka on kytketty takatyynyihin, katso Virtanastat) täyden virtakatkon 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())
RTC toimii myös syväunen läpi, joten voit käyttää sitä herätyslähteenä machine.deepsleep() -funktiolle.
Vahtikoira¶
machine.WDT nollaa kortin, jos sovellus jumiutuu. Kun se on käynnistetty, sitä ei voi pysäyttää tai konfiguroida uudelleen — ruoki sitä säännöllisesti pääsilmukassasi:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Käynnistys- ja ajonaikatiedot¶
USB-käynnistyslataimen ikkuna¶
Jokaisella virroituksella 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. Kun ikkuna umpeutuu, käynnistyslatain luovuttaa ohjauksen tiedostolle boot.py ja sitten main.py.
Käynnissä oleva skripti voi siirtyä takaisin käynnistyslataimeen pyynnöstä kutsumalla machine.bootloader()
import machine
machine.bootloader()
Tiedostojärjestelmä ja käynnistysjärjestys¶
N6-laiteohjelmisto liittää käynnistyksessä jopa kolme tiedostojärjestelmää:
Sisäinen flash-muisti — aina liitettynä polkuun
/flash. Sisältää oletuksena tiedostotmain.pyjaREADME.txt; luodaan aivan ensimmäisellä käynnistyksellä.microSD-kortti — jos kortti on asetettu, se liitetään polkuun
/sdcard.ROMFS — vain luettava, muistiin kuvattu tiedostojärjestelmä polussa
/rom, jota käytetään suurten data-aineistojen (esim. AI-mallien) toimittamiseen, jotka hyötyvät zero-copy-pääsystä. MicroPython liittää sen automaattisesti käynnistyksessä, ennen kuin mikään käyttäjän Python ajetaan.
Liittämisen jälkeen työhakemistoksi asetetaan /sdcard, kun kortti on paikalla, muuten /flash. Tulkki ajaa sitten skriptit kyseisestä hakemistosta:
boot.pysuoritetaan jokaisella pehmeällä nollauksella (kylmäkäynnistys,Ctrl‑DREPL:stä tai aina kun käynnissä oleva skripti palaa).main.pysuoritetaan vain kylmäkäynnistyksellä, heti tiedostonboot.pyjälkeen. Myöhemmät pehmeät nollaukset ajavat uudelleen tiedostonboot.py, mutta putoavat suoraan REPL:iin — ajaaksesi tiedostonmain.pyuudelleen sinun on nollattava kortti kokonaan.
Tiedoston boot.py tai main.py pudottaminen SD-kortille ohittaa flash-muistissa olevan kopion koskematta siihen — molemmat tiedostot etsitään käynnistyshakemistosta (/sdcard kun kortti on liitetty, muuten /flash).
Vasta flashatulla kortilla toimitettu oletustiedosto main.py vain vilkuttaa käyttäjän RGB-LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), joten näet laiteohjelmiston käynnistyneen puhtaasti ilman mitään isäntää kytkettynä.
sys.path laajennetaan sisältämään kaikki kolme tiedostojärjestelmää ja niiden lib/-alihakemistot, joten tuotavat moduulit voivat sijaita poluissa /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 paikalla), luo tyhjä tiedosto nimeltä SKIPSD polun /flash juureen.
USB:n kautta yhdistettynä käynnistystiedostojärjestelmä (/sdcard jos kortti on paikalla, muuten /flash) luetteloituu isännässä myös USB-massamuistiasemana, jonka avulla voit muokata tiedostoja boot.py, main.py ja mitä tahansa muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollausta, jotta isäntä tyhjentää välimuistissa olevat kirjoitukset.
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ää samaan aikaan, käyttöjärjestelmä voittaa ja ylikirjoittaa kameran tekemät muutokset. Käytä SD-korttia kaikelle datalle, jonka skripti kirjoittaa takaisin, ja liitä asema uudelleen ennen kuin luet noita tiedostoja isännästä.
Muista
Käyttäjän RGB-LEDin punainen kanava voi syttyä hetkeksi, kun isäntä lukee tai kirjoittaa USB-massamuistiasemaan — tämä on laiteohjelmiston ohjaama aktiivisuuden ilmaisin, ei vika.
Tallennustilan koot¶
N6 toimitetaan mukana:
/flash— 4 MB FAT-tiedostojärjestelmä, luku/kirjoitus./rom— 24 MB vain luettava muistiin kuvattu ROMFS, jota käytetään sellaisten skriptien ja ML-mallien toimittamiseen, jotka hyötyvät zero-copy-mmap-pääsystä./sdcard— asetetun microSD-kortin täysi koko (kun paikalla), luku/kirjoitus.
Vakavan virheen ilmaisin¶
Jos käyttäjän RGB-LED kiertää nopeasti kaikkien värien läpi — riittävän nopeasti, että se yleensä näyttää tuikkivalta valkoiselta LEDiltä erottuvien sävyjen sijaan — laiteohjelmisto on kohdannut palautumattoman vakavan virheen. Flashaa laiteohjelmisto uudelleen palauttaaksesi; jos uudelleenflashaus ei auta, kortti voi olla fyysisesti vaurioitunut.
Ohjelmistokirjastot¶
Katso kirjastohakemisto täydellistä moduuliluetteloa varten — mukaan lukien ne, jotka ovat ainutlaatuisia N6-buildille.