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 кадров/с одновременно с потоковой передачей видео в реальном времени.
Полный технический паспорт, фотографии и размеры см. на странице продукта OpenMV N6.
Ключевые особенности¶
STM32N657 Cortex‑M55 на 800 МГц (1280 DMIPS) с ARM Helium 128‑битным SIMD — векторная пропускная способность 6,4 гигаопераций.
NPU 1 ГГц, 600 GOPS INT8 — выполняет обнаружение YOLOv8/YOLOv11 со скоростью 30 кадров/с.
ISP для RAW Bayer до 5 Мп, 2D GPU для масштабирования и 3D‑поворота, кодирование H.264 до 1080p и аппаратный кодек JPEG.
64 МБ внешней SDRAM (16‑бит @ 200 МГц DDR, 800 МБ/с) плюс 4,2 МБ внутренней SRAM и 32 МБ octal‑флеш (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‑светодиод, пользовательская кнопка и отдельный светодиод состояния для зарядки / USB / питания VIN.
Предупреждение
Выводы ввода/вывода N6 не толерантны к 5 В. Не подключайте устройство напрямую к 5‑вольтовому MCU, такому как Arduino Mega. Подавайте питание на N6 только через VIN.
Распиновка¶
Справочник по выводам¶
Имя вывода |
Функция |
|---|---|
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 |
выделенный 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_GREEN |
зелёный канал RGB‑светодиода (активный низкий уровень) |
LED_BLUE |
синий канал RGB‑светодиода (активный низкий уровень) |
Примечание
Линия синхронизации кадров P10 — это общая шина. Она одновременно подключена к MCU, выводу триггера / экспозиции датчика камеры и к пользовательскому разъёму. Направление определяется приложением — её может управлять MCU, датчик или внешний сигнал в зависимости от того, как настроен датчик (некоторые датчики могут использовать этот же вывод как вход триггера или как выход экспозиции). Убедитесь, что в каждый момент активен только один источник управления.
Примечание
ONOFF и P11 привязаны к всегда включённой шине RAW (а не к коммутируемой шине 3,3 В), поэтому они остаются работоспособными, пока остальная часть платы находится в глубоком сне / режиме низкого энергопотребления. Оба входа имеют активный низкий уровень.
Эти выводы проходят через преобразователи уровня, чтобы работать на шине RAW. Если вам абсолютно необходимо поведение GPIO напрямую на 3,3 В для ONOFF или P11 (например, чтобы управлять ими от 3,3‑вольтового MCU без прохождения через преобразователь), на плате выведены контактные площадки с подтяжкой и перемычкой 0 Ом, позволяющие обойти преобразователь. Это продвинутая аппаратная доработка — большинству пользователей лучше её не трогать.
Примечание
P15–P18 совместно используются с гигабитным Ethernet PHY, который подключён и активен по умолчанию. Чтобы использовать эти выводы как пользовательский ввод/вывод, необходимо перепаять резистор 0 Ом на задней стороне платы в положение 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 Ethernet PHY на выделенные площадки рядом с разъёмом GPIO. Выводы MDI небезопасно подключать напрямую к RJ45 — между PHY и кабелем обязательно требуется Ethernet‑магнитика (изолирующий трансформатор, либо встроенный в magjack, либо на шилде). Шилд OpenMV PoE их включает; если вы делаете собственный разъём, используйте RJ45 со встроенной магнитикой или внешний трансформатор.
ETH_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.
Установлен выделенный 10‑контактный разъём ARM SWD/JTAG, совместимый с адаптерами ST‑LINK и SEGGER J‑Link.
Встроенные периферийные устройства¶
Светодиоды¶
У N6 два RGB‑светодиода:
Пользовательский RGB‑светодиод — управляется программно, доступен как
LED_RED,LED_GREENиLED_BLUE:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Светодиод питания — управляется напрямую встроенной аппаратурой управления питанием, без программного управления. Используйте его, чтобы с первого взгляда понять, что делает источник питания.
Во время работы:
Канал
Значение
Синий
VIN питает плату (выключен при питании от USB)
Зелёный
присутствует питание USB или VIN
Красный
идёт зарядка подключённой батареи LiPo
В глубоком сне все каналы выключены, кроме красного, который продолжает гореть, пока заряжается батарея LiPo.
Выводы состояния питания¶
Три входа состояния с активным низким уровнем позволяют прошивке видеть, что делает встроенная микросхема управления питанием:
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 ГГц (600 GOPS INT8) у N6 доступен через модуль 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 — Модуль Audio. Каждый буфер поступает как bytearray с PCM в формате знакового 16‑битного, что упрощает его передачу в ulab/numpy для быстрой цифровой обработки сигналов. Простой детектор громкости — печатает сообщение всякий раз, когда среднеквадратичная громкость превышает порог:
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 — асинхронный BLE для BLE, удобного для asyncio — например, чтобы рекламироваться как периферийное устройство и ждать подключения центрального устройства:
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¶
Когда к площадкам MDI подключён RJ45 (с магнитикой), гигабитный 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 == far infrared, дальний инфракрасный) для внешне подключённых тепловизоров:
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 в качестве id, чтобы использовать виртуальный (программный) таймер:
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"))
Значения периода указываются в миллисекундах. Вызовите 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‑светодиода как индикатором работы (два коротких импульса, короткая пауза), чтобы вы могли понять, что прошивка загрузилась корректно, без подключённого хоста.
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‑светодиода может кратковременно загораться, пока хост читает с USB‑накопителя или записывает на него — это индикатор активности, управляемый прошивкой, а не неисправность.
Объёмы хранилища¶
N6 поставляется с:
/flash— файловая система FAT 4 МБ, чтение/запись./rom— ROMFS только для чтения 24 МБ с отображением в память, используемая для поставки скриптов и моделей ML, которым выгоден доступ через mmap без копирования./sdcard— полный объём любой вставленной карты microSD (при наличии), чтение/запись.
Индикатор аппаратного сбоя¶
Если пользовательский RGB‑светодиод быстро перебирает все цвета — настолько быстро, что выглядит как мерцающий белый светодиод, а не как отдельные оттенки, — прошивка столкнулась с невосстановимым аппаратным сбоем. Перепрошейте прошивку для восстановления; если перепрошивка не помогает, плата может быть физически повреждена.
Программные библиотеки¶
Полный список модулей — включая те, что уникальны для сборки N6 — см. в указателе библиотек.