OpenMV Cam RT1062

OpenMV Cam RT1062 là bo mạch thị giác máy tiết kiệm điện được xây dựng xung quanh NXP i.MX RT1062 (Cortex‑M7 @ 600 MHz). Bo mạch kết hợp mạng USB‑C tốc độ cao, Wi‑Fi/Bluetooth và Ethernet 10/100 với cảm biến 5MP OV5640 trên một module có thể tháo rời. Camera chỉ tiêu thụ ~30 µA từ pin LiPo trong chế độ ngủ sâu, phù hợp với các dự án dùng pin.

OpenMV Cam RT1062

Để xem datasheet đầy đủ, ảnh chụp và kích thước, hãy xem trang sản phẩm OpenMV Cam RT1062.

Điểm nổi bật

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

  • 32 MB SDRAM ngoài (16‑bit @ 160 MHz, 320 MB/s) cùng với 1 MB SRAM trong16 MB bộ nhớ flash QSPI (133 MHz 4‑bit SDR, đọc 66 MB/s); 4 KB EEPROM trên R6+.

  • Cảm biến cuộn OV5640 5MP.

  • IMU tích hợp (gia tốc kế 3 trục 12‑bit, ±2/4/8 g).

  • USB‑C tốc độ cao (480 Mb/s, giới hạn dòng 1,5 A), Ethernet 10/100 Mb/s (hỗ trợ PoE qua shield), Wi‑Fi a/b/g/n + Bluetooth 5.1 (ăng-ten chip hoặc tùy chọn U.FL).

  • Khe microSD — SD tối đa 2 GB, SDHC tối đa 32 GB, SDXC tối đa 2 TB.

  • Bộ sạc LiPo (500 mA trên R6+, 100 mA trên R4/R5), RTC với các pad pin dự phòng. Chế độ ngủ sâu tiêu thụ ~30 µA khi dùng pin.

  • 14 chân I/O, tất cả đầu ra 3,3 V / chịu được 3,3 V, 4 mA mỗi chân (pin), có thể tạo ngắt.

  • LED RGB người dùng, nút SW người dùng, nút nguồn phần cứng (máy trạng thái ngủ sâu / thức dậy) và một LED trạng thái riêng cho sạc / USB / nguồn VIN.

Cảnh báo

Các chân (pin) I/O của RT1062 không chịu được điện áp 5 V. Không kết nối trực tiếp thiết bị với MCU 5 V như Arduino Mega. Chỉ cấp nguồn cho bo mạch qua VIN.

Sơ đồ chân

OpenMV Cam RT1062 OV5640 Pinout

Bảng tham chiếu chân

Tên chân

Chức năng

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 / đồng bộ khung hình I/O

P11

wakeup (tích cực mức thấp, kết nối với GND để đánh thức)

P12

RESET — kéo xuống GND để reset bo mạch (không phải GPIO)

P13

I/O số

P14

I/O số

ON/OFF

pad trên header sao chép nút nguồn phần cứng (tích cực mức thấp)

SW

nút người dùng (tích cực mức thấp)

ST

mức thấp khi nguồn VIN, mức cao khi nguồn USB

CHG

tích cực mức thấp; mức thấp khi pin LiPo đang được sạc

PG

tích cực mức thấp; mức thấp khi có nguồn VIN hoặc USB

LED_RED

Kênh đỏ LED RGB (tích cực mức thấp)

LED_GREEN

Kênh xanh lá LED RGB (tích cực mức thấp)

LED_BLUE

Kênh xanh dương LED RGB (tích cực mức thấp)

Ghi chú

Đường đồng bộ khung hình P10 là bus dùng chung. Nó được nối với MCU, chân kích hoạt / thời gian phơi sáng của cảm biến camera và header người dùng cùng một lúc. Chiều điều khiển do ứng dụng xác định — MCU, cảm biến hoặc tín hiệu bên ngoài có thể điều khiển tùy theo cách cấu hình cảm biến. Đảm bảo chỉ có một bộ điều khiển hoạt động tại một thời điểm.

