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.

OpenMV N6

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

OpenMV N6 PAG7936 -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)

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_GREEN ja LED_BLUE

    from 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.

Käyttäjäpainikkeet

N6:ssa on kaksi painiketta:

  • SW — yleiskäyttöinen käyttäjäpainike. Aktiivinen kun vedetään matalalle.

  • ONOFF (SW2) — herätyspainike. Ainoa painike, joka voi herättää kortin syväunesta.

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

Asettaaksesi kortin syväuneen ja antaaksesi ONOFF:in (SW2) herättää sen takaisin, kutsu vain machine.deepsleep() — herätyskonfiguraatiota ei tarvita, painike on kytketty suoraan WKUP2-tuloon:

import machine

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

Voit myös kytkeä ONOFF:in ohjelmistovirtakytkimeksi. Laukaise nousevalla reunalla — linja asettuu korkealle käyttäjän vapautettua painikkeen, joten seuraava painallus on yksiselitteisesti herätystapahtuma:

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.

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 tiedostot main.py ja README.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.py suoritetaan jokaisella pehmeällä nollauksella (kylmäkäynnistys, Ctrl‑D REPL:stä tai aina kun käynnissä oleva skripti palaa).

  • main.py suoritetaan vain kylmäkäynnistyksellä, heti tiedoston boot.py jälkeen. Myöhemmät pehmeät nollaukset ajavat uudelleen tiedoston boot.py, mutta putoavat suoraan REPL:iin — ajaaksesi tiedoston main.py uudelleen 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:

  • /flash4 MB FAT-tiedostojärjestelmä, luku/kirjoitus.

  • /rom24 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.