OpenMV N6

OpenMV N6 は STMicroelectronics の STM32N657(Cortex‑M55 @ 800 MHz)を中心に構成され、INT8 で 600 GOPS の性能を持つ 1 GHz のオンチップ NPU を搭載しています。この NPU を、取り外し可能なキャリアに載せた PAG7936 1 MP グローバルシャッターセンサー、ギガビットイーサネット、USB‑C ハイスピード、Wi‑Fi、Bluetooth 5.1 と組み合わせ、ライブ映像のストリーミングと並行して YOLOv8/YOLOv11 の推論を 30 FPS で実行します。

OpenMV N6

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

主な特長

  • STM32N657 Cortex‑M55 800 MHz(1280 DMIPS)、ARM Helium 128 ビット SIMD 搭載 — 6.4 ギガオペレーションのベクトルスループット。

  • 1 GHz NPU、INT8 で 600 GOPS — YOLOv8/YOLOv11 の検出を 30 FPS で実行。

  • 最大 5MP の RAW Bayer に対応する ISP、スケーリングと 3D 回転に対応する 2D GPU、1080p までの H.264 エンコード、ハードウェア JPEG コーデック

  • 64 MB の外部 SDRAM(16 ビット @ 200 MHz DDR、800 MB/s)に加え、4.2 MB の内部 SRAM32 MB のオクタルフラッシュ(200 MHz DDR、400 MB/s)。

  • PAG7936 1 MP カラーグローバルシャッターセンサー。

  • 音声とモーションの融合のための オンボード IMU(加速度センサー+ジャイロスコープ)と マイク

  • ハイスピード USB‑C(480 Mb/s、1.5 A 電流制限)、ギガビットイーサネット(シールド経由で PoE 対応)、Wi‑Fi a/b/g/nBluetooth 5.1(チップアンテナまたは U.FL オプション)。

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

  • LiPo 充電器(500 mA 急速充電)、バッテリー電圧 ADC、8 KB のバックアップ RAM 付き RTC、専用のバックアップバッテリーピン。

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

  • ユーザー RGB LED、ユーザーボタン、充電 / USB / VIN 電源用の独立したステータス LED。

警告

N6 の I/O ピンは 5 V トレラントではありません。Arduino Mega のような 5 V の MCU にデバイスを直接接続しないでください。N6 への給電は VIN のみを通して行ってください。

ピン配置

OpenMV N6 PAG7936 ピン配置

ピンリファレンス

ピン名

機能

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 / フレーム同期 I/O

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

接続された LiPo バッテリー電圧を測定する内部 ADC チャンネル

LED_RED

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

LED_GREEN

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

LED_BLUE

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

注釈

P10 のフレーム同期ラインは共有バスです。 これは MCU、カメラセンサーのトリガー / 露出ピン、そしてユーザーヘッダーのすべてに同時に配線されています。方向はアプリケーション依存で、センサーの構成方法に応じて MCU、センサー、または外部信号がこれを駆動できます(一部のセンサーは同じピンをトリガー入力 または 露出出力として使用できます)。同時に駆動するドライバーが 1 つだけになるようにしてください。

注釈

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

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

注釈

P15〜P18 はギガビットイーサネット PHY と共有されており、デフォルトで配線され有効になっています。これらのピンをユーザー I/O として使用するには、ボード背面の 0 オーム抵抗を GPIO 位置にリフローし直す必要があります。これによって無効になるのはギガビットイーサネットのみで、10/100 Mb/s イーサネットは専用ピンで動作し続けます。

電源ピン

  • 3.3V — レギュレートされた 3.3 V レール。N6 では 出力のみ です — このピンに外部電源を供給しないでください。シールド用に最大 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 と 8 KB のバックアップ RAM を動作させ続けられます。

Tip

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

イーサネットピン

N6 は GPIO ヘッダーの隣の専用パッドにイーサネット PHY の MDI ペアを引き出しています。MDI ピンを RJ45 に直接配線するのは安全ではありません — PHY とケーブルの間にはイーサネット用磁気部品(絶縁トランス。magjack に内蔵されているか、シールド上にある)が 必須 です。OpenMV PoE シールドにはこれらが含まれています。自作のジャックを使う場合は、磁気部品一体型の RJ45 または外部トランスを使用してください。

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

  • DA P / DA N — ペア A(10/100 では TX。すべての速度で使用)。

  • DB P / DB N — ペア B(10/100 では RX。すべての速度で使用)。

  • DC P / DC N — ペア C。ギガビットでのみ使用。

  • DD P / DD N — ペア D。ギガビットでのみ使用。

10/100 Mb/s ではペア AB のみが必要です。ギガビットでは 4 つのペア A〜D すべてが必要です。

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

  • RESET — GND に引いてボードをリセットします。解放すると MCU は通常通り起動します。

  • BOOT0 — ボードへの給電中に 3.3 V に引くと、ROM ブートローダーモードに入ります。OpenMV IDE はこのモードを使ってオンボードのブートローダーを再フラッシュします。

  • BOOT1 — ボードを ST のツール(ARM 10 ピン SWD/JTAG ヘッダーに接続した ST‑LINK)で使用する開発者モードにするスイッチです。OpenMV ファームウェアおよびツールでの通常動作時は、これを無効のままにしておいてください。

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

オンボードペリフェラル

LED

N6 には 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 の充電中は点灯し続けます。

ユーザーボタン

N6 には 2 つのボタンがあります。

  • 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.

電源ステータスピン

3 つのアクティブローのステータス入力により、ファームウェアはオンボードの電源管理チップの状態を確認できます。

  • 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.ioctlcsi.IOCTL_SET_TRIGGERED_MODE とともに使うことで有効にできます。読み出しが次フレームの積分とパイプライン処理されなくなるため、フレームレートはフリーランニングモードのおよそ半分に下がります:

cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)

NPU

N6 の 1 GHz Neural‑ART NPU(INT8 で 600 GOPS)は 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 として届くため、簡単な DSP のために 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 も公開します。asyncio に適した BLE には aioble --- 非同期 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())

イーサネット

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 V CMOS で、ピンあたり最大 20 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

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

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

汎用パッド。内部で P6 に接続

BAT_ADC

約 5.0 V

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

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

N6 ファームウェアはブート時に最大 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 の チャンネルが一瞬点灯することがあります — これはファームウェアが駆動するアクティビティインジケーターであり、障害ではありません。

ストレージサイズ

N6 には次のものが同梱されています。

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

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

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

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

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

ソフトウェアライブラリ

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