OpenMV Cam RT1062

OpenMV Cam RT1062 — это плата машинного зрения с низким энергопотреблением, построенная на базе NXP i.MX RT1062 (Cortex‑M7 @ 600 МГц). Плата сочетает высокоскоростную сеть USB‑C, Wi‑Fi/Bluetooth и Ethernet 10/100 с датчиком OV5640 5MP на съёмном носителе. В режиме глубокого сна камера потребляет от LiPo‑аккумулятора всего ~30 мкА, что делает её отличным выбором для проектов с питанием от батареи.

OpenMV Cam RT1062

Полный технический паспорт, фотографии и размеры см. на странице продукта OpenMV Cam RT1062.

Основные характеристики

  • NXP i.MX RT1062 Cortex‑M7 на частоте 600 МГц.

  • 32 МБ внешней SDRAM (16‑бит @ 160 МГц, 320 МБ/с) плюс 1 МБ внутренней SRAM и 16 МБ QSPI флеш-памяти (133 МГц 4‑бит SDR, чтение 66 МБ/с); 4 КБ EEPROM на R6+.

  • OV5640 — 5MP датчик со скользящим затвором.

  • Встроенный IMU (12‑бит 3‑осевой акселерометр, ±2/4/8 g).

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

  • Разъём microSD — SD до 2 ГБ, SDHC до 32 ГБ, SDXC до 2 ТБ.

  • Зарядное устройство LiPo (500 мА на R6+, 100 мА на R4/R5), RTC с площадками для резервной батареи. В режиме глубокого сна потребление от батареи ~30 мкА.

  • 14 вводов-выводов, все с выходом 3,3 В / толерантностью к 3,3 В, 4 мА на вывод, с поддержкой прерываний.

  • Пользовательский RGB-светодиод, пользовательская кнопка SW, аппаратная кнопка питания (конечный автомат глубокого сна / пробуждения) и отдельный светодиод состояния для зарядки / USB / питания VIN.

Предупреждение

Вводы-выводы RT1062 не толерантны к 5 В. Не подключайте устройство напрямую к 5‑вольтовому MCU, например Arduino Mega. Питайте плату только через VIN.

Распиновка

Распиновка OpenMV Cam RT1062 OV5640

Справочник по выводам

Имя вывода

Функция

P0

SPI1 MOSI / PWM2 B3

P1

SPI1 MISO / CAN0 TX

P2

SPI1 SCLK / PWM2 B3

P3

SPI1 SS / CAN0 RX

P4

I2C1 SCL / UART1 TX / PWM1 X2

P5

I2C1 SDA / UART1 RX / PWM1 X3

P6

ADC

P7

PWM2 A0

P8

PWM2 B0

P9

PWM1 A3

P10

PWM1 B3 / ввод-вывод синхронизации кадров

P11

пробуждение (активный низкий, подключите к GND для пробуждения)

P12

RESET — подтяните к GND для сброса платы (не GPIO)

P13

цифровой ввод-вывод

P14

цифровой ввод-вывод

ON/OFF

контактная площадка, дублирующая аппаратную кнопку питания (активный низкий)

SW

пользовательская кнопка (активный низкий)

ST

низкий при питании от VIN, высокий при питании от USB

CHG

активный низкий; низкий, пока подключённый LiPo‑аккумулятор заряжается

PG

активный низкий; низкий при наличии питания VIN или USB

LED_RED

красный канал RGB-светодиода (активный низкий)

LED_GREEN

зелёный канал RGB-светодиода (активный низкий)

LED_BLUE

синий канал RGB-светодиода (активный низкий)

Примечание

Линия синхронизации кадров P10 — это общая шина. Она одновременно подключена к MCU, выводу триггера / экспозиции датчика камеры и пользовательскому разъёму. Направление определяется приложением — управлять ею могут MCU, датчик или внешний сигнал, в зависимости от настройки датчика. Убедитесь, что в каждый момент времени активен только один источник управления.

Примечание

