OpenMV N6

OpenMV N6 dibangun di sekitar STMicroelectronics STM32N657 (Cortex‑M55 @ 800 MHz) dengan NPU on‑chip 1 GHz yang memiliki rating 600 GOPS INT8. Papan ini memadukan NPU dengan sensor global‑shutter PAG7936 1 MP pada carrier yang dapat dilepas, gigabit Ethernet, USB‑C kecepatan tinggi, Wi‑Fi, dan Bluetooth 5.1, serta menjalankan inferensi YOLOv8/YOLOv11 pada 30 FPS bersamaan dengan streaming video langsung.

OpenMV N6

Untuk datasheet lengkap, foto, dan dimensi, lihat halaman produk OpenMV N6.

Sorotan Utama

  • STM32N657 Cortex‑M55 pada 800 MHz (1280 DMIPS) dengan ARM Helium 128‑bit SIMD — throughput vektor 6,4 gigaops.

  • NPU 1 GHz, 600 GOPS INT8 — menjalankan deteksi YOLOv8/YOLOv11 pada 30 FPS.

  • ISP untuk RAW Bayer hingga 5MP, 2D GPU untuk penskalaan dan rotasi 3D, enkode H.264 hingga 1080p, dan codec JPEG berbasis hardware.

  • 64 MB SDRAM eksternal (16‑bit @ 200 MHz DDR, 800 MB/s) ditambah 4,2 MB SRAM internal dan 32 MB flash oktal (200 MHz DDR, 400 MB/s).

  • Sensor global‑shutter warna 1 MP PAG7936.

  • IMU onboard (akselerometer + giroskop) dan mikrofon untuk fusi audio + gerak.

  • USB‑C kecepatan tinggi (480 Mb/s, batas arus 1,5 A), gigabit Ethernet (mendukung PoE via shield), Wi‑Fi a/b/g/n + Bluetooth 5.1 (antena chip atau opsi U.FL).

  • Soket microSD — SD hingga 2 GB, SDHC hingga 32 GB, SDXC hingga 2 TB.

  • Pengisi daya LiPo (fast charge 500 mA), ADC tegangan baterai, RTC dengan 8 KB RAM cadangan dan pin baterai cadangan tersendiri.

  • 18 pin I/O, semua 3,3 V output / toleran 3,3 V, 20 mA per pin, mendukung interupsi.

  • LED RGB pengguna, tombol pengguna, dan LED status terpisah untuk pengisian daya / USB / daya VIN.

Peringatan

Pin I/O N6 tidak toleran terhadap 5 V. Jangan hubungkan perangkat ini langsung ke MCU 5 V seperti Arduino Mega. Daya N6 hanya melalui VIN.

Pinout

OpenMV N6 PAG7936 Pinout

Referensi pin

Nama pin

Fungsi

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 (tidak ada ADC pada pin ini — lihat P6_ADC)

P6_ADC

input ADC 12‑bit khusus (terhubung secara internal ke P6)

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2 / sinkronisasi bingkai I/O

P11

wakeup (aktif low, WKUP3)

P12

RESET — hubungkan ke GND untuk mereset papan (bukan GPIO)

P13

UART7 RX

P14

UART7 TX

P15

SPI4 CS

P16

SPI4 SCK

P17

SPI4 MISO

P18

SPI4 MOSI

SW

tombol pengguna (aktif low)

ONOFF (SW2)

tombol wakeup deep‑sleep (aktif low, WKUP2)

ST

low pada daya VIN, high pada daya USB

CHG

aktif‑low; low saat baterai LiPo yang terhubung sedang mengisi daya

PG

aktif‑low; low ketika daya VIN atau USB tersedia

BAT_ADC

saluran ADC internal yang mengukur tegangan baterai LiPo yang terpasang

LED_RED

saluran merah LED RGB (aktif low)

LED_GREEN

saluran hijau LED RGB (aktif low)

LED_BLUE

saluran biru LED RGB (aktif low)

Catatan

Jalur frame‑sync P10 adalah bus bersama. Jalur ini terhubung ke MCU, pin trigger/eksposur sensor kamera, dan header pengguna secara bersamaan. Arahnya ditentukan oleh aplikasi — MCU, sensor, atau sinyal eksternal dapat mengendarai jalur tersebut tergantung pada konfigurasi sensor (beberapa sensor dapat menggunakan pin yang sama sebagai input trigger atau output eksposur). Pastikan hanya satu driver yang aktif dalam satu waktu.

