OpenMV N6

OpenMV N6는 STMicroelectronics STM32N657(Cortex‑M55 @ 800 MHz)를 기반으로 하며, 600 GOPS INT8 성능의 1 GHz 온칩 NPU를 탑재하고 있습니다. NPU에 더해 분리형 캐리어에 장착된 PAG7936 1 MP 글로벌 셔터 센서, 기가비트 Ethernet, 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‑bit SIMD 탑재 — 6.4 기가옵스 벡터 처리량.

  • 1 GHz NPU, 600 GOPS INT8 — YOLOv8/YOLOv11 검출을 30 FPS로 실행.

  • 최대 5MP RAW 베이어를 위한 ISP, 스케일링 및 3D 회전을 위한 2D GPU, 1080p H.264 인코딩, 하드웨어 JPEG 코덱.

  • 64 MB 외부 SDRAM (16‑bit @ 200 MHz DDR, 800 MB/s)과 4.2 MB 내부 SRAM, 32 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/n + Bluetooth 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‑bit ADC 입력(내부적으로 P6에 연결됨)

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM17 CH1

P10

TIM15 CH2 / 프레임 동기 I/O

P11

wakeup(액티브 로우, 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, 센서 또는 외부 신호가 이를 구동할 수 있습니다(일부 센서는 동일한 핀을 트리거 입력 또는 노출 출력으로 사용할 수 있습니다). 한 번에 하나의 드라이버만 활성화되도록 하십시오.

참고

ONOFF와 P11은 항상 켜져 있는 RAW 레일을 기준으로 합니다 (스위칭되는 3.3 V 레일이 아님). 따라서 보드의 나머지 부분이 딥 슬립 / 저전력 모드에 있는 동안에도 계속 동작합니다. 두 입력 모두 액티브 로우입니다.

이 핀들은 RAW 레일에서 동작할 수 있도록 레벨 시프터를 거칩니다. ONOFF 또는 P11에서 3.3 V 직결 GPIO 동작이 반드시 필요하다면(예: 시프터를 거치지 않고 3.3 V MCU에서 직접 구동), 보드에는 시프터를 우회할 수 있는 풀업 및 0‑옴 점퍼 패드가 노출되어 있습니다. 이는 고급 하드웨어 개조이므로 — 대부분의 사용자는 그대로 두는 것이 좋습니다.

참고

P15–P18은 기본적으로 연결되어 활성화된 기가비트 Ethernet PHY와 공유됩니다. 이 핀들을 사용자 I/O로 사용하려면 보드 뒷면의 0‑옴 저항을 GPIO 위치로 리플로우해야 합니다. 이렇게 하면 기가비트 Ethernet만 비활성화되며 — 10/100 Mb/s Ethernet은 전용 핀에서 계속 작동합니다.

전원 핀

  • 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이 계속 작동합니다.

주어진 활성 / 딥슬립 듀티 사이클에서 N6가 배터리로 얼마나 오래 작동할지 모델링하려면 배터리 수명 추정기 를 사용하십시오.

Ethernet 핀

N6는 GPIO 헤더 옆의 전용 패드에 Ethernet PHY의 MDI 페어를 노출합니다. MDI 핀은 RJ45에 직접 연결하기에 안전하지 않으므로 — PHY와 케이블 사이에 Ethernet 자기 소자(절연 변압기, 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 만 필요합니다. 기가비트에는 네 개의 페어 A–D 가 모두 필요합니다.

복구 및 디버그 핀

  • RESET — 보드를 리셋하려면 GND로 당깁니다. 이를 해제하면 MCU가 정상적으로 시작됩니다.

  • BOOT0 — 보드에 전원을 공급하는 동안 3.3 V로 당기면 ROM 부트로더 모드로 진입합니다. OpenMV IDE는 이 모드를 사용하여 온보드 부트로더를 재플래시합니다.

  • BOOT1 — ST 툴링(ARM 10핀 SWD/JTAG 헤더에 연결된 ST‑LINK)과 함께 사용하기 위해 보드를 개발자 모드로 전환하는 스위치입니다. OpenMV 펌웨어 및 도구로 정상 동작하려면 이를 비활성화 상태로 두십시오.

ST‑LINK 및 SEGGER J‑Link 어댑터와 호환되는 전용 ARM 10핀 SWD/JTAG 헤더가 장착되어 있습니다.

온보드 주변장치

LED

N6에는 두 개의 RGB LED가 있습니다:

  • 사용자 RGB LED — 소프트웨어로 제어 가능하며, LED_RED, LED_GREEN, LED_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에는 두 개의 버튼이 있습니다:

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

전원 상태 핀

세 개의 액티브 로우 상태 입력을 통해 펌웨어가 온보드 전원 관리 칩의 동작 상태를 확인할 수 있습니다:

  • 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.IOCTL_SET_TRIGGERED_MODE 와 함께 csi.CSI.ioctl 를 통해 활성화하십시오. 판독이 더 이상 다음 프레임의 적분과 파이프라인화되지 않으므로 프레임 레이트는 프리러닝 모드의 약 절반으로 떨어집니다:

cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)

NPU

N6의 1 GHz Neural‑ART NPU(600 GOPS INT8)는 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())