ON/OFF и P11 привязаны к всегда включённой шине RAW (а не к коммутируемой шине 3,3 В), поэтому они остаются работоспособными, пока остальная часть платы находится в режиме глубокого сна / пониженного энергопотребления. Оба входа активны низким уровнем.

Эти выводы проходят через преобразователи уровня, чтобы работать на шине RAW. Если вам обязательно нужно поведение GPIO напрямую на 3,3 В для ON/OFF или P11 (например, чтобы управлять ими от 3,3‑вольтового MCU в обход преобразователя), на плате есть подтягивающие резисторы и площадки для перемычек 0 Ом, позволяющие обойти преобразователь. Это продвинутая доработка оборудования — большинству пользователей лучше её не трогать.

Примечание

P13 и P14 по умолчанию являются обычными GPIO без специальной функции. При необходимости площадки можно перенаправить на другие сигналы, перепаяв перемычки из резисторов 0 Ом на обратной стороне платы:

  • P13 ↔ статус CHG / JTAG TRSTB

  • P14 ↔ статус ST / JTAG TDI

Большинство пользователей не будут трогать эти перемычки — оставьте их в значении GPIO по умолчанию, если только вам конкретно не нужно считывание состояния управления питанием или JTAG.

Выводы питания

  • 3.3V — стабилизированная шина 3,3 В. На RT1062 только выход — не подавайте на этот вывод внешнее питание. Для шилдов доступно до 1 А.

  • VIN — вход 5 В. Питает плату и встроенное зарядное устройство LiPo.

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

  • GND — общая земля.

Примечание

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

Примечание

На обратной стороне платы есть площадки для пайки внешней резервной батареи RTC на 3,3 В. Припаяв к этим площадкам литиевую таблетку, можно поддерживать работу RTC, пока остальная часть платы обесточена.

Совет

Используйте калькулятор времени работы от батареи, чтобы оценить, как долго RT1062 проработает от батареи при заданном рабочем цикле активности / глубокого сна.

Выводы Ethernet

RT1062 выводит MDI-пары Ethernet PHY 10/100 Мбит/с на отдельные площадки рядом с разъёмом GPIO. Выводы MDI нельзя подключать напрямую к RJ45 — между PHY и кабелем обязательно требуются Ethernet-магнетики (изолирующий трансформатор, либо встроенный в magjack, либо на шилде). Шилд OpenMV PoE их включает; если вы делаете собственный разъём, используйте RJ45 со встроенными магнетиками или внешний трансформатор.

  • ETH_LED — светодиод связи/активности. Активен низким уровнем при установленном соединении; мигает при трафике.

  • ETH_TXP / ETH_TXN — передающая пара.

  • ETH_RXP / ETH_RXN — принимающая пара.

Примечание

На разъёме также есть четыре площадки с шелкографией Reserved. Они совместимы по посадочному месту с гигабитными парами Ethernet на OpenMV N6 (DC P/N и DD P/N), так что один и тот же шилд Ethernet / PoE можно подключить к любой из плат. PHY у RT1062 работает только на 10/100 Мбит/с, поэтому эти четыре площадки не имеют электрического подключения — оставьте их неподключёнными.

Выводы восстановления и отладки

  • RESET — подтяните к GND для сброса платы. После отпускания MCU запускается обычным образом.

  • SBL — подтяните к 3,3 В во время подачи питания на плату, чтобы войти в режим ROM-загрузчика (Serial Boot Loader). OpenMV IDE использует этот режим для перепрошивки встроенного загрузчика.

Установлен отдельный разъём ARM 10‑pin SWD/JTAG, совместимый с адаптерами ST‑LINK и SEGGER J‑Link.

Примечание

По умолчанию RT1062 предоставляет через этот разъём только отладку по SWD. Полноценный JTAG из коробки недоступен.

Встроенные периферийные устройства

Светодиоды

RT1062 имеет два 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.

Кнопки

