OpenMV Cam RT1062

OpenMV Cam RT1062 は、NXP i.MX RT1062(Cortex‑M7 @ 600 MHz)を中心に構築された低消費電力のマシンビジョンボードです。USB‑C 高速ネットワーク、Wi‑Fi/Bluetooth、10/100 Ethernet を備え、取り外し可能なキャリア上の OV5640 5MP センサーと組み合わされています。ディープスリープ時にカメラが LiPo バッテリーから引き出す電流はわずか約 30 µA であり、バッテリー駆動のプロジェクトに最適です。

OpenMV Cam RT1062

完全なデータシート、写真、寸法については、OpenMV Cam RT1062 製品ページ を参照してください。

ハイライト

  • NXP i.MX RT1062 Cortex‑M7(600 MHz)。

  • 32 MB の外部 SDRAM(16‑bit @ 160 MHz、320 MB/s)に加え、1 MB の内部 SRAM16 MB の QSPI フラッシュ(133 MHz 4‑bit SDR、読み出し 66 MB/s)、R6 以降では 4 KB の EEPROM

  • OV5640 5MP ローリングシャッターセンサー。

  • オンボード IMU(12‑bit 3 軸加速度センサー、±2/4/8 g)。

  • 高速 USB‑C(480 Mb/s、1.5 A 電流制限)、10/100 Mb/s Ethernet(シールド経由で PoE 対応)、Wi‑Fi a/b/g/n + Bluetooth 5.1(チップアンテナまたは U.FL オプション)。

  • microSD ソケット — SD は最大 2 GB、SDHC は最大 32 GB、SDXC は最大 2 TB。

  • LiPo 充電器(R6 以降では 500 mA、R4/R5 では 100 mA)、バックアップバッテリーパッド付きの RTC。ディープスリープ時のバッテリー消費は 約 30 µA

  • 14 本の I/O ピン。すべて 3.3 V 出力/3.3 V トレラント、ピンあたり 4 mA、割り込み対応。

  • ユーザー RGB LED、ユーザー SW ボタン、ハードウェア電源ボタン(ディープスリープ/ウェイクのステートマシン)、および充電/USB/VIN 電源用の独立したステータス LED。

警告

RT1062 の I/O ピンは 5 V トレラントではありません。Arduino Mega のような 5 V MCU にデバイスを直接接続しないでください。ボードへの給電は 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 / フレーム同期 I/O

P11

wakeup(アクティブロー、GND に接続するとウェイク)

P12

RESET — GND に引くとボードがリセットされる(GPIO ではありません)

P13

デジタル I/O

P14

デジタル I/O

ON/OFF

ハードウェア電源ボタンを再現したヘッダパッド(アクティブロー)

SW

ユーザーボタン(アクティブロー)

ST

VIN 電源時はロー、USB 電源時はハイ

CHG

アクティブロー。接続された LiPo バッテリーの充電中はロー

PG

アクティブロー。VIN または USB 電源が存在するときはロー

LED_RED

RGB LED の赤チャンネル(アクティブロー)

LED_GREEN

RGB LED の緑チャンネル(アクティブロー)

LED_BLUE

RGB LED の青チャンネル(アクティブロー)

注釈

P10 のフレーム同期ラインは共有バスです。 これは MCU、カメラセンサーのトリガー/露出ピン、およびユーザーヘッダのすべてに同時に配線されています。方向はアプリケーション側で定義され、センサーの構成方法に応じて MCU、センサー、または外部信号がこれを駆動できます。常にドライバが 1 つだけアクティブになるようにしてください。

注釈

ON/OFF と P11 は常時オンの RAW レール(切り替え式の 3.3 V レールではありません)を基準にしているため、ボードの残りの部分がディープスリープ/低電力モードにある間も機能し続けます。両方の入力ともアクティブローです。

これらのピンは RAW レールに乗せられるようにレベルシフタを通っています。ON/OFF や P11 で 3.3 V 直結の GPIO 動作がどうしても必要な場合(たとえばシフタを通さずに 3.3 V MCU から駆動する場合)、ボードにはシフタをバイパスできるプルアップと 0 オームのジャンパパッドが用意されています。これは高度なハードウェア改造であり、ほとんどのユーザーはそのままにしておくべきです。

注釈

