OpenMV N6

OpenMV N6 är byggd kring STMicroelectronics STM32N657 (Cortex‑M55 @ 800 MHz) med en 1 GHz inbyggd NPU på 600 GOPS INT8. Kortet kombinerar NPU:n med PAG7936 1 MP global‑shutter‑sensorn på en avtagbar bärare, gigabit‑Ethernet, USB‑C high‑speed, Wi‑Fi och Bluetooth 5.1, och kör YOLOv8/YOLOv11‑inferens vid 30 FPS samtidigt som live‑video strömmas.

OpenMV N6

För fullständigt datablad, foton och mått, se produktsidan för OpenMV N6.

Höjdpunkter

  • STM32N657 Cortex‑M55 vid 800 MHz (1280 DMIPS) med ARM Helium 128‑bitars SIMD — 6,4 gigaops vektorgenomströmning.

  • 1 GHz NPU, 600 GOPS INT8 — kör YOLOv8/YOLOv11‑detektering vid 30 FPS.

  • ISP för upp till 5 MP RAW Bayer, 2D‑GPU för skalning och 3D‑rotation, H.264‑kodning till 1080p, och hårdvaru‑JPEG‑codec.

  • 64 MB externt SDRAM (16‑bitars @ 200 MHz DDR, 800 MB/s) plus 4,2 MB internt SRAM och 32 MB oktalt flashminne (200 MHz DDR, 400 MB/s).

  • PAG7936 1 MP global‑shutter‑sensor i färg.

  • Inbyggd IMU (accelerometer + gyroskop) och mikrofon för ljud‑ och rörelsefusion.

  • High‑speed USB‑C (480 Mb/s, strömgräns på 1,5 A), gigabit‑Ethernet (PoE‑kapabel via shield), Wi‑Fi a/b/g/n + Bluetooth 5.1 (chipantenn eller U.FL‑alternativ).

  • microSD‑uttag — SD upp till 2 GB, SDHC upp till 32 GB, SDXC upp till 2 TB.

  • LiPo‑laddare (500 mA snabbladdning), ADC för batterispänning, RTC med 8 KB backup‑RAM och ett dedikerat stift för backup‑batteri.

  • 18 I/O‑stift, alla 3,3 V utgång / 3,3 V toleranta, 20 mA per stift, avbrottskapabla.

  • Användar‑RGB‑LED, användarknapp och en separat status‑LED för laddning / USB / VIN‑ström.

Varning

N6:ans I/O‑stift är inte 5 V‑toleranta. Anslut inte enheten direkt till en 5 V‑MCU som Arduino Mega. Strömförsörj N6 enbart via VIN.

Stiftschema

OpenMV N6 PAG7936 stiftschema

Stiftreferens

Stiftnamn

Funktion

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 (ingen ADC på detta stift — se P6_ADC)

P6_ADC

dedikerad 12‑bitars ADC‑ingång (internt kopplad till P6)

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2 / frame sync‑I/O

P11

wakeup (aktiv låg, WKUP3)

P12

RESET — dra till GND för att återställa kortet (inte en GPIO)

P13

UART7 RX

P14

UART7 TX

P15

SPI4 CS

P16

SPI4 SCK

P17

SPI4 MISO

P18

SPI4 MOSI

SW

användarknapp (aktiv låg)

ONOFF (SW2)

wakeup‑knapp för djupsömn (aktiv låg, WKUP2)

ST

låg vid VIN‑ström, hög vid USB‑ström

CHG

aktiv låg; låg medan ett anslutet LiPo‑batteri laddas

PG

aktiv låg; låg när VIN‑ eller USB‑ström är närvarande

BAT_ADC

intern ADC‑kanal som mäter spänningen i det anslutna LiPo‑batteriet

LED_RED

RGB‑LED:ens röda kanal (aktiv låg)

LED_GREEN

RGB‑LED:ens gröna kanal (aktiv låg)

LED_BLUE

RGB‑LED:ens blå kanal (aktiv låg)

Anteckning

P10 frame‑sync‑linjen är en delad buss. Den är kopplad till MCU:n, kamerasensorns trigger‑/exponeringsstift och användarens header på en och samma gång. Riktningen är applikationsdefinierad — MCU:n, sensorn eller en extern signal kan driva den beroende på hur sensorn är konfigurerad (vissa sensorer kan använda samma stift som triggeringång eller exponeringsutgång). Se till att endast en drivare är aktiv åt gången.

