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.
Основные характеристики¶
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.
Распиновка¶
Справочник по выводам¶
Имя вывода |
Функция |
|---|---|
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.
Выводы состояния питания¶
Три активных низким уровнем входа состояния от встроенной микросхемы управления питанием:
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, — см. в индексе библиотек.