P13 と P14 はデフォルトでは特別な機能のない通常の GPIO です。これらのパッドは、ボード裏面の 0 オーム抵抗のはんだブリッジをリフローすることで、別の信号にオプションで再配線できます:

  • P13 ↔ CHG ステータス / JTAG TRSTB

  • P14 ↔ ST ステータス / JTAG TDI

ほとんどのユーザーはこれらのジャンパに触れることはありません。電源管理の読み戻しや JTAG が特に必要でない限り、GPIO のデフォルトのままにしておいてください。

電源ピン

  • 3.3V — レギュレートされた 3.3 V レール。RT1062 では 出力専用 です。このピンに外部電源を供給しないでください。シールド向けに最大 1 A まで利用可能です。

  • VIN — 5 V 入力。ボードとオンボードの LiPo 充電器に給電します。

  • RAW — 入出力、常時オン(3.6 V – 5 V)。アクティブなソース(VIN、USB、または接続されたバッテリー)のいずれかを伝送し、入力としても使用できます。ここに電源を供給する際は 直列ダイオードを介して RAW を駆動する必要があります。そうしないと、電流が VIN/USB に逆流し、電源やオンボード保護回路を損傷します。

  • GND — 共通グラウンド。

注釈

オンボードの電源管理チップは、USB または VIN のうち電圧が高い方 を自動的に選択してボードとバッテリー充電器に給電します。LiPo が接続されている場合は余ったヘッドルームで充電し、VIN/USB が低下したり抜かれたりした場合はバッテリーにフォールバックしてボードを動作させ続けます。

注釈

ボードの裏面には、外部 3.3 V RTC バックアップバッテリー 用のはんだパッドがあります。これらのパッドにコイン電池を配線すると、ボードの残りの部分が無給電の間も RTC が動作し続けます。

Tip

バッテリー寿命推定ツール を使うと、特定のアクティブ/ディープスリープのデューティサイクルにおいて RT1062 がバッテリーでどれくらい動作するかをモデル化できます。

Ethernet ピン

RT1062 は、GPIO ヘッダの隣にある専用パッドに 10/100 Mb/s Ethernet PHY の MDI ペアを引き出しています。MDI ピンを RJ45 に直接配線するのは安全ではありません。PHY とケーブルの間には Ethernet マグネティクス(絶縁トランス、magjack に内蔵されているか、シールド上にあるもの)が 必須 です。OpenMV PoE シールドにはこれが含まれています。自作のジャックを使う場合は、マグネティクス統合型の RJ45 または外部トランスを使用してください。

  • ETH_LED — リンク/アクティビティ LED。リンクがアップしているときはアクティブロー、トラフィックがあると点滅します。

  • ETH_TXP / ETH_TXN — 送信ペア。

  • ETH_RXP / ETH_RXN — 受信ペア。

注釈

ヘッダには Reserved とシルク印刷された 4 つのパッドも引き出されています。これらは OpenMV N6 のギガビット Ethernet ペア(DC P/N および DD P/N)とフットプリント互換であり、同じ Ethernet/PoE シールドをどちらのボードにも接続できます。RT1062 の PHY は 10/100 Mb/s のみに対応するため、これら 4 つのパッドには 電気的接続はありません。未接続のままにしてください。

リカバリーおよびデバッグピン

  • RESET — GND に引くとボードがリセットされます。解放すると MCU が通常どおり起動します。

  • SBL — ボードに給電しながら 3.3 V に引くと、ROM ブートローダー(Serial Boot Loader)モードに入ります。OpenMV IDE はこのモードを使ってオンボードのブートローダーを再書き込みします。

ST‑LINK および SEGGER J‑Link アダプタと互換性のある専用の ARM 10 ピン SWD/JTAG ヘッダが実装されています。

注釈

RT1062 はデフォルトでは、このコネクタを通じて SWD デバッグのみを公開します。完全な JTAG は標準では利用できません。

オンボードペリフェラル

LED