Ghi chú

ON/OFF và P11 tham chiếu đến đường RAW luôn bật (không phải đường 3,3 V được chuyển mạch), do đó chúng vẫn hoạt động trong khi phần còn lại của bo mạch đang ở chế độ ngủ sâu / tiết kiệm điện. Cả hai đầu vào đều tích cực mức thấp.

Các chân này đi qua các bộ dịch mức điện áp để có thể hoạt động trên đường RAW. Nếu bạn thực sự cần hành vi GPIO trực tiếp 3,3 V trên ON/OFF hoặc P11 (ví dụ: để điều khiển chúng từ MCU 3,3 V mà không qua bộ dịch), bo mạch có các pad kéo lên và jumper 0 ohm cho phép bỏ qua bộ dịch. Đây là thay đổi phần cứng nâng cao — hầu hết người dùng không cần làm điều này.

Ghi chú

P13 và P14 là GPIO thông thường theo mặc định không có chức năng đặc biệt. Các pad có thể được tùy chọn định tuyến lại sang các tín hiệu khác bằng cách hàn lại các cầu nhảy điện trở 0 ohm ở mặt sau bo mạch:

  • P13 ↔ Trạng thái CHG / JTAG TRSTB

  • P14 ↔ Trạng thái ST / JTAG TDI

Hầu hết người dùng sẽ không chạm vào các jumper này — để ở mặc định GPIO trừ khi bạn cần đọc lại trạng thái quản lý nguồn hoặc JTAG.

Chân nguồn

  • 3.3V — đường điện áp điều chỉnh 3,3 V. Chỉ xuất trên RT1062 — không đưa nguồn bên ngoài vào chân này. Có sẵn tối đa 1 A cho các shield.

  • VIN — đầu vào 5 V. Cấp nguồn cho bo mạch và bộ sạc LiPo tích hợp.

  • RAW — vào/ra, luôn bật (3,6 V – 5 V). Mang nguồn nào đang hoạt động (VIN, USB hoặc pin được nối), và cũng có thể dùng như đầu vào. Bạn phải nối RAW qua diode nối tiếp khi đưa nguồn vào — nếu không dòng điện sẽ chạy ngược lại vào VIN/USB và làm hỏng nguồn cung cấp hoặc mạch bảo vệ tích hợp.

  • GND — nối đất chung.

Ghi chú

Chip quản lý nguồn tích hợp tự động chọn USB hoặc VIN có điện áp cao hơn để cấp nguồn cho bo mạch và bộ sạc pin. Nếu có LiPo được nối, nó sẽ sạc trên phần điện áp dư thừa, và bộ điều khiển dự phòng sang pin để giữ cho bo mạch hoạt động nếu VIN/USB giảm hoặc bị ngắt.

Ghi chú

Mặt sau bo mạch có các pad hàn cho pin dự phòng RTC 3,3 V bên ngoài. Gắn pin đồng xu vào các pad này giữ RTC hoạt động khi phần còn lại của bo mạch không có điện.

Mẹo

Sử dụng công cụ ước tính thời lượng pin để mô hình hóa thời gian RT1062 chạy trên pin với chu kỳ hoạt động / ngủ sâu nhất định.

Chân Ethernet

RT1062 đưa các cặp MDI của Ethernet PHY 10/100 Mb/s ra các pad riêng bên cạnh header GPIO. Các chân MDI không thể kết nối thẳng vào RJ45 — cần có cuộn cảm Ethernet (biến áp cách ly, hoặc tích hợp trong magjack hoặc trên shield) bắt buộc giữa PHY và cáp. Shield PoE OpenMV đã bao gồm; nếu bạn tự làm jack, hãy dùng RJ45 tích hợp magnetics hoặc biến áp ngoài.

  • ETH_LED — LED kết nối/hoạt động. Tích cực mức thấp khi có kết nối; nhấp nháy khi có lưu lượng.

  • ETH_TXP / ETH_TXN — cặp truyền.

  • ETH_RXP / ETH_RXN — cặp nhận.

