OpenMV N6

OpenMV N6 побудований на базі мікроконтролера STMicroelectronics STM32N657 (Cortex‑M55 @ 800 МГц) з вбудованим NPU на 1 ГГц, розрахованим на 600 GOPS INT8. Плата поєднує NPU з датчиком PAG7936 1 МП із глобальним затвором на знімному модулі, гігабітним Ethernet, USB‑C на повній швидкості, Wi‑Fi та Bluetooth 5.1 і здатна виконувати інференс YOLOv8/YOLOv11 зі швидкістю 30 FPS паралельно з потоковим відео.

OpenMV N6

Повний технічний паспорт, фотографії та розміри дивіться на сторінці продукту OpenMV N6.

Особливості

  • STM32N657 Cortex‑M55 на 800 МГц (1280 DMIPS) з ARM Helium 128‑розрядним SIMD — 6,4 гігаопераційна векторна пропускна здатність.

  • NPU 1 ГГц, 600 GOPS INT8 — виконує виявлення YOLOv8/YOLOv11 зі швидкістю 30 FPS.

  • ISP для RAW Bayer до 5 МП, 2D GPU для масштабування та 3D-обертання, кодування H.264 до 1080p і апаратний кодек JPEG.

  • 64 МБ зовнішньої SDRAM (16‑розрядна @ 200 МГц DDR, 800 МБ/с) плюс 4,2 МБ внутрішньої SRAM і 32 МБ octal flash (200 МГц DDR, 400 МБ/с).

  • PAG7936 — кольоровий датчик 1 МП із глобальним затвором.

  • Вбудований IMU (акселерометр + гіроскоп) і мікрофон для аудіо та злиття руху.

  • USB‑C на повній швидкості (480 Мб/с, обмеження струму 1,5 А), гігабітний Ethernet (підтримка PoE через шилд), Wi‑Fi a/b/g/n + Bluetooth 5.1 (вбудована антена або варіант U.FL).

  • Слот microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.

  • Зарядний пристрій LiPo (швидка зарядка 500 мА), ADC напруги акумулятора, RTC із 8 КБ резервної RAM і окремим виводом резервного живлення.

  • 18 виводів вводу/виводу, всі з виходом 3,3 В / сумісні з 3,3 В, 20 мА на вивід, з підтримкою переривань.

  • RGB LED для користувача, кнопка користувача та окремий індикаторний LED для зарядки / USB / живлення VIN.

Попередження

Виводи вводу/виводу N6 не є сумісними з 5 В. Не підключайте пристрій безпосередньо до 5‑вольтового MCU на кшталт Arduino Mega. Живіть N6 лише через VIN.

Розпіновка

OpenMV N6 PAG7936 Pinout

Довідник виводів

Назва виводу

Функція

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 (немає ADC на цьому виводі — див. P6_ADC)

P6_ADC

виділений 12‑розрядний вхід ADC (внутрішньо підключений до P6)

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2 / синхронізація кадрів вводу/виводу

P11

пробудження (активний низький рівень, WKUP3)

P12

RESET — з’єднати з GND для скидання плати (не є GPIO)

P13

UART7 RX

P14

UART7 TX

P15

SPI4 CS

P16

SPI4 SCK

P17

SPI4 MISO

P18

SPI4 MOSI

SW

кнопка користувача (активний низький рівень)

ONOFF (SW2)

кнопка пробудження після глибокого сну (активний низький рівень, WKUP2)

ST

низький при живленні від VIN, високий при живленні від USB

CHG

активний низький; низький рівень під час зарядки підключеного акумулятора LiPo

PG

активний низький; низький рівень, коли присутнє живлення VIN або USB

BAT_ADC

внутрішній канал ADC, що вимірює напругу підключеного акумулятора LiPo

LED_RED

червоний канал RGB LED (активний низький)

LED_GREEN

зелений канал RGB LED (активний низький)

LED_BLUE

синій канал RGB LED (активний низький)

Примітка