RT1062 には 2 つの RGB LED があります:

  • ユーザー RGB LED — ソフトウェアで制御可能で、LED_REDLED_GREENLED_BLUE として公開されます:

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • 電源 LED — オンボードの電源管理ハードウェアによって直接駆動され、ソフトウェア制御はできません。電源の状態を一目で読み取るために使用します。

    動作中:

    チャンネル

    意味

    VIN がボードに給電している(USB ではオフ)

    USB または VIN 電源が存在する

    接続された LiPo バッテリーを充電中

    ディープスリープ時はすべてのチャンネルがオフになりますが、 だけは例外で、LiPo の充電中は点灯し続けます。

ボタン

RT1062 には 2 つのボタンがあります:

  • SW — 汎用ユーザーボタン。通常のアクティブロー GPIO 入力としてコードから読み取れます:

    from machine import Pin
    
    sw = Pin("SW", Pin.IN)
    print(sw.value())
    
  • 電源ボタン — RT1062 ボード上の専用の電源コントローラーステートマシンによって、完全にハードウェアで駆動されます。これは ユーザーコードには公開されません。コントローラーは押し続けられた時間に基づいて動作を決定します:

    • ボードの動作中に 約 5 秒間押し続ける → ステートマシンがディープスリープに遷移します。

    • ボードのディープスリープ中に 約 1 秒間押し続ける → ステートマシンがシステムを再起動します。

    ON/OFF ヘッダパッドをローに引くと、オンボードの電源ボタンを押すのと同じ効果があります。外部スイッチを配線したり、別のマイクロコントローラーからこのラインを駆動したりするのに便利です。

電源ステータスピン

オンボードの電源管理チップからの 3 つのアクティブローステータス入力:

  • 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.pixformatcsi.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 モデルを CMSIS‑NN カーネルを使って Cortex‑M7 上で実行します。コンパクトな検出器なら毎秒数フレームで実行できるほど高速です。読み取り専用の /rom ファイルシステム上のモデルは、RAM にコピーせずにフラッシュから直接ロードされます。以下は、検出された顔とその 6 つのランドマークをすべてのフレームにオーバーレイする 128×128 の BlazeFace 検出器です:

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 にあり、レジスタ 0x03 から始まる 3 つの符号付き 12‑bit 加速度チャンネルと 8‑bit 温度バイトを格納しています:

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 KB I²C EEPROM が搭載されています。(それ以前のリビジョンには搭載されていません。R4/R5 でこれらのスニペットを呼び出すと、I²C ack が返らずタイムアウトします。)標準の machine.I2Creadfrom_mem / writeto_mem API を 16‑bit メモリアドレスで使用してください:

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 バイトのページ内に収める必要があります。それより大きな転送はページごとに 1 回の呼び出しに分割し、連続する書き込みの間には約 5 ms の書き込みサイクル遅延を追加してください。

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 も公開します。asyncio 対応の BLE には aioble --- 非同期 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

(マグネティクス付きの)RJ45 が MDI パッドに接続されると、10/100 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 V CMOS で、ピンあたり最大 4 mA をシンク/ソースできます。

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

同じハードウェアは、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

注釈

ファームウェア v5.0.0 では、このボードで CAN はまだサポートされていません。

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 V でフルスケールになります:

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.SoftI2Cmachine.SoftSPI は任意の GPIO で動作します。

サーマルセンサー(オフボード)

ファームウェアには、外部配線されたサーマルイメージャー用の fir --- 熱センサードライバー(fir == 遠赤外線) ドライバが含まれています:

  • MLX90621 — 16 × 4 IR アレイ

  • MLX90640 — 32 × 24 IR アレイ

  • MLX90641 — 16 × 12 IR アレイ

  • AMG8833 — 8 × 8 IR アレイ

モジュールをボードの 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 は、ハードウェアタイマースロットを消費せずに周期的またはワンショットのコールバックをスケジュールします。仮想(ソフトウェア)タイマーを使用するには、id として -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"))

周期の値はミリ秒単位です。スロットを停止して解放するには deinit() を呼び出します。

リアルタイムクロック

machine.RTC は、リセットをまたいで実時刻を保持し、(オプションの 3.3 V バックアップバッテリーを裏面パッドに配線した場合は、電源ピン を参照)完全な電源喪失をまたいでも保持します:

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 ブートローダーウィンドウ

電源投入ごとに、カメラは短いブートローダー(数秒間)を実行し、ユーザーが DFU モードに入ることなく OpenMV IDE がファームウェアを更新できるようにします。このウィンドウが終了すると、ブートローダーは boot.py に、続いて main.py に処理を引き渡します。