RT1062 имеет две кнопки:

  • SW — универсальная пользовательская кнопка. Считывается из кода как обычный вход GPIO, активный низким уровнем:

    from machine import Pin
    
    sw = Pin("SW", Pin.IN)
    print(sw.value())
    
  • Кнопка питания — управляется выделенным конечным автоматом контроллера питания на плате RT1062, полностью аппаратно. Она не доступна пользовательскому коду; контроллер решает, что делать, в зависимости от длительности удержания:

    • Удержание ~5 с, пока плата работает → конечный автомат переходит в режим глубокого сна.

    • Удержание ~1 с, пока плата в глубоком сне → конечный автомат снова включает систему.

    Подтягивание контактной площадки ON/OFF к низкому уровню действует так же, как нажатие встроенной кнопки питания — это удобно для подключения внешнего выключателя или управления линией от другого микроконтроллера.

Выводы состояния питания

Три активных низким уровнем входа состояния от встроенной микросхемы управления питанием:

  • PG — низкий при наличии питания VIN или USB. Всегда подключён.

  • ST — низкий, когда плата работает от VIN, высокий при работе от питания USB. По умолчанию не подключён.

  • CHG — низкий, пока заряжается подключённый LiPo‑аккумулятор. По умолчанию не подключён.

from machine import Pin

power_ok = not Pin("PG", Pin.IN).value()

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

OV5640 управляется через модуль csi — датчики камеры:

import csi

cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000)       # let auto‑exposure settle

while True:
    img = cam.snapshot()

OV5640 имеет встроенный JPEG-компрессор. Установите csi.CSI.pixformat в csi.JPEG, и датчик будет выдавать сжатые кадры прямо в камеру по шине камеры, что делает съёмку с высоким разрешением практичной: csi.HD (1280×720), csi.FHD (1920×1080) и полный 5MP csi.WQXGA2 (2592×1944) — все потоково выдаются как JPEG. Настройте сжатие с помощью csi.CSI.quality (0-100, выше = крупнее кадры, больше деталей):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

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

Машинное обучение

ml — Машинное обучение запускает квантованные TFLite-модели на Cortex‑M7 с ядрами CMSIS‑NN — достаточно быстро для компактных детекторов с несколькими кадрами в секунду. Модели на доступной только для чтения файловой системе /rom загружаются прямо из флеш-памяти без копирования в RAM. Вот детектор BlazeFace 128×128, накладывающий обнаруженное лицо и его шесть опорных точек на каждый кадр:

import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace

# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))

# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)

clock = time.clock()
while True:
    clock.tick()
    img = csi0.snapshot()

    # faces is a list of ((x, y, w, h), score, keypoints) tuples
    for r, score, keypoints in model.predict([img]):
        ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)

        # keypoints is a ndarray of shape (6, 2)
        # 0 - right eye (x, y)
        # 1 - left eye (x, y)
        # 2 - nose (x, y)
        # 3 - mouth (x, y)
        # 4 - right ear (x, y)
        # 5 - left ear (x, y)
        ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))

    print(clock.fps(), "fps")

IMU

Прошивка RT1062 не подключает встроенный акселерометр к модулю imu — датчик imu. Вместо этого обращайтесь к нему напрямую по внутренней шине I²C — микросхема находится по адресу 0x15 и упаковывает три знаковых 12‑битных канала ускорения плюс 8‑битный байт температуры, начиная с регистра 0x03:

import machine
import time

ADDR     = 0x15
DATA_REG = 0x03
LSB_PER_G = 1024.0    # ±2 g range

def s12(hi, lo):
    v = ((hi << 8) | lo) >> 4
    return v - 0x1000 if v & 0x800 else v

bus = machine.I2C(2)
print("Devices on I²C2:", bus.scan())

while True:
    d = bus.readfrom_mem(ADDR, DATA_REG, 7)
    x = s12(d[0], d[1]) / LSB_PER_G
    y = s12(d[2], d[3]) / LSB_PER_G
    z = s12(d[4], d[5]) / LSB_PER_G
    temp_c = d[6] * 0.586 + 25.0
    print("x=%+.2fg  y=%+.2fg  z=%+.2fg  T=%.1f°C" % (x, y, z, temp_c))
    time.sleep_ms(100)

EEPROM