Anteckning

ONOFF och P11 är refererade till den alltid‑på RAW‑skenan (inte den växlade 3,3 V‑skenan), så de förblir funktionella medan resten av kortet är i djupsömn / lågeffektsläge. Båda ingångarna är aktiva låga.

Dessa stift går genom nivåomvandlare så att de kan ligga på RAW‑skenan. Om du absolut behöver 3,3 V‑direkt GPIO‑beteende på ONOFF eller P11 (till exempel för att driva dem från en 3,3 V‑MCU utan att gå genom omvandlaren), exponerar kortet pull‑up‑ och 0‑ohms‑bygelplattor som låter dig kringgå omvandlaren. Detta är en avancerad hårdvaruombyggnad — de flesta användare bör låta det vara.

Anteckning

P15–P18 delas med Gigabit‑Ethernet‑PHY:n, som är inkopplad och aktiv som standard. För att använda dessa stift som användar‑I/O måste du löda om 0‑ohms‑motståndet på baksidan av kortet till GPIO‑positionen. Detta inaktiverar endast gigabit‑Ethernet — 10/100 Mb/s‑Ethernet fortsätter att fungera på sina dedikerade stift.

Strömstift

  • 3.3V — reglerad 3,3 V‑skena. Endast utgång på N6 — mata inte extern ström in i detta stift. Upp till 1 A tillgängligt för shields.

  • VIN — 5 V‑ingång. Strömförsörjer kortet och den inbyggda LiPo‑laddaren.

  • RAW — in‑/utgång, alltid‑på (3,6 V – 5 V). Bär den källa som är aktiv (VIN, USB eller anslutet batteri), och kan också användas som ingång. Du måste driva RAW genom en seriediod när du matar ström in i den — annars kommer ström att flöda tillbaka in i VIN/USB och skada strömkällan eller det inbyggda skyddet.

  • GND — gemensam jord.

Anteckning

Den inbyggda strömhanteringskretsen väljer automatiskt den av USB eller VIN som har högst spänning för att strömförsörja kortet och batteriladdaren. Om ett LiPo är anslutet laddas det med den överblivna marginalen, och styrenheten faller tillbaka till batteriet för att hålla kortet igång om VIN/USB sjunker eller kopplas ur.

Anteckning

Baksidan av kortet har lödplattor för ett externt 3,3 V RTC‑backup‑batteri. Att koppla en knappcell till dessa plattor håller RTC:n och 8 KB backup‑RAM igång medan resten av kortet är strömlöst.

Tips

Använd batterilivslängdsuppskattaren för att modellera hur länge N6 kommer att köra på ett batteri vid en given aktiv/djupsömns‑arbetscykel.

Ethernet‑stift

N6 exponerar Ethernet‑PHY:ns MDI‑par på dedikerade plattor bredvid GPIO‑headern. MDI‑stiften är inte säkra att koppla direkt till en RJ45 — Ethernet‑magnetik (en isolationstransformator, antingen inbyggd i ett magjack eller på shieldet) krävs mellan PHY:n och kabeln. OpenMV PoE‑shieldet inkluderar dem; om du bygger ditt eget uttag, använd en RJ45 med integrerad magnetik eller en extern transformator.

  • ETH_LED — link‑/aktivitets‑LED. Aktiv låg när en länk är uppe; blinkar vid trafik.

  • DA P / DA N — par A (TX i 10/100, används av alla hastigheter).

  • DB P / DB N — par B (RX i 10/100, används av alla hastigheter).

  • DC P / DC N — par C, används endast vid gigabit.

  • DD P / DD N — par D, används endast vid gigabit.

10/100 Mb/s behöver endast paren A och B. Gigabit behöver alla fyra paren A–D.

Återställnings‑ och felsökningsstift

  • RESET — dra till GND för att återställa kortet. När den släpps får MCU:n starta upp normalt.

  • BOOT0 — dra till 3,3 V medan kortet strömförsörjs för att gå in i ROM‑startladdarläge. OpenMV IDE använder detta läge för att flasha om den inbyggda startladdaren.

  • BOOT1 — strömbrytare som försätter kortet i utvecklarläge för användning med ST:s verktyg (en ST‑LINK ansluten till ARM 10‑stifts SWD/JTAG‑headern). Låt denna vara inaktiverad för normal drift med OpenMV‑firmware och ‑verktyg.