実行中のスクリプトは、machine.bootloader() を呼び出すことでオンデマンドでブートローダーに再び入ることができます:

import machine

machine.bootloader()

ファイルシステムとブート順序

RT1062 ファームウェアは、ブート時に最大 3 つのファイルシステムをマウントします:

  • 内部フラッシュ — 常に /flash にマウントされます。デフォルトで main.pyREADME.txt を保持し、初回ブート時に作成されます。

  • microSD カード — カードが挿入されている場合は /sdcard にマウントされます。

  • ROMFS/rom にある読み取り専用のメモリマップドファイルシステムで、ゼロコピーアクセスの恩恵を受ける大きなデータアセット(例:AI モデル)を提供するために使用されます。ユーザーの Python が実行される前に、起動時に MicroPython によって自動的にマウントされます。

マウント後、作業ディレクトリはカードが存在する場合は /sdcard に、そうでない場合は /flash に設定されます。その後、インタプリタはそのディレクトリからスクリプトを実行します:

  • boot.pyすべての ソフトリセット(コールドブート、REPL からの Ctrl‑D、または実行中のスクリプトが戻ったとき)で実行されます。

  • main.pyコールドブート時のみboot.py の直後に実行されます。それ以降のソフトリセットでは boot.py を再実行しますが、その後すぐに REPL に移ります。main.py を再実行するには、ボードを完全にリセットする必要があります。

boot.py または main.py を SD カードに置くと、フラッシュ内のコピーには触れずにそれをオーバーライドします。どちらのファイルもブートディレクトリ(カードがマウントされている場合は /sdcard、そうでない場合は /flash)で検索されます。

新しく書き込まれたボードに同梱されるデフォルトの main.py は、ハートビートとしてユーザー RGB LED の チャンネルを点滅させるだけです(短いパルス 2 回、短い間隔)。これにより、ホストを接続しなくてもファームウェアが正常に起動したことを確認できます。

sys.path は 3 つすべてのファイルシステムとその lib/ サブディレクトリを含むように拡張されるため、インポート可能なモジュールは /flash/lib/sdcard/lib、または /rom/lib に置くことができます。

挿入された SD カードをシステムに無視させる(たとえば、カードが存在していてもフラッシュの main.py を実行する)には、/flash のルートに SKIPSD という名前の空のファイルを作成します。

USB 経由で接続すると、ブートファイルシステム(カードが存在する場合は /sdcard、そうでない場合は /flash)はホスト上で USB マスストレージドライブとしても列挙され、boot.pymain.py、その他のファイルを直接編集できます。ホストがキャッシュされた書き込みをフラッシュするように、カメラをリセットする前にドライブを取り出してください

注釈

OS はドライブをパッシブなブロックデバイスとして扱うため、OpenMV Cam 上で実行されているコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS と OpenMV Cam が同時に同じファイルシステムに書き込むと、OS が優先され、カメラによる変更が上書きされます。スクリプトが書き戻すデータには SD カードを使用し、ホストからそれらのファイルを読み取る前に再マウントしてください。

注釈

ホストが USB マスストレージドライブから読み書きしている間、ユーザー RGB LED の チャンネルが一時的に点灯することがあります。これはファームウェアによるアクティビティインジケータであり、障害ではありません。

ストレージサイズ

RT1062 には次のものが同梱されています:

  • /flash4 MB の FAT ファイルシステム、読み書き可能。

  • /rom8 MB の読み取り専用メモリマップド ROMFS。ゼロコピー mmap アクセスの恩恵を受けるスクリプトや ML モデルを提供するために使用されます。

  • /sdcard — 挿入された microSD カードのフルサイズ(存在する場合)、読み書き可能。

ハードフォルトインジケータ

ユーザー RGB LED がすべての色を高速に切り替えている場合 — 個別の色合いというより きらめく白色 LED のように見えるほど速い場合 — ファームウェアが回復不能なハードフォルトに陥っています。回復するにはファームウェアを再書き込みしてください。再書き込みしても改善しない場合は、ボードが物理的に損傷している可能性があります。

ソフトウェアライブラリ

RT1062 ビルド固有のものを含む、モジュールの完全なリストについては ライブラリインデックス を参照してください。