Catatan

ONOFF dan P11 merujuk ke rel RAW yang selalu aktif (bukan rel 3,3 V yang diaktifkan), sehingga keduanya tetap berfungsi saat bagian lain papan berada dalam mode deep sleep / daya rendah. Kedua input bersifat aktif low.

Pin-pin ini melewati level shifter sehingga dapat beroperasi pada rel RAW. Jika Anda benar-benar membutuhkan perilaku GPIO langsung 3,3 V pada ONOFF atau P11 (misalnya untuk menggerakkannya dari MCU 3,3 V tanpa melewati shifter), papan ini menyediakan pad pull‑up dan jumper 0‑ohm yang memungkinkan Anda melewati shifter. Ini adalah modifikasi hardware tingkat lanjut — sebagian besar pengguna sebaiknya membiarkannya.

Catatan

P15–P18 berbagi dengan Gigabit Ethernet PHY, yang terpasang dan aktif secara default. Untuk menggunakan pin-pin ini sebagai I/O pengguna, Anda harus mereflow resistor 0‑ohm di bagian belakang papan ke posisi GPIO. Ini hanya menonaktifkan gigabit Ethernet — Ethernet 10/100 Mb/s tetap bekerja pada pin khususnya.

Pin daya

  • 3.3V — rel 3,3 V yang diatur. Hanya output pada N6 — jangan masukkan daya eksternal ke pin ini. Tersedia hingga 1 A untuk shield.

  • VIN — input 5 V. Memberi daya pada papan dan pengisi daya LiPo onboard.

  • RAW — input/output, selalu aktif (3,6 V – 5 V). Membawa sumber daya mana pun yang aktif (VIN, USB, atau baterai yang terpasang), dan juga dapat digunakan sebagai input. Anda harus menggunakan dioda seri saat menyuplai daya ke RAW — jika tidak, arus akan mengalir kembali ke VIN/USB dan merusak suplai atau proteksi onboard.

  • GND — ground bersama.

Catatan

Chip manajemen daya onboard secara otomatis memilih USB atau VIN yang memiliki tegangan lebih tinggi untuk memberi daya pada papan dan pengisi baterai. Jika LiPo terpasang, baterai akan mengisi daya pada headroom yang tersisa, dan kontroler beralih ke baterai untuk menjaga papan tetap berjalan jika VIN/USB turun atau dicabut.

Catatan

Bagian belakang papan memiliki pad solder untuk baterai cadangan RTC 3,3 V eksternal. Menghubungkan sel koin ke pad ini menjaga RTC dan 8 KB RAM cadangan tetap berjalan saat bagian lain papan tidak mendapat daya.

Tip

Gunakan estimator umur baterai untuk memodelkan berapa lama N6 akan berjalan pada baterai untuk siklus aktif / deep-sleep tertentu.

Pin Ethernet

N6 mengekspos pasangan MDI Ethernet PHY pada pad khusus di sebelah header GPIO. Pin MDI tidak aman untuk langsung dihubungkan ke RJ45 — magnetics Ethernet (transformator isolasi, baik yang terintegrasi dalam magjack maupun pada shield) diperlukan antara PHY dan kabel. Shield PoE OpenMV sudah menyertakannya; jika Anda membuat jack sendiri, gunakan RJ45 terintegrasi magnetics atau transformator eksternal.

  • ETH_LED — LED tautan/aktivitas. Aktif low saat tautan terhubung; berkedip saat ada lalu lintas.

  • DA P / DA N — pasangan A (TX pada 10/100, digunakan oleh semua kecepatan).

  • DB P / DB N — pasangan B (RX pada 10/100, digunakan oleh semua kecepatan).

  • DC P / DC N — pasangan C, hanya digunakan pada gigabit.

  • DD P / DD N — pasangan D, hanya digunakan pada gigabit.

10/100 Mb/s hanya membutuhkan pasangan A dan B. Gigabit membutuhkan semua empat pasangan A–D.