En dedikerad ARM 10‑stifts SWD/JTAG‑header är monterad, kompatibel med ST‑LINK‑ och SEGGER J‑Link‑adaptrar.

Inbyggd kringutrustning

LED:ar

N6 har två RGB‑LED:ar:

  • Användar‑RGB‑LED — mjukvarustyrbar, exponerad som LED_RED, LED_GREEN och LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • Ström‑LED — drivs direkt av den inbyggda strömhanteringshårdvaran, ingen mjukvarustyrning. Använd den för att med ett ögonkast läsa av vad strömförsörjningen gör.

    Under körning:

    Kanal

    Betydelse

    Blå

    VIN strömförsörjer kortet (av vid USB)

    Grön

    USB‑ eller VIN‑ström närvarande

    Röd

    laddar ett anslutet LiPo‑batteri

    I djupsömn är alla kanaler släckta utom Röd, som fortfarande lyser medan ett LiPo laddas.

Användarknappar

N6 har två knappar:

  • SW — generell användarknapp. Aktiv när den dras låg.

  • ONOFF (SW2) — wakeup‑knapp. Den enda knappen som kan väcka kortet ur djupsömn.

from machine import Pin

sw    = Pin("SW",    Pin.IN)   # user button
onoff = Pin("ONOFF", Pin.IN)   # SW2 — wakes from deep sleep
print(sw.value(), onoff.value())

För att försätta kortet i djupsömn och låta ONOFF (SW2) väcka det igen, anropa bara machine.deepsleep() — ingen wakeup‑konfiguration krävs, knappen är kopplad direkt till WKUP2‑ingången:

import machine

machine.deepsleep()   # press ONOFF (SW2) to wake the board

Du kan också koppla upp ONOFF som en mjuk strömbrytare. Trigga på den stigande flanken — linjen lägger sig hög efter att användaren släpper knappen, så nästa tryck är otvetydigt en wakeup‑händelse:

import machine
from machine import Pin

def power_off(_):
    machine.deepsleep()

Pin("ONOFF", Pin.IN).irq(power_off, Pin.IRQ_RISING)

# ...rest of the application runs here. Press ONOFF once to sleep,
# press it again to wake.

Strömstatus‑stift

Tre aktiva låga statusingångar låter firmware se vad den inbyggda strömhanteringskretsen gör:

  • ST — låg när kortet körs på VIN, hög när det körs på USB‑ström.

  • CHG — låg medan ett anslutet LiPo‑batteri laddas.

  • PG — låg när VIN‑ eller USB‑ström är närvarande.

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()

Kamerasensor

PAG7936 drivs genom modulen csi — kamerasensorer

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()

Sensorn sitter på en avtagbar modul — byt ut den mot vilken som helst av de andra OpenMV‑kameramodulerna (global shutter, termisk, högre upplösning osv.) utan att ändra resten av kortet.

PAG7936 stöder triggat läge — pixelintegrationen ställs in exakt mot varje csi.CSI.snapshot‑anrop snarare än den fritt löpande bildrutsklockan, vilket är användbart för att synkronisera tagningen mot en extern händelse eller en annan sensor. Aktivera det genom csi.CSI.ioctl med csi.IOCTL_SET_TRIGGERED_MODE. Bildhastigheten sjunker till ungefär hälften av det fritt löpande läget eftersom utläsningen inte längre pipelinas med nästa bildrutas integration:

cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)

NPU

N6:ans 1 GHz Neural‑ART NPU (600 GOPS INT8) exponeras genom modulen ml — Maskininlärning. Modeller som lagras på det skrivskyddade /rom‑filsystemet laddas direkt från flashminnet utan att kopieras till RAM, så även stora detektorer ryms bekvämt jämte den levande bildbufferten. Kör en YOLOv8‑detektor på varje bildruta och rita ut prediktionerna ovanpå den levande bilden:

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")

Mikrofon