Ghi chú

Header cũng đưa ra bốn pad được ký hiệu Reserved. Chúng tương thích footprint với các cặp Ethernet gigabit trên OpenMV N6 (DC P/N và DD P/N) để cùng một shield Ethernet / PoE có thể cắm vào cả hai bo mạch. PHY của RT1062 chỉ hỗ trợ 10/100 Mb/s, nên bốn pad đó không có kết nối điện — để trống.

Chân khôi phục và gỡ lỗi

  • RESET — kéo xuống GND để reset bo mạch. Nhả ra thì MCU khởi động bình thường.

  • SBL — kéo lên 3,3 V trong khi cấp nguồn cho bo mạch để vào chế độ ROM bootloader (Serial Boot Loader). OpenMV IDE sử dụng chế độ này để cập nhật lại bootloader tích hợp.

Một header ARM 10‑pin SWD/JTAG riêng được trang bị, tương thích với các bộ chuyển đổi ST‑LINK và SEGGER J‑Link.

Ghi chú

RT1062 chỉ đưa ra gỡ lỗi SWD qua connector này theo mặc định. JTAG đầy đủ không có sẵn ngay từ đầu.

Ngoại vi tích hợp

LED

RT1062 có hai LED RGB:

  • LED RGB người dùng — điều khiển bằng phần mềm, được hiển thị là LED_RED, LED_GREENLED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • LED nguồn — được điều khiển trực tiếp bởi phần cứng quản lý nguồn tích hợp, không có điều khiển phần mềm. Dùng để xem trạng thái nguồn cung cấp nhanh chóng.

    Khi đang chạy:

    Kênh

    Ý nghĩa

    Xanh dương

    VIN đang cấp nguồn cho bo mạch (tắt khi dùng USB)

    Xanh lá

    USB hoặc VIN đang có nguồn

    Đỏ

    đang sạc pin LiPo được nối

    Trong chế độ ngủ sâu tất cả các kênh đều tắt ngoại trừ Đỏ, vẫn sáng khi LiPo đang được sạc.

Nút bấm

RT1062 có hai nút:

  • SW — nút người dùng đa năng. Đọc từ code như đầu vào GPIO tích cực mức thấp thông thường:

    from machine import Pin
    
    sw = Pin("SW", Pin.IN)
    print(sw.value())
    
  • Nút nguồn — được điều khiển bởi một máy trạng thái bộ điều khiển nguồn riêng trên bo mạch RT1062, hoàn toàn bằng phần cứng. Nó không được hiển thị với code người dùng; bộ điều khiển quyết định hành động dựa trên thời gian giữ:

    • Giữ ~5 s khi bo mạch đang chạy → máy trạng thái chuyển sang ngủ sâu.

    • Giữ ~1 s khi bo mạch đang ngủ sâu → máy trạng thái khởi động lại hệ thống.

    Kéo pad header ON/OFF xuống mức thấp có tác dụng tương tự như nhấn nút nguồn tích hợp — hữu ích để nối công tắc ngoài hoặc điều khiển đường từ vi điều khiển khác.

Chân trạng thái nguồn

Ba đầu vào trạng thái tích cực mức thấp từ chip quản lý nguồn tích hợp:

  • PG — mức thấp khi có nguồn VIN hoặc USB. Luôn được kết nối.

  • ST — mức thấp khi bo mạch đang chạy bằng VIN, mức cao khi chạy bằng nguồn USB. Không được kết nối theo mặc định.

  • CHG — mức thấp khi pin LiPo được nối đang sạc. Không được kết nối theo mặc định.

from machine import Pin

power_ok = not Pin("PG", Pin.IN).value()

Cảm biến camera