Pin pemulihan dan debug

  • RESET — hubungkan ke GND untuk mereset papan. Melepasnya memungkinkan MCU untuk memulai secara normal.

  • BOOT0 — hubungkan ke 3,3 V saat menghidupkan papan untuk masuk ke mode bootloader ROM. OpenMV IDE menggunakan mode ini untuk mem-flash ulang bootloader onboard.

  • BOOT1 — sakelar yang menempatkan papan ke mode developer untuk digunakan dengan tooling ST (ST‑LINK yang terhubung ke header SWD/JTAG ARM 10‑pin). Biarkan ini dinonaktifkan untuk operasi normal dengan firmware dan tool OpenMV.

Header SWD/JTAG ARM 10‑pin khusus sudah dipasang, kompatibel dengan adaptor ST‑LINK dan SEGGER J‑Link.

Periferal onboard

LED

N6 memiliki dua LED RGB:

  • LED RGB Pengguna — dapat dikontrol oleh perangkat lunak, diekspos sebagai LED_RED, LED_GREEN, dan LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • LED Daya — digerakkan langsung oleh hardware manajemen daya onboard, tanpa kontrol perangkat lunak. Gunakan untuk melihat kondisi suplai daya secara sekilas.

    Saat berjalan:

    Saluran

    Makna

    Biru

    VIN memberi daya pada papan (mati saat USB)

    Hijau

    Daya USB atau VIN tersedia

    Merah

    mengisi daya baterai LiPo yang terpasang

    Dalam deep sleep semua saluran mati kecuali Merah, yang masih menyala saat LiPo sedang mengisi daya.

Tombol pengguna

N6 memiliki dua tombol:

  • SW — tombol pengguna serbaguna. Aktif saat ditarik ke low.

  • ONOFF (SW2) — tombol wakeup. Satu-satunya tombol yang dapat membawa papan keluar dari deep sleep.

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

Untuk menempatkan papan ke deep sleep dan membiarkan ONOFF (SW2) membangunkannya kembali, cukup panggil machine.deepsleep() — tidak diperlukan konfigurasi wakeup, tombol terhubung langsung ke input WKUP2:

import machine

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

Anda juga dapat menggunakan ONOFF sebagai sakelar daya lunak. Picu pada tepi rising — jalur menjadi high setelah pengguna melepas tombol, sehingga penekanan berikutnya adalah sinyal wake yang jelas:

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.

Pin status daya

Tiga input status aktif‑low memungkinkan firmware melihat apa yang dilakukan chip manajemen daya onboard:

  • ST — low saat papan berjalan pada VIN, high saat berjalan pada daya USB.

  • CHG — low saat baterai LiPo yang terpasang sedang mengisi daya.

  • PG — low ketika daya VIN atau USB tersedia.

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

Sensor kamera

PAG7936 digerakkan melalui modul csi --- sensor kamera

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

Sensor terletak pada modul yang dapat dilepas — tukar dengan salah satu modul kamera OpenMV lainnya (global shutter, termal, resolusi lebih tinggi, dll.) tanpa mengubah bagian papan yang lain.

PAG7936 mendukung mode trigger — integrasi piksel bersesuaian tepat dengan setiap panggilan csi.CSI.snapshot daripada clock bingkai yang berjalan bebas, berguna untuk menyinkronkan pengambilan gambar ke suatu peristiwa eksternal atau sensor lain. Aktifkan melalui csi.CSI.ioctl dengan csi.IOCTL_SET_TRIGGERED_MODE. Laju bingkai turun sekitar setengah dari mode free-running karena readout tidak lagi di-pipeline dengan integrasi bingkai berikutnya:

cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)

NPU

NPU Neural‑ART 1 GHz N6 (600 GOPS INT8) diekspos melalui modul ml --- Machine Learning. Model yang disimpan di filesystem read-only /rom dimuat langsung dari flash tanpa menyalin ke RAM, sehingga bahkan detektor besar pun dapat ditampung dengan nyaman bersamaan dengan buffer bingkai langsung. Jalankan detektor YOLOv8 pada setiap bingkai dan gambar prediksi di atas citra langsung:

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

Mikrofon onboard ditangkap melalui audio --- Modul Audio. Setiap buffer hadir sebagai bytearray PCM signed 16‑bit, yang memudahkan pengumpanan ke ulab/numpy untuk DSP cepat. Detektor kenyaringan sederhana — cetak setiap kali volume RMS melewati ambang batas:

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

Akselerometer + giroskop onboard di bawah modul kamera diekspos melalui imu --- sensor imu

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