Лінія синхронізації кадрів P10 є спільною шиною. Вона підключена до MCU, виводу тригера / витримки датчика камери та заголовка користувача одночасно. Напрямок визначається застосунком — MCU, датчик або зовнішній сигнал можуть керувати нею залежно від конфігурації датчика (деякі датчики можуть використовувати той самий вивід як вхід тригера або вихід витримки). Переконайтеся, що активний лише один драйвер одночасно.

Примітка

ONOFF і P11 відносяться до завжди увімкненої шини RAW (не до комутованої шини 3,3 В), тому вони залишаються функціональними, поки решта плати перебуває в режимі глибокого сну / низького енергоспоживання. Обидва входи активні при низькому рівні.

Ці виводи проходять через перетворювачі рівня, щоб вони могли працювати на шині RAW. Якщо вам абсолютно необхідна поведінка GPIO безпосередньо 3,3 В на ONOFF або P11 (наприклад, щоб керувати ними від MCU на 3,3 В без проходження через перетворювач), плата має підтяжні та нульові перемичкові контактні майданчики, які дозволяють обійти перетворювач. Це складна апаратна модифікація — більшість користувачів не повинні її чіпати.

Примітка

P15–P18 використовуються спільно з PHY гігабітного Ethernet, який підключений і активний за замовчуванням. Щоб використовувати ці виводи як GPIO користувача, необхідно перенести нульовий резистор на зворотній стороні плати на позицію GPIO. Це вимикає лише гігабітний Ethernet — Ethernet 10/100 Мб/с продовжує працювати на власних виводах.

Виводи живлення

  • 3.3V — стабілізована шина 3,3 В. Лише вихід на N6 — не подавайте зовнішнє живлення на цей вивід. До 1 А доступно для шилдів.

  • VIN — вхід 5 В. Живить плату та вбудований зарядний пристрій LiPo.

  • RAW — вхід/вихід, завжди увімкнений (3,6 В – 5 В). Несе будь-яке активне джерело (VIN, USB або підключений акумулятор), а також може використовуватися як вхід. Під час подачі живлення в RAW необхідно використовувати послідовний діод — інакше струм потече назад у VIN/USB і пошкодить джерело або вбудований захист.

  • GND — загальна земля.

Примітка

Вбудована мікросхема управління живленням автоматично вибирає USB або VIN з вищою напругою для живлення плати та зарядного пристрою. Якщо підключено LiPo, він заряджається на залишку напруги, а контролер переходить на акумулятор для підтримки роботи плати, якщо VIN/USB знизиться або буде відключено.

Примітка

На зворотній стороні плати є контактні майданчики для підпаювання зовнішнього резервного акумулятора RTC на 3,3 В. Підключення монетного елемента до цих майданчиків підтримує роботу RTC і 8 КБ резервної RAM, коли решта плати знеструмлена.

Порада

Використовуйте оцінювач ресурсу акумулятора для моделювання тривалості роботи N6 від акумулятора при заданому циклі активності / глибокого сну.

Виводи Ethernet

N6 виводить пари MDI PHY Ethernet на виділені майданчики поряд із заголовком GPIO. Виводи MDI не можна підключати напряму до RJ45 — між PHY та кабелем обов’язково потрібні магнітні компоненти Ethernet (трансформатор ізоляції, вбудований у magjack або на шилді). OpenMV PoE shield містить їх; якщо ви використовуєте власне гніздо, застосовуйте RJ45 із вбудованими магнітними компонентами або зовнішній трансформатор.

  • ETH_LED — LED зв’язку/активності. Активний низький рівень при наявності зв’язку; мигає при трафіку.

  • DA P / DA N — пара A (TX у 10/100, використовується на всіх швидкостях).

  • DB P / DB N — пара B (RX у 10/100, використовується на всіх швидкостях).

  • DC P / DC N — пара C, використовується лише на гігабітній швидкості.

  • DD P / DD N — пара D, використовується лише на гігабітній швидкості.

10/100 Мб/с потребує лише пар A і B. Гігабіт потребує всіх чотирьох пар A–D.