OV5640 được điều khiển qua module csi --- cảm biến camera

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 có bộ nén JPEG tích hợp. Đặt csi.CSI.pixformat thành csi.JPEG và cảm biến gửi các khung hình nén thẳng đến camera qua bus camera, giúp chụp ảnh độ phân giải cao trở nên khả thi: csi.HD (1280×720), csi.FHD (1920×1080), và 5MP đầy đủ csi.WQXGA2 (2592×1944) đều stream dạng JPEG. Tinh chỉnh nén bằng csi.CSI.quality (0-100, cao hơn = khung hình lớn hơn, nhiều chi tiết hơn):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

Cảm biến nằm trên module có thể tháo rời — hoán đổi cho bất kỳ module camera OpenMV nào khác (màn trập toàn cầu, nhiệt, độ phân giải cao hơn, v.v.) mà không thay đổi phần còn lại của bo mạch.

Học máy

ml --- Machine Learning chạy các mô hình (ML) TFLite đã lượng tử hóa trên Cortex‑M7 với các kernel CMSIS‑NN — đủ nhanh cho các bộ phát hiện nhỏ gọn ở vài khung hình mỗi giây. Các mô hình (ML) trên hệ thống tệp chỉ đọc /rom tải trực tiếp từ bộ nhớ flash mà không cần sao chép vào RAM. Đây là bộ phát hiện BlazeFace 128×128 phủ mặt được phát hiện và sáu điểm đặc trưng của nó lên mỗi khung hình:

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

Firmware RT1062 không kết nối gia tốc kế tích hợp với module imu --- cảm biến IMU. Thay vào đó hãy giao tiếp trực tiếp qua bus I²C nội bộ — chip nằm ở địa chỉ 0x15 và đóng gói ba kênh gia tốc 12‑bit có dấu cộng một byte nhiệt độ 8‑bit bắt đầu từ thanh ghi 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

Bo mạch R6 trở lên bao gồm 4 KB I²C EEPROM chung trên cùng bus nội bộ với gia tốc kế. (Các phiên bản trước không có — gọi các đoạn code này trên R4/R5 sẽ hết thời gian chờ do không có I²C ack.) Sử dụng API machine.I2C readfrom_mem / writeto_mem tiêu chuẩn với địa chỉ bộ nhớ 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))

Cả đọc và ghi phải ở trong phạm vi trang 32 byte. Chia bất kỳ lần truyền lớn hơn thành một lần gọi mỗi trang, và thêm độ trễ chu kỳ ghi ~5 ms giữa các lần ghi liên tiếp.

Wi‑Fi

Module CYW43 tích hợp được hiển thị qua network --- cấu hình mạng như một giao diện trạm. Sau khi kết nối, ipconfig("addr4") trả về cặp (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

Cùng module không dây cũng hỗ trợ Bluetooth 5.1. Sử dụng aioble --- Async BLE để BLE thân thiện với asyncio — ví dụ: quảng bá như một thiết bị ngoại vi và chờ thiết bị trung tâm kết nối:

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

Khi RJ45 (có magnetics) được kết nối với các pad MDI, 10/100 PHY xuất hiện như giao diện LAN. DHCP chạy tự động khi kết nối được thiết lập:

import network, time

lan = network.LAN()
lan.active(True)
while not lan.isconnected():
    time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])

Thẻ microSD

Khi thẻ được lắp, nó được gắn kết tự động tại /sdcard và có thể sử dụng qua hệ thống tệp thông thường:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

Tham chiếu bus

GPIO

Sử dụng machine.Pin để đọc hoặc điều khiển bất kỳ chân (pin) nào được ký hiệu. Đầu ra là CMOS 3,3 V và có thể nhận/cấp tối đa 4 mA mỗi chân (pin).

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

Bất kỳ chân (pin) đầu vào nào cũng có thể kích hoạt ngắt trên các chuyển tiếp cạnh:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Bus

TX

RX

UART1

P4

P5

from machine import UART

uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

Bus

SCL

SDA

I2C1

P4

P5

from machine import I2C