Ethernet

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에 도달하기 전에 op‑amp 버퍼링된 전압 분배기를 거치므로, 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 == far infrared, 원적외선) 드라이버가 포함되어 있습니다:

  • 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 펌웨어는 부팅 시 최대 세 개의 파일시스템을 마운트합니다:

  • 내부 플래시 — 항상 /flash 에 마운트됩니다. 기본적으로 main.pyREADME.txt 를 보유하며, 최초 부팅 시 생성됩니다.

  • microSD 카드 — 카드가 삽입되면 /sdcard 에 마운트됩니다.

  • ROMFS/rom 의 읽기 전용 메모리 매핑 파일시스템으로, 제로 카피 접근의 이점을 누리는 큰 데이터 자산(예: AI 모델)을 배포하는 데 사용됩니다. 사용자 Python이 실행되기 전 시작 시 MicroPython에 의해 자동으로 마운트됩니다.

마운트 후, 카드가 있으면 작업 디렉터리가 /sdcard 로, 그렇지 않으면 /flash 로 설정됩니다. 그런 다음 인터프리터가 해당 디렉터리에서 스크립트를 실행합니다:

  • boot.py모든 소프트 리셋(콜드 부트, REPL에서의 Ctrl‑D, 또는 실행 중인 스크립트가 반환될 때마다)에서 실행됩니다.

  • main.pyboot.py 직후 콜드 부트에서만 실행됩니다. 이후의 소프트 리셋은 boot.py 를 다시 실행하지만 곧바로 REPL로 떨어집니다 — main.py 를 다시 실행하려면 보드를 완전히 리셋해야 합니다.

SD 카드에 boot.py 또는 main.py 를 넣으면 플래시의 사본을 건드리지 않고 재정의합니다 — 두 파일 모두 부팅 디렉터리(카드가 마운트되면 /sdcard, 그렇지 않으면 /flash)에서 조회됩니다.

갓 플래시한 보드에 기본 제공되는 main.py 는 단지 사용자 RGB LED의 청색 채널을 하트비트로 깜박입니다(짧은 펄스 두 번, 짧은 간격). 따라서 호스트를 연결하지 않고도 펌웨어가 정상적으로 부팅되었는지 알 수 있습니다.

sys.path 는 세 파일시스템 모두와 각각의 lib/ 하위 디렉터리를 포함하도록 확장되므로, 임포트 가능한 모듈은 /flash/lib, /sdcard/lib 또는 /rom/lib 에 위치할 수 있습니다.

시스템이 삽입된 SD 카드를 무시하도록 강제하려면(예: 카드가 있는 상태에서도 플래시의 main.py 를 실행하려면), /flash 의 루트에 SKIPSD 라는 빈 파일을 생성하십시오.

USB로 연결되면 부팅 파일시스템(카드가 있으면 /sdcard, 그렇지 않으면 /flash)도 호스트에서 USB 대용량 저장 장치 드라이브로 열거되어, boot.py, main.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 빌드에만 고유한 모듈을 포함한 전체 모듈 목록은 라이브러리 색인 을 참조하십시오.