Виводи відновлення та налагодження

  • RESET — з’єднати з GND для скидання плати. Відпускання дозволяє MCU нормально стартувати.

  • BOOT0 — з’єднати з 3,3 В під час увімкнення плати для входу в режим ROM завантажувача. OpenMV IDE використовує цей режим для перепрошивки вбудованого завантажувача.

  • BOOT1 — перемикач, що переводить плату в режим розробника для використання з інструментами ST (ST‑LINK, підключений до 10‑контактного заголовка ARM SWD/JTAG). Залишайте вимкненим для звичайної роботи з мікропрограмою та інструментами OpenMV.

Встановлений виділений заголовок ARM 10‑pin SWD/JTAG, сумісний з адаптерами ST‑LINK і SEGGER J‑Link.

Вбудовані периферійні пристрої

Світлодіоди

N6 має два RGB LED:

  • RGB LED користувача — керований програмно, доступний як LED_RED, LED_GREEN і LED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • LED живлення — керується безпосередньо апаратною схемою управління живленням, без програмного контролю. Використовуйте його для швидкого визначення стану живлення.

    Під час роботи:

    Канал

    Значення

    Синій

    VIN живить плату (вимкнений при USB)

    Зелений

    Присутнє живлення USB або VIN

    Червоний

    зарядка підключеного акумулятора LiPo

    У глибокому сні всі канали вимкнені крім Червоного, який все ще світиться під час зарядки LiPo.

Кнопки користувача

N6 має дві кнопки:

  • SW — кнопка загального призначення для користувача. Активна при низькому рівні.

  • ONOFF (SW2) — кнопка пробудження. Єдина кнопка, яка може вивести плату з глибокого сну.

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

Щоб перевести плату в глибокий сон і вивести її кнопкою ONOFF (SW2), просто викличте machine.deepsleep() — жодної конфігурації пробудження не потрібно, кнопка підключена безпосередньо до входу WKUP2:

import machine

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

Ви також можете підключити ONOFF як програмний вимикач живлення. Спрацьовуйте на зростаючий фронт — лінія встановлюється у високий рівень після відпускання кнопки користувачем, тому наступне натискання однозначно є подією пробудження:

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.

Виводи стану живлення

Три входи активного низького рівня дозволяють мікропрограмі бачити, що робить вбудована мікросхема управління живленням:

  • ST — низький рівень, коли плата працює від VIN, високий — при роботі від USB.

  • CHG — низький рівень під час зарядки підключеного акумулятора LiPo.

  • PG — низький рівень при наявності живлення VIN або USB.

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

Датчик камери

PAG7936 керується через модуль csi — датчики камери

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

Датчик знаходиться на знімному модулі — замініть його на будь-який інший модуль камери OpenMV (глобальний затвор, тепловізійний, більш висока роздільна здатність тощо) без змін на решті плати.

PAG7936 підтримує режим тригера — інтеграція пікселів точно збігається з кожним викликом csi.CSI.snapshot, а не з вільно-запущеним тактовим сигналом кадру, що корисно для синхронізації захоплення із зовнішньою подією або іншим датчиком. Увімкніть це через csi.CSI.ioctl з csi.IOCTL_SET_TRIGGERED_MODE. Частота кадрів падає приблизно до половини вільно-запущеного режиму, оскільки зчитування більше не конвеєризується з інтеграцією наступного кадру:

cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)

NPU

NPU Neural‑ART на 1 ГГц N6 (600 GOPS INT8) доступний через модуль ml — Машинне навчання. Моделі, збережені у файловій системі лише для читання /rom, завантажуються безпосередньо з флеш-пам’яті без копіювання в RAM, тому навіть великі детектори легко поміщаються поряд із живим кадровим буфером. Запускайте детектор YOLOv8 на кожному кадрі та малюйте передбачення поверх живого зображення:

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

Мікрофон

Вбудований мікрофон захоплюється через audio — Аудіомодуль. Кожен буфер надходить як знакова 16‑розрядна PCM bytearray, що дозволяє легко передавати дані в ulab/numpy для швидкої обробки сигналів. Простий детектор гучності — виводити повідомлення щоразу, коли гучність RMS перевищує поріг:

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

