OpenMV Cam RT1062

OpenMV Cam RT1062는 NXP i.MX RT1062(Cortex‑M7 @ 600 MHz)를 중심으로 구축된 저전력 머신 비전 보드입니다. 이 보드는 USB‑C 고속 네트워킹, Wi‑Fi/Bluetooth, 10/100 이더넷을 분리 가능한 캐리어에 장착된 OV5640 5MP 센서와 결합합니다. 이 카메라는 딥 슬립 상태에서 LiPo 배터리로부터 약 30 µA만 소비하므로, 배터리 구동 프로젝트에 매우 적합합니다.

OpenMV Cam RT1062

전체 데이터시트, 사진, 치수는 OpenMV Cam RT1062 제품 페이지를 참조하십시오.

주요 특징

  • 600 MHz의 NXP i.MX RT1062 Cortex‑M7.

  • 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비트 3축 가속도계, ±2/4/8 g).

  • 고속 USB‑C (480 Mb/s, 1.5 A 전류 제한), 10/100 Mb/s 이더넷 (실드를 통한 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, 센서 또는 외부 신호가 이를 구동할 수 있습니다. 한 번에 하나의 드라이버만 활성화되도록 하십시오.

참고

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

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

이더넷 핀

RT1062는 10/100 Mb/s 이더넷 PHY의 MDI 쌍을 GPIO 헤더 옆의 전용 패드에 노출합니다. MDI 핀은 RJ45에 곧바로 배선하기에 안전하지 않습니다 — PHY와 케이블 사이에 이더넷 마그네틱(매그잭에 내장되었거나 실드에 장착된 절연 변압기)이 반드시 필요합니다. OpenMV PoE 실드에는 이것이 포함되어 있습니다. 직접 잭을 만든다면 마그네틱이 통합된 RJ45 또는 외부 변압기를 사용하십시오.

  • ETH_LED — 링크/활동 LED. 링크가 연결되면 액티브 로우이며, 트래픽이 있으면 깜박입니다.

  • ETH_TXP / ETH_TXN — 송신 쌍.

  • ETH_RXP / ETH_RXN — 수신 쌍.

참고

헤더에는 Reserved라고 실크스크린된 4개의 패드도 노출되어 있습니다. 이들은 OpenMV N6의 기가비트 이더넷 쌍(DC P/N 및 DD P/N)과 풋프린트 호환되므로 동일한 이더넷 / PoE 실드를 두 보드 중 어느 쪽에든 꽂을 수 있습니다. RT1062의 PHY는 10/100 Mb/s만 지원하므로 이 4개의 패드는 전기적 연결이 없습니다 — 연결하지 않은 채로 두십시오.

복구 및 디버그 핀

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

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

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

참고

RT1062는 기본적으로 이 커넥터를 통해 SWD 디버그만 노출합니다. 전체 JTAG은 기본 제공되지 않습니다.

온보드 주변장치

LED

RT1062에는 두 개의 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가 충전되는 동안 여전히 켜집니다.

버튼

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.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 — 머신 러닝CMSIS‑NN 커널을 사용하여 Cortex‑M7에서 양자화된 TFLite 모델을 실행합니다 — 초당 몇 프레임의 속도로 소형 검출기를 돌리기에 충분히 빠릅니다. 읽기 전용 /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으로 인해 타임아웃됩니다.) 16‑bit 메모리 주소와 함께 표준 machine.I2C readfrom_mem / writeto_mem API를 사용하십시오:

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

이더넷

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

참고

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

  • 내부 플래시 — 항상 /flash에 마운트됩니다. 기본적으로 main.pyREADME.txt를 담고 있으며, 첫 부트 시 생성됩니다.

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

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

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

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

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

boot.py 또는 main.py를 SD 카드에 넣으면 플래시의 사본을 건드리지 않고 이를 재정의합니다 — 두 파일 모두 부트 디렉터리(카드가 마운트되면 /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의 적색 채널이 잠시 켜질 수 있습니다 — 이는 펌웨어가 구동하는 활동 표시기이며 결함이 아닙니다.

저장 용량

RT1062에는 다음이 제공됩니다:

  • /flash4 MB FAT 파일 시스템, 읽기/쓰기.

  • /rom8 MB 읽기 전용 메모리 매핑 ROMFS, 제로 카피 mmap 액세스의 이점을 누리는 스크립트와 ML 모델을 제공하는 데 사용됩니다.

  • /sdcard — 삽입된 microSD 카드의 전체 용량(있는 경우), 읽기/쓰기.

하드 폴트 표시기

사용자 RGB LED가 모든 색상을 빠르게 순환하고 있다면 — 뚜렷한 색조라기보다는 반짝이는 흰색 LED처럼 보일 만큼 빠르게 — 펌웨어가 복구 불가능한 하드 폴트에 도달한 것입니다. 복구하려면 펌웨어를 다시 플래시하십시오. 다시 플래시해도 도움이 되지 않으면 보드가 물리적으로 손상되었을 수 있습니다.

소프트웨어 라이브러리

RT1062 빌드에만 고유한 모듈을 포함한 전체 모듈 목록은 라이브러리 색인을 참조하십시오.