Den inbyggda mikrofonen fångas genom audio — Ljudmodul. Varje buffert anländer som en signerad 16‑bitars PCM‑bytearray, vilket gör det trivialt att mata in den i ulab/numpy för snabb DSP. En enkel ljudstyrkedetektor — skriv ut när RMS‑volymen passerar ett tröskelvärde:

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

Den inbyggda accelerometern + gyroskopet under kameramodulen exponeras genom imu — imu-sensor

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

Den inbyggda CYW43439 exponeras via network — nätverkskonfiguration som ett station‑gränssnitt. Efter anslutning returnerar ipconfig("addr4") paret (ip, netmask)

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

Samma CYW43439 exponerar även Bluetooth 5.1. Använd aioble — Asynkron BLE för asyncio‑vänlig BLE — annonsera till exempel som en kringutrustning och vänta på att en central ansluter:

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

När en RJ45 (med magnetik) är ansluten till MDI‑plattorna visas gigabit‑PHY:n som ett LAN‑gränssnitt. DHCP körs automatiskt när länken kommer upp:

import network, time

lan = network.LAN()
lan.active(True)
while not lan.isconnected():
    time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])

microSD‑kort

När ett kort sätts i monteras det automatiskt på /sdcard och är användbart genom det vanliga filsystemet:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

Bussreferens

GPIO

Använd machine.Pin för att läsa eller driva något av de tryckmärkta stiften. Utgångar är 3,3 V CMOS och kan sänka/leverera upp till 20 mA per stift.

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())

Vilket ingångsstift som helst kan också utlösa ett avbrott vid flanktransitioner:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Buss

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

Buss

SCL

SDA

I2C2

P4

P5

from machine import I2C

i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

Samma hårdvara kan också användas i target‑läge (slav) genom machine.I2CTarget för att exponera en minnesregion för en annan I²C‑styrenhet:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

SPI

Buss

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

Buss

TX

RX

CAN1

P2

P3

Anteckning

CAN stöds ännu inte på detta kort i firmware 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

Båda ADC‑kanalerna går genom en op‑amp‑buffrad spänningsdelare innan de når MCU:n, så read_u16() mappas till olika fullskaleinspänning på varje stift.

Stift

Fullskala

Anmärkningar

P6_ADC

~3,3 V

generell platta, internt kopplad till P6

BAT_ADC

~5,0 V

intern kanal för LiPo‑batteriet

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

Stift

Timer / kanal

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM12 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2

Driv någon av dem via machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("P6"), freq=1_000, duty_u16=32768)

Mjukvaru‑bit‑bangade bussar

machine.SoftI2C och machine.SoftSPI fungerar på vilken GPIO som helst om du behöver en extra buss.

Termisk sensor (extern)

Firmware inkluderar drivrutinen fir — drivrutin för värmesensor (fir == far infrared) för externt kopplade termiska bildtagare:

  • MLX90621 — 16 × 4 IR‑array

  • MLX90640 — 32 × 24 IR‑array

  • MLX90641 — 16 × 12 IR‑array

  • AMG8833 — 8 × 8 IR‑array

Koppla modulen till kortets I²C‑buss och läs bildrutor med 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‑drivrutinen kommunicerar endast med sensorn över I²C 2 — koppla modulen till P4 (SCL) och P5 (SDA).

Tidtagning

time

Modulen time täcker blockerande fördröjningar, monotona ticks och mätning av förfluten tid:

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)

Virtuella timrar

machine.Timer schemalägger periodiska eller engångsåteranrop utan att förbruka en hårdvarutimerplats. Skicka -1 som id för att använda en virtuell (mjukvaru‑)timer:

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"))

Periodvärden anges i millisekunder. Anropa deinit() för att stoppa och frigöra platsen.

Realtidsklocka

machine.RTC håller väggklockans tid över återställningar och (med det valfria 3,3 V backup‑batteriet kopplat till plattorna på baksidan, se Strömstift) över fullständigt strömbortfall:

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:n körs även genom djupsömn, så du kan använda den som wakeup‑källa för machine.deepsleep().

Watchdog

machine.WDT återställer kortet om applikationen hänger sig. När den väl startats kan den inte stoppas eller omkonfigureras — mata den periodiskt inuti din huvudloop:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Boot‑ och körningsinformation

USB‑startladdarfönster