Вбудований акселерометр + гіроскоп під модулем камери доступний через imu — датчик 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 доступний через network — налаштування мережі як інтерфейс станції. Після підключення ipconfig("addr4") повертає пару (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 також забезпечує Bluetooth 5.1. Використовуйте aioble — Async BLE для зручного з asyncio BLE — наприклад, оголошуйтеся як периферійний пристрій і чекайте підключення центрального пристрою:

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

Коли RJ45 (з магнітними компонентами) підключений до майданчиків MDI, гігабітний PHY з’являється як інтерфейс LAN. DHCP запускається автоматично після встановлення зв’язку:

import network, time

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

Карта microSD

Коли картка вставлена, вона автоматично монтується в /sdcard і доступна через звичайну файлову систему:

import os

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

Довідник шин

GPIO

Використовуйте machine.Pin для читання або керування будь-яким із шовкографічних виводів. Виходи — 3,3 В CMOS і можуть поглинати/забезпечувати до 20 мА на вивід.

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

Будь-який вхідний вивід також може викликати переривання на фронтах сигналу:

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

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

UART

Шина

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

Шина

SCL

SDA

I2C2

P4

P5

from machine import I2C

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

Те саме апаратне забезпечення також може використовуватися в режимі ведений (slave) через machine.I2CTarget для відкриття доступу до області пам’яті іншому контролеру I²C:

from machine import I2CTarget

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

SPI

Шина

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

Шина

TX

RX

CAN1

P2

P3

Примітка

CAN поки не підтримується на цій платі у мікропрограмі 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

Обидва канали ADC проходять через буферований операційним підсилювачем дільник напруги перед надходженням до MCU, тому read_u16() відповідає різній вхідній напрузі повної шкали на кожному виводі.

Вивід

Повна шкала

Примітки

P6_ADC

~3,3 В

майданчик загального призначення, внутрішньо підключений до P6

BAT_ADC

~5,0 В

внутрішній канал для акумулятора 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

Вивід

Таймер / канал

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM12 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2

Керуйте будь-яким із них через machine.PWM

from machine import Pin, PWM

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

Програмні шини з бітовим маніпулюванням

machine.SoftI2C і machine.SoftSPI працюють на будь-якому GPIO, якщо вам потрібна додаткова шина.

Тепловий датчик (зовнішній)

Мікропрограма містить драйвер fir — драйвер теплового датчика (fir == далекий інфрачервоний діапазон) для зовнішньо підключених теплових сенсорів:

  • MLX90621 — ІЧ-масив 16 × 4

  • MLX90640 — ІЧ-масив 32 × 24

  • MLX90641 — ІЧ-масив 16 × 12

  • AMG8833 — ІЧ-масив 8 × 8

Підключіть модуль до шини I²C плати і зчитуйте кадри за допомогою 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 спілкується з датчиком лише через I²C 2 — підключіть модуль до P4 (SCL) і P5 (SDA).

Часові функції

time

Модуль time охоплює блокуючі затримки, монотонні тики та вимірювання плинного часу:

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)

Віртуальні таймери

machine.Timer планує циклічні або одноразові зворотні виклики без використання слоту апаратного таймера. Передайте -1 як ідентифікатор для використання віртуального (програмного) таймера:

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

Значення periodу задаються в мілісекундах. Викличте deinit() для зупинки та звільнення слоту.

Годинник реального часу

machine.RTC зберігає астрономічний час між скиданнями і (з необов’язковим резервним акумулятором 3,3 В, підключеним до задніх майданчиків, див. Виводи живлення) при повній втраті живлення:

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 також працює під час глибокого сну, тому ви можете використовувати його як джерело пробудження для machine.deepsleep().

Сторожовий таймер

machine.WDT скидає плату, якщо застосунок зависає. Після запуску його не можна зупинити або переналаштувати — регулярно скидайте його всередині основного циклу:

from machine import WDT

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

Інформація про завантаження та виконання

Вікно USB завантажувача

При кожному увімкненні камера запускає короткий завантажувач (кілька секунд), який дозволяє OpenMV IDE оновити мікропрограму без необхідності входу користувача в режим DFU. Після завершення вікна завантажувач передає керування boot.py, а потім main.py.