Платы R6 и новее включают универсальную 4 КБ I²C EEPROM на той же внутренней шине, что и акселерометр. (У более ранних ревизий её нет — вызов этих фрагментов на R4/R5 завершится тайм-аутом из-за отсутствия подтверждения I²C.) Используйте стандартный API machine.I2C readfrom_mem / writeto_mem с 16‑битным адресом памяти:

import machine
import time

EEPROM_ADDR = 0x50            # default address
PAGE_SIZE   = 32              # bytes per page (both read and write)
EEPROM_SIZE = 4096

bus = machine.I2C(2)

# Dump the entire 4 KB one page at a time
data = bytearray()
for offset in range(0, EEPROM_SIZE, PAGE_SIZE):
    data += bus.readfrom_mem(EEPROM_ADDR, offset, PAGE_SIZE, addrsize=16)
print(len(data), "bytes")

# Write a small payload back at offset 0 (fits in one page)
bus.writeto_mem(EEPROM_ADDR, 0, b"hello, world", addrsize=16)
time.sleep_ms(10)             # ~5 ms write cycle after each page

# Read it back
print(bus.readfrom_mem(EEPROM_ADDR, 0, 12, addrsize=16))

Как чтение, так и запись должны оставаться в пределах 32‑байтовой страницы. Разбейте любую более крупную передачу на один вызов на страницу и добавляйте задержку цикла записи ~5 мс между последовательными записями.

Wi‑Fi

Встроенный модуль семейства CYW43 доступен через 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

Тот же беспроводной модуль также предоставляет Bluetooth 5.1. Используйте aioble — асинхронный BLE для удобного с asyncio BLE — например, чтобы рекламировать себя как периферийное устройство и ждать подключения центрального:

import asyncio
import aioble

async def run():
    while True:
        conn = await aioble.advertise(250_000, name="OpenMV-RT1062")
        print("Connected:", conn.device)
        await conn.disconnected()

asyncio.run(run())

Ethernet

Когда к площадкам MDI подключён RJ45 (с магнетиками), PHY 10/100 появляется как интерфейс 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 и могут принимать/отдавать до 4 мА на вывод.

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

UART1

P4

P5

from machine import UART

uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

Шина

SCL

SDA

I2C1

P4

P5

from machine import I2C

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

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

from machine import I2CTarget

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

SPI

Шина

MOSI

MISO

SCK

CS

SPI1

P0

P1

P2

P3

from machine import SPI
from machine import Pin

spi = SPI(1, 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

P1

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 — P6, полная шкала которого составляет ~3,3 В:

from machine import ADC
import time

adc = ADC("P6")
while True:
    voltage = adc.read_u16() * 3.3 / 65535
    print(voltage)
    time.sleep_ms(100)

PWM

Вывод

Канал FlexPWM

P0

PWM2 B3

P2

PWM2 B3

P4

PWM1 X2

P5

PWM1 X3

P7

PWM2 A0

P8

PWM2 B0

P9

PWM1 A3

P10

PWM1 B3

Управляйте любым из них через machine.PWM:

from machine import Pin, PWM

pwm = PWM(Pin("P9"), 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 4 — подключите модуль к 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()

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

Прошивка RT1062 при загрузке монтирует до трёх файловых систем:

  • Внутренняя флеш-память — всегда монтируется по адресу /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-накопитель — это индикатор активности, управляемый прошивкой, а не неисправность.

Размеры хранилища

RT1062 поставляется с:

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

  • /rom — отображённая в память ROMFS 8 МБ только для чтения, используется для поставки скриптов и ML-моделей, которым выгоден доступ через mmap без копирования.

  • /sdcard — полный размер любой вставленной карты microSD (при наличии), чтение/запись.

Индикатор аппаратного сбоя

Если пользовательский RGB-светодиод быстро перебирает все цвета — достаточно быстро, чтобы это выглядело скорее как мерцающий белый светодиод, чем как отдельные оттенки — прошивка столкнулась с неустранимым аппаратным сбоем. Перепрошейте прошивку для восстановления; если перепрошивка не помогает, плата может быть физически повреждена.

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

Полный список модулей — включая те, что уникальны для сборки RT1062, — см. в индексе библиотек.