i2c = I2C(1, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

Phần cứng tương tự cũng có thể được sử dụng ở chế độ đích (slave) qua machine.I2CTarget để hiển thị vùng bộ nhớ cho bộ điều khiển I²C khác:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(1, addr=0x42, mem=buf)

SPI

Bus

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

Bus

TX

RX

CAN1

P1

P3

Ghi chú

CAN chưa được hỗ trợ trên bo mạch này trong firmware 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

Chân ADC người dùng duy nhất là P6, toàn dải ở ~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

Chân

Kênh 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

Điều khiển bất kỳ chân nào trong số chúng qua machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("P9"), freq=1_000, duty_u16=32768)

Bus bit-bang bằng phần mềm

machine.SoftI2Cmachine.SoftSPI hoạt động trên bất kỳ GPIO nào nếu bạn cần bus bổ sung.

Cảm biến nhiệt (ngoài bo mạch)

Firmware bao gồm driver fir --- trình điều khiển cảm biến nhiệt (fir == hồng ngoại xa) cho các thiết bị chụp ảnh nhiệt được kết nối bên ngoài:

  • MLX90621 — mảng IR 16 × 4

  • MLX90640 — mảng IR 32 × 24

  • MLX90641 — mảng IR 16 × 12

  • AMG8833 — mảng IR 8 × 8

Kết nối module với bus I²C của bo mạch và đọc các khung hình bằng 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())

Driver fir chỉ giao tiếp với cảm biến qua I²C 4 — kết nối module với P4 (SCL) và P5 (SDA).

Định thời

time

Module time bao gồm các độ trễ chặn, ticks đơn điệu và đo thời gian đã trôi qua:

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)

Bộ định thời ảo

machine.Timer lên lịch các hàm gọi lại theo chu kỳ hoặc một lần mà không chiếm dụng khe bộ định thời phần cứng. Truyền -1 làm id để sử dụng bộ định thời ảo (phần mềm):

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

Giá trị chu kỳ tính bằng mili giây. Gọi deinit() để dừng và giải phóng khe.

Đồng hồ thời gian thực

machine.RTC giữ thời gian đồng hồ treo tường qua các lần reset và (với pin dự phòng 3,3 V tùy chọn được nối với các pad phía sau, xem Chân nguồn) qua mất điện hoàn toàn:

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 cũng hoạt động qua chế độ ngủ sâu, vì vậy bạn có thể sử dụng nó như nguồn đánh thức cho machine.deepsleep().

Watchdog

machine.WDT reset bo mạch nếu ứng dụng bị treo. Một khi đã khởi động không thể dừng hoặc cấu hình lại — feed nó định kỳ trong vòng lặp chính của bạn:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Thông tin khởi động và runtime

Cửa sổ bootloader USB

Mỗi lần khởi động, camera chạy một bootloader ngắn (vài giây) cho phép OpenMV IDE cập nhật firmware mà không cần người dùng vào chế độ DFU. Sau khi cửa sổ hết hạn, bootloader chuyển giao cho boot.py rồi đến main.py.

Một tập lệnh đang chạy có thể vào lại bootloader theo yêu cầu bằng cách gọi machine.bootloader()

import machine

machine.bootloader()

Hệ thống tệp và thứ tự khởi động

Firmware RT1062 gắn kết tối đa ba hệ thống tệp khi khởi động:

  • Bộ nhớ flash trong — luôn được gắn kết tại /flash. Mặc định chứa main.pyREADME.txt; được tạo vào lần khởi động đầu tiên.

  • Thẻ microSD — nếu thẻ được lắp, nó được gắn kết tại /sdcard.

  • ROMFS — hệ thống tệp chỉ đọc, ánh xạ bộ nhớ tại /rom dùng để cung cấp các tài sản dữ liệu lớn (ví dụ: mô hình AI) hưởng lợi từ truy cập zero‑copy. Được gắn kết tự động bởi MicroPython khi khởi động, trước khi chạy Python người dùng.