CYW43439 onboard diekspos melalui network --- konfigurasi jaringan sebagai antarmuka station. Setelah terhubung, ipconfig("addr4") mengembalikan pasangan (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

CYW43439 yang sama juga mengekspos Bluetooth 5.1. Gunakan aioble --- Async BLE untuk BLE yang ramah asyncio — misalnya, beriklan sebagai periferal dan tunggu central untuk terhubung:

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

Ketika RJ45 (dengan magnetics) terhubung ke pad MDI, PHY gigabit muncul sebagai antarmuka LAN. DHCP berjalan secara otomatis setelah tautan terhubung:

import network, time

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

Kartu microSD

Ketika kartu dimasukkan, kartu tersebut akan dipasang secara otomatis di /sdcard dan dapat digunakan melalui sistem file biasa:

import os

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

Referensi bus

GPIO

Gunakan machine.Pin untuk membaca atau menggerakkan salah satu pin yang tercetak di silkscreen. Output adalah 3,3 V CMOS dan dapat sink/source hingga 20 mA per pin.

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

Setiap pin input juga dapat memicu interupsi pada transisi tepi:

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

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

UART

Bus

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

Bus

SCL

SDA

I2C2

P4

P5

from machine import I2C

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

Hardware yang sama juga dapat digunakan dalam mode target (slave) melalui machine.I2CTarget untuk mengekspos wilayah memori ke kontroler I²C lainnya:

from machine import I2CTarget

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

SPI

Bus

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

Bus

TX

RX

CAN1

P2

P3

Catatan

CAN belum didukung pada papan ini di 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

Kedua saluran ADC melewati pembagi tegangan yang di-buffer dengan op‑amp sebelum mencapai MCU, sehingga read_u16() dipetakan ke tegangan input full‑scale yang berbeda pada setiap pin.

Pin

Full‑scale

Catatan

P6_ADC

~3,3 V

pad serbaguna, terhubung secara internal ke P6

BAT_ADC

~5,0 V

saluran internal untuk baterai LiPo

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

Pin

Timer / saluran

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM12 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2

Gerakkan salah satunya melalui machine.PWM

from machine import Pin, PWM

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

Bus software bit‑banged

machine.SoftI2C dan machine.SoftSPI bekerja pada GPIO mana pun jika Anda membutuhkan bus tambahan.

Sensor termal (off‑board)

Firmware menyertakan driver fir --- driver sensor termal (fir == far infrared) untuk imager termal yang dihubungkan secara eksternal:

  • MLX90621 — array IR 16 × 4

  • MLX90640 — array IR 32 × 24

  • MLX90641 — array IR 16 × 12

  • AMG8833 — array IR 8 × 8

Hubungkan modul ke bus I²C papan dan baca bingkai dengan 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())

Driver fir hanya berkomunikasi dengan sensor melalui I²C 2 — hubungkan modul ke P4 (SCL) dan P5 (SDA).

Penentuan waktu

time

Modul time mencakup penundaan blocking, tick monotonic, dan pengukuran waktu yang berlalu:

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)

Timer virtual

machine.Timer menjadwalkan callback periodik atau one‑shot tanpa mengkonsumsi slot timer hardware. Berikan -1 sebagai id untuk menggunakan timer virtual (perangkat lunak):

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

Nilai periode dalam milidetik. Panggil deinit() untuk menghentikan dan melepaskan slot.

Real‑time clock

machine.RTC menjaga waktu jam dinding melewati reset dan (dengan baterai cadangan 3,3 V opsional yang dihubungkan ke pad belakang, lihat Pin daya) melewati kehilangan daya penuh:

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 juga berjalan melalui deep sleep, sehingga Anda dapat menggunakannya sebagai sumber wakeup untuk machine.deepsleep().

Watchdog

machine.WDT mereset papan jika aplikasi hang. Setelah dimulai, watchdog tidak dapat dihentikan atau dikonfigurasi ulang — beri makan secara berkala di dalam loop utama Anda:

from machine import WDT

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

Info boot dan runtime

Jendela bootloader USB

Pada setiap power‑up, kamera menjalankan bootloader singkat (beberapa detik) yang memungkinkan OpenMV IDE memperbarui firmware tanpa pengguna harus masuk ke mode DFU. Setelah jendela berakhir, bootloader menyerahkan ke boot.py lalu ke main.py.