Vid varje uppstart kör kameran en kort startladdare (några sekunder) som låter OpenMV IDE uppdatera firmware utan att användaren behöver gå in i DFU‑läge. När fönstret löper ut lämnar startladdaren över till boot.py och därefter main.py.

Ett körande skript kan återgå till startladdaren på begäran genom att anropa machine.bootloader()

import machine

machine.bootloader()

Filsystem och boot‑ordning

N6:ans firmware monterar upp till tre filsystem vid boot:

  • Internt flashminne — alltid monterat på /flash. Innehåller main.py och README.txt som standard; skapas vid allra första uppstarten.

  • microSD‑kort — om ett kort sätts i monteras det på /sdcard.

  • ROMFS — skrivskyddat, minnesmappat filsystem på /rom som används för att leverera stora datatillgångar (t.ex. AI‑modeller) som drar nytta av kopiefri åtkomst. Monteras automatiskt av MicroPython vid start, innan någon användar‑Python körs.

Efter montering sätts arbetskatalogen till /sdcard när kortet är närvarande, annars /flash. Tolken kör sedan skript från den katalogen:

  • boot.py körs vid varje mjuk återställning (kallstart, Ctrl‑D från REPL, eller närhelst det körande skriptet returnerar).

  • main.py körs endast vid kallstart, omedelbart efter boot.py. Efterföljande mjuka återställningar kör om boot.py men går direkt till REPL — för att köra om main.py måste du återställa kortet fullständigt.

Att lägga en boot.py eller main.py på SD‑kortet åsidosätter kopian i flashminnet utan att röra den — båda filerna slås upp i boot‑katalogen (/sdcard när kortet är monterat, annars /flash).

Den förvalda main.py som levereras på ett nyflashat kort blinkar bara användar‑RGB‑LED:ens blå kanal som en puls (två korta pulser, kort uppehåll), så att du kan se att firmware bootade rent utan någon ansluten värd.

sys.path utökas till att inkludera alla tre filsystem och deras lib/‑underkataloger, så importerbara moduler kan ligga i /flash/lib, /sdcard/lib eller /rom/lib.

För att tvinga systemet att ignorera ett isatt SD‑kort (till exempel för att köra flash‑main.py även med ett kort isatt), skapa en tom fil med namnet SKIPSD i roten av /flash.

När den är ansluten över USB visas även boot‑filsystemet (/sdcard om ett kort är närvarande, annars /flash) som en USB‑masslagringsenhet på värden, vilket låter dig redigera boot.py, main.py och vilka andra filer som helst direkt. Mata ut enheten innan du återställer kameran så att värden tömmer sina cachade skrivningar.

Anteckning

Eftersom operativsystemet behandlar enheten som en passiv blockenhet visas inte filer som skapats eller ändrats av kod som körs på OpenMV Cam förrän värden monterar om enheten. Om både operativsystemet och OpenMV Cam skriver till samma filsystem samtidigt vinner operativsystemet och skriver över ändringar gjorda av kameran. Använd SD‑kortet för all data som skriptet skriver tillbaka, och montera om innan du läser dessa filer från värden.

Anteckning

Användar‑RGB‑LED:ens röda kanal kan kortvarigt lysa upp medan värden läser från eller skriver till USB‑masslagringsenheten — detta är en firmware‑driven aktivitetsindikator, inte ett fel.

Lagringsstorlekar

N6 levereras med:

  • /flash4 MB FAT‑filsystem, läs/skriv.

  • /rom24 MB skrivskyddat minnesmappat ROMFS, används för att leverera skript och ML‑modeller som drar nytta av kopiefri mmap‑åtkomst.

  • /sdcard — full storlek på det microSD‑kort som är isatt (när det är närvarande), läs/skriv.

Indikator för hard‑fault

Om användar‑RGB‑LED:en snabbt cyklar genom alla färger — tillräckligt snabbt för att det tenderar att se ut som en glittrande vit LED snarare än distinkta färgtoner — har firmware drabbats av ett oåterhämtningsbart hard‑fault. Flasha om firmware för att återhämta dig; om omflashning inte hjälper kan kortet vara fysiskt skadat.

Mjukvarubibliotek

Se biblioteksindexet för den fullständiga listan över moduler — inklusive vilka som är unika för N6‑bygget.