Sau khi gắn kết, thư mục làm việc được đặt thành /sdcard khi thẻ có mặt, nếu không thì /flash. Trình thông dịch sau đó chạy các tập lệnh từ thư mục đó:

  • boot.py được thực thi trên mỗi lần soft reset (khởi động lạnh, Ctrl‑D từ REPL, hoặc bất cứ khi nào tập lệnh đang chạy kết thúc).

  • main.py được thực thi chỉ khi khởi động lạnh, ngay sau boot.py. Các lần soft reset tiếp theo chạy lại boot.py nhưng đi thẳng đến REPL — để chạy lại main.py bạn phải reset đầy đủ bo mạch.

Đặt boot.py hoặc main.py lên thẻ SD sẽ ghi đè bản sao trong flash mà không ảnh hưởng đến nó — cả hai tệp đều được tìm kiếm trong thư mục khởi động (/sdcard khi thẻ được gắn kết, ngược lại thì /flash).

main.py mặc định được cung cấp trên bo mạch mới flash chỉ nhấp nháy kênh xanh dương của LED RGB người dùng như nhịp tim (hai xung ngắn, khoảng trống ngắn), để bạn biết firmware đã khởi động sạch mà không có host nào được kết nối.

sys.path được mở rộng để bao gồm cả ba hệ thống tệp và các thư mục con lib/ của chúng, vì vậy các module có thể nhập được có thể nằm ở /flash/lib, /sdcard/lib hoặc /rom/lib.

Để buộc hệ thống bỏ qua thẻ SD được lắp (ví dụ: để chạy main.py của flash ngay cả khi có thẻ), hãy tạo một tệp trống tên SKIPSD ở thư mục gốc của /flash.

Khi kết nối qua USB, hệ thống tệp khởi động (/sdcard nếu có thẻ, nếu không thì /flash) cũng liệt kê như ổ đĩa lưu trữ khối USB trên host, cho phép bạn chỉnh sửa boot.py, main.py và bất kỳ tệp nào khác trực tiếp. Eject ổ đĩa trước khi reset camera để host flush các ghi đã lưu trong bộ đệm.

Ghi chú

Vì hệ điều hành xử lý ổ đĩa như thiết bị khối thụ động, các tệp được tạo hoặc sửa đổi bởi code chạy trên OpenMV Cam sẽ không xuất hiện cho đến khi host gắn lại ổ đĩa. Nếu cả hệ điều hành và OpenMV Cam ghi vào cùng hệ thống tệp cùng một lúc, hệ điều hành sẽ thắng và ghi đè các thay đổi của camera. Sử dụng thẻ SD cho bất kỳ dữ liệu nào mà tập lệnh ghi lại, và gắn lại trước khi đọc các tệp đó từ host.

Ghi chú

Kênh đỏ của LED RGB người dùng có thể sáng ngắn trong khi host đang đọc từ hoặc ghi vào ổ đĩa lưu trữ khối USB — đây là chỉ báo hoạt động do firmware điều khiển, không phải lỗi.

Kích thước lưu trữ

RT1062 được cung cấp với:

  • /flash — hệ thống tệp FAT 4 MB, đọc/ghi.

  • /rom — ROMFS ánh xạ bộ nhớ chỉ đọc 8 MB, dùng để cung cấp các tập lệnh và mô hình ML hưởng lợi từ truy cập mmap zero-copy.

  • /sdcard — kích thước đầy đủ của thẻ microSD được lắp (khi có), đọc/ghi.

Chỉ báo hard-fault

Nếu LED RGB người dùng đang chạy nhanh qua tất cả các màu sắc — đủ nhanh để trông giống LED trắng nhấp nháy hơn là các màu riêng biệt — firmware đã gặp hard fault không thể khôi phục. Nạp lại firmware để phục hồi; nếu nạp lại không giúp được, bo mạch có thể bị hỏng vật lý.

Thư viện phần mềm

Xem chỉ mục thư viện để biết danh sách đầy đủ các module — bao gồm những module dành riêng cho bản build RT1062.