Запущений скрипт може повторно увійти в завантажувач на вимогу, викликавши machine.bootloader()

import machine

machine.bootloader()

Файлова система та порядок завантаження

Мікропрограма N6 монтує до трьох файлових систем при завантаженні:

  • Внутрішня флеш-пам’ять — завжди монтується в /flash. За замовчуванням містить main.py та README.txt; створюється при першому завантаженні.

  • Карта microSD — якщо картка вставлена, монтується в /sdcard.

  • ROMFS — файлова система лише для читання з відображенням у пам’яті в /rom, яка використовується для постачання великих ресурсів даних (наприклад, моделей ШІ), що отримують переваги від доступу без копіювання. Монтується автоматично MicroPython при запуску, до виконання будь-якого Python-коду користувача.

Після монтування робочий каталог встановлюється в /sdcard, якщо картка присутня, інакше в /flash. Потім інтерпретатор запускає скрипти з цього каталогу:

  • boot.py виконується при кожному м’якому скиданні (холодне завантаження, Ctrl‑D з REPL або щоразу, коли запущений скрипт завершується).

  • main.py виконується лише при холодному завантаженні, одразу після boot.py. Наступні м’які скидання повторно запускають boot.py, але переходять безпосередньо в REPL — щоб перезапустити main.py, необхідно повністю скинути плату.

Розміщення boot.py або main.py на SD-картці замінює копію у флеш-пам’яті без її зміни — обидва файли шукаються в каталозі завантаження (/sdcard, якщо картка змонтована, інакше /flash).

Стандартний main.py, що постачається на щойно прошитій платі, просто блимає синім каналом RGB LED користувача як серцебиття (два коротких імпульси, короткий проміжок), щоб можна було переконатися, що мікропрограма завантажилася без проблем без підключеного хоста.

sys.path розширено для включення всіх трьох файлових систем та їхніх підкаталогів lib/, тому імпортовані модулі можуть знаходитися в /flash/lib, /sdcard/lib або /rom/lib.

Щоб змусити систему ігнорувати вставлену SD-картку (наприклад, для запуску main.py флеш-пам’яті навіть з картою), створіть порожній файл з назвою SKIPSD в кореневому каталозі /flash.

При підключенні через USB файлова система завантаження (/sdcard, якщо картка присутня, інакше /flash) також відображається як USB-накопичувач на хості, дозволяючи редагувати boot.py, main.py та будь-які інші файли безпосередньо. Вийміть накопичувач перед скиданням камери, щоб хост скинув кешовані записи.

Примітка

Оскільки ОС сприймає накопичувач як пасивний блоковий пристрій, файли, створені або змінені кодом, що виконується на OpenMV Cam, не відображатимуться до перемонтування накопичувача хостом. Якщо і ОС, і OpenMV Cam записують в ту саму файлову систему одночасно, ОС переможе і перезапише зміни, зроблені камерою. Використовуйте SD-картку для будь-яких даних, які скрипт записує назад, і перемонтовуйте перед читанням цих файлів з хоста.

Примітка

Червоний канал RGB LED користувача може коротко засвічуватися, поки хост читає або записує на USB-накопичувач — це індикатор активності на рівні мікропрограми, а не несправність.

Розміри сховища

N6 постачається з:

  • /flash — файлова система FAT 4 МБ, читання/запис.

  • /rom — ROMFS лише для читання з відображенням у пам’яті 24 МБ, використовується для постачання скриптів і моделей МН із доступом через mmap без копіювання.

  • /sdcard — повний розмір будь-якої вставленої карти microSD (якщо присутня), читання/запис.

Індикатор жорсткого збою

Якщо RGB LED користувача швидко перебирає всі кольори — достатньо швидко, щоб це схоже радше на миготливий білий LED, ніж на окремі відтінки — мікропрограма зіткнулася з невідновлюваним жорстким збоєм. Перепрошийте мікропрограму для відновлення; якщо перепрошивка не допомагає, плата може бути фізично пошкоджена.

Програмні бібліотеки

Дивіться індекс бібліотек для повного списку модулів — включно з тими, що є унікальними для збірки N6.