Skrip yang sedang berjalan dapat masuk kembali ke bootloader sesuai permintaan dengan memanggil machine.bootloader()

import machine

machine.bootloader()

Filesystem dan urutan boot

Firmware N6 memasang hingga tiga filesystem saat boot:

  • Flash internal — selalu dipasang di /flash. Menyimpan main.py dan README.txt secara default; dibuat pada boot pertama.

  • Kartu microSD — jika kartu dimasukkan, kartu dipasang di /sdcard.

  • ROMFS — filesystem read‑only, memory‑mapped di /rom yang digunakan untuk mengirimkan aset data besar (misalnya model AI) yang mendapat manfaat dari akses zero‑copy. Dipasang secara otomatis oleh MicroPython saat startup, sebelum Python pengguna mana pun berjalan.

Setelah pemasangan, direktori kerja diatur ke /sdcard saat kartu tersedia, jika tidak ke /flash. Interpreter kemudian menjalankan skrip dari direktori tersebut:

  • boot.py dijalankan pada setiap soft reset (cold boot, Ctrl‑D dari REPL, atau setiap kali skrip yang berjalan kembali).

  • main.py dijalankan hanya pada cold boot, segera setelah boot.py. Soft reset berikutnya menjalankan ulang boot.py tetapi langsung ke REPL — untuk menjalankan ulang main.py Anda harus mereset papan sepenuhnya.

Meletakkan boot.py atau main.py ke kartu SD akan mengganti salinan di flash tanpa menyentuhnya — kedua file dicari di direktori boot (/sdcard saat kartu dipasang, jika tidak /flash).

main.py default yang dikirimkan pada papan yang baru di-flash hanya mengedipkan saluran biru LED RGB pengguna sebagai heartbeat (dua pulsa pendek, jeda pendek), sehingga Anda dapat mengetahui bahwa firmware telah boot dengan bersih tanpa host yang terpasang.

sys.path diperluas untuk menyertakan ketiga filesystem dan subdirektori lib/-nya, sehingga modul yang dapat diimpor dapat berada di /flash/lib, /sdcard/lib, atau /rom/lib.

Untuk memaksa sistem mengabaikan kartu SD yang dimasukkan (misalnya untuk menjalankan main.py flash meskipun ada kartu), buat file kosong bernama SKIPSD di root /flash.

Ketika terhubung melalui USB, filesystem boot (/sdcard jika ada kartu, jika tidak /flash) juga dihitung sebagai drive USB mass‑storage di host, memungkinkan Anda mengedit boot.py, main.py, dan file lain secara langsung. Eject drive sebelum mereset kamera agar host membuang penulisan yang di-cache.

Catatan

Karena OS memperlakukan drive sebagai perangkat blok pasif, file yang dibuat atau dimodifikasi oleh kode yang berjalan pada OpenMV Cam tidak akan muncul sampai host me-mount ulang drive. Jika OS dan OpenMV Cam menulis filesystem yang sama secara bersamaan, OS akan menang dan menimpa perubahan yang dibuat oleh kamera. Gunakan kartu SD untuk data apa pun yang ditulis kembali oleh skrip, dan mount ulang sebelum membaca file tersebut dari host.

Catatan

Saluran merah LED RGB pengguna mungkin menyala sebentar saat host membaca dari atau menulis ke drive USB mass‑storage — ini adalah indikator aktivitas yang digerakkan firmware, bukan kesalahan.

Ukuran penyimpanan

N6 dikirimkan dengan:

  • /flash — filesystem FAT 4 MB, baca/tulis.

  • /rom — ROMFS read-only yang dipetakan ke memori 24 MB, digunakan untuk mengirimkan skrip dan model ML yang mendapat manfaat dari akses mmap zero-copy.

  • /sdcard — ukuran penuh kartu microSD yang dimasukkan (jika ada), baca/tulis.

Indikator hard‑fault

Jika LED RGB pengguna berputar cepat melalui semua warna — cukup cepat sehingga cenderung terlihat seperti LED putih berkelip daripada warna yang berbeda — firmware telah mengalami hard fault yang tidak dapat dipulihkan. Flash ulang firmware untuk memulihkan; jika mem-flash ulang tidak membantu, papan mungkin rusak secara fisik.

Pustaka perangkat lunak

Lihat indeks library untuk daftar lengkap modul — termasuk yang unik untuk build N6.