OpenMV Cam RT1062#

Az OpenMV Cam RT1062 egy alacsony fogyasztású gépi látás kártya, amely az NXP i.MX RT1062 köré épül (Cortex‑M7 @ 600 MHz). A kártya nagy sebességű USB‑C hálózatot, Wi‑Fi/Bluetooth-t és 10/100 Ethernetet párosít egy OV5640 5MP érzékelővel, amely cserélhető hordozón ül. A kamera mélyalvásban csak ~30 µA-t vesz fel egy LiPo akkumulátorról, ami kiválóan alkalmassá teszi akkumulátoros projektekhez.

OpenMV Cam RT1062

A teljes adatlapért, fényképekért és méretekért lásd az OpenMV Cam RT1062 termékoldalt.

Kiemelt jellemzők#

  • NXP i.MX RT1062 Cortex‑M7 600 MHz-en.

  • 32 MB külső SDRAM (16 bites @ 160 MHz, 320 MB/s), valamint 1 MB belső SRAM és 16 MB QSPI flash memória (133 MHz 4 bites SDR, 66 MB/s olvasás); 4 KB EEPROM az R6+ kártyákon.

  • OV5640 5MP rolling‑shutter érzékelő.

  • Beépített IMU (12 bites 3 tengelyes gyorsulásmérő, ±2/4/8 g).

  • Nagy sebességű USB‑C (480 Mb/s, 1,5 A áramkorlát), 10/100 Mb/s Ethernet (PoE‑képes pajzson keresztül), Wi‑Fi a/b/g/n + Bluetooth 5.1 (chipantenna vagy U.FL opció).

  • microSD foglalat — SD legfeljebb 2 GB, SDHC legfeljebb 32 GB, SDXC legfeljebb 2 TB.

  • LiPo töltő (500 mA az R6+ kártyákon, 100 mA az R4/R5-ön), RTC tartalék akkumulátor csatlakozó pontokkal. A mélyalvás ~30 µA-t vesz fel akkumulátorról.

  • 14 I/O láb, mind 3,3 V kimenet / 3,3 V toleráns, 4 mA lábanként, megszakítás-képes.

  • Felhasználói RGB LED, felhasználói SW gomb, hardveres bekapcsoló gomb (mélyalvás / ébresztés állapotgép), valamint külön állapot-LED a töltéshez / USB-hez / VIN tápellátáshoz.

Figyelem

Az RT1062 I/O lábai nem 5 V toleránsak. Ne csatlakoztassa az eszközt közvetlenül egy 5 V-os MCU-hoz, mint az Arduino Mega. A kártyát csak a VIN-en keresztül táplálja.

Kiosztás#

OpenMV Cam RT1062 OV5640 Pinout

Láb referencia#

Láb neve

Funkció

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 / képkocka-szinkron I/O

P11

ébresztés (aktív alacsony, kösse GND-re az ébresztéshez)

P12

RESET — húzza GND-re a kártya újraindításához (nem GPIO)

P13

digitális I/O

P14

digitális I/O

ON/OFF

fejléc pad, amely a hardveres bekapcsoló gombot replikálja (aktív alacsony)

SW

felhasználói gomb (aktív alacsony)

ST

alacsony VIN tápellátáson, magas USB tápellátáson

CHG

aktív alacsony; alacsony, amíg egy csatlakoztatott LiPo akkumulátor töltődik

PG

aktív alacsony; alacsony, amikor VIN vagy USB tápellátás van jelen

LED_RED

RGB LED piros csatorna (aktív alacsony)

LED_GREEN

RGB LED zöld csatorna (aktív alacsony)

LED_BLUE

RGB LED kék csatorna (aktív alacsony)

Megjegyzés

A P10 képkocka-szinkron vonal egy megosztott busz. Egyszerre csatlakozik az MCU-hoz, a kamera érzékelőjének trigger / expozíció lábához és a felhasználói fejléchez. Az irány alkalmazás-függő — az MCU, az érzékelő vagy egy külső jel is meghajthatja attól függően, hogyan van az érzékelő konfigurálva. Ügyeljen arra, hogy egyszerre csak egy meghajtó legyen aktív.

Megjegyzés

Az ON/OFF és a P11 a mindig bekapcsolt RAW sínhez van viszonyítva (nem a kapcsolt 3,3 V-os sínhez), így működőképesek maradnak, miközben a kártya többi része mélyalvásban / alacsony fogyasztású módban van. Mindkét bemenet aktív alacsony.

Ezek a lábak szintillesztőkön mennek keresztül, hogy a RAW sínen tudjanak ülni. Ha mindenképpen 3,3 V-direkt GPIO viselkedésre van szüksége az ON/OFF vagy a P11 esetében (például hogy egy 3,3 V-os MCU-ról hajtsa meg őket az illesztő megkerülésével), a kártya felhúzó és 0 ohmos jumper padokat tesz elérhetővé, amelyek lehetővé teszik az illesztő megkerülését. Ez egy haladó hardveres átalakítás — a legtöbb felhasználónak érintetlenül kell hagynia.

Megjegyzés

A P13 és P14 alapértelmezetten egyszerű GPIO különleges funkció nélkül. A padok opcionálisan más jelekre is átirányíthatók a kártya hátoldalán lévő 0 ohmos ellenállás-forrasztóhidak újrafolyatásával:

  • P13 ↔ CHG állapot / JTAG TRSTB

  • P14 ↔ ST állapot / JTAG TDI

A legtöbb felhasználó nem fog hozzányúlni ezekhez a jumperekhez — hagyja őket a GPIO alapértelmezésen, kivéve, ha kifejezetten energiagazdálkodási visszaolvasásra vagy JTAG-ra van szüksége.

Táp lábak#

  • 3.3V — szabályozott 3,3 V-os sín. Az RT1062-n csak kimenet — ne tápláljon külső tápot ebbe a lábba. Legfeljebb 1 A áll rendelkezésre a pajzsok számára.

  • VIN — 5 V bemenet. Táplálja a kártyát és a beépített LiPo töltőt.

  • RAW — bemenet/kimenet, mindig bekapcsolt (3,6 V – 5 V). Azt a forrást viszi, amelyik éppen aktív (VIN, USB vagy csatlakoztatott akkumulátor), és bemenetként is használható. A RAW-ot soros diódán keresztül kell meghajtania, amikor tápot táplál bele — különben az áram visszafolyik a VIN/USB-be, és károsítja a tápot vagy a beépített védelmet.

  • GND — közös föld.

Megjegyzés

A beépített energiagazdálkodási chip automatikusan kiválasztja az USB vagy VIN közül azt, amelyiknek magasabb a feszültsége, hogy táplálja a kártyát és az akkumulátortöltőt. Ha LiPo van csatlakoztatva, az a fennmaradó tartalékon töltődik, és a vezérlő visszavált az akkumulátorra, hogy a kártya tovább működjön, ha a VIN/USB lecsökken vagy kihúzzák.

Megjegyzés

A kártya hátoldalán forrasztó padok vannak egy külső 3,3 V-os RTC tartalék akkumulátorhoz. Egy gombelem ezekre a padokra kötése életben tartja az RTC-t, miközben a kártya többi része táplálatlan.

Javaslat

Használja az akkumulátor-élettartam becslőt annak modellezésére, hogy mennyi ideig fog futni az RT1062 egy akkumulátorról adott aktív / mélyalvási kitöltési tényező mellett.

Ethernet lábak#

Az RT1062 a 10/100 Mb/s Ethernet PHY MDI párjait dedikált padokon teszi elérhetővé a GPIO fejléc mellett. Az MDI lábakat nem biztonságos közvetlenül egy RJ45-höz kötni — Ethernet mágnesesség (egy szigetelő transzformátor, vagy magjack-be építve, vagy a pajzson) szükséges a PHY és a kábel között. Az OpenMV PoE pajzs tartalmazza ezeket; ha saját csatlakozót készít, használjon mágnesesség-integrált RJ45-öt vagy külső transzformátort.

  • ETH_LED — kapcsolat/aktivitás LED. Aktív alacsony, amikor a kapcsolat fennáll; villog forgalom esetén.

  • ETH_TXP / ETH_TXN — adópár.

  • ETH_RXP / ETH_RXN — vevőpár.

Megjegyzés

A fejléc négy padot is elérhetővé tesz, amelyek Reserved felirattal vannak ellátva. Ezek lábnyom-kompatibilisek az OpenMV N6 gigabites Ethernet párjaival (DC P/N és DD P/N), így ugyanaz az Ethernet / PoE pajzs bármelyik kártyába bedugható. Az RT1062 PHY-ja csak 10/100 Mb/s-ot tud, így ennek a négy padnak nincs elektromos összeköttetése — hagyja őket csatlakoztatlanul.

Helyreállítási és hibakeresési lábak#

  • RESET — húzza GND-re a kártya újraindításához. Elengedve az MCU normálisan indul el.

  • SBL — húzza 3,3 V-ra a kártya tápellátása közben, hogy ROM rendszerbetöltő (Serial Boot Loader) módba lépjen. Az OpenMV IDE ezt a módot használja a beépített rendszerbetöltő újraflashelésére.

Egy dedikált ARM 10 tűs SWD/JTAG fejléc van felszerelve, amely kompatibilis a ST‑LINK és SEGGER J‑Link adapterekkel.

Megjegyzés

Az RT1062 alapértelmezetten csak SWD hibakeresést tesz elérhetővé ezen a csatlakozón keresztül. A teljes JTAG nem érhető el alapból.

Beépített perifériák#

LED-ek#

Az RT1062 két RGB LED-del rendelkezik:

  • Felhasználói RGB LED — szoftveresen vezérelhető, LED_RED, LED_GREEN és LED_BLUE néven elérhető:

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • Táp LED — közvetlenül a beépített energiagazdálkodási hardver hajtja meg, nincs szoftveres vezérlés. Használja arra, hogy egy pillantással leolvassa, mit csinál a tápellátás.

    Futás közben:

    Csatorna

    Jelentés

    Kék

    a VIN táplálja a kártyát (USB-n ki)

    Zöld

    USB vagy VIN tápellátás jelen van

    Piros

    egy csatlakoztatott LiPo akkumulátor töltése

    Mélyalvásban minden csatorna ki van kapcsolva, kivéve a Pirosat, amely még mindig világít, amíg egy LiPo töltődik.

Gombok#

Az RT1062 két gombbal rendelkezik:

  • SW — általános célú felhasználói gomb. Kódból normál aktív alacsony GPIO bemenetként olvasható:

    from machine import Pin
    
    sw = Pin("SW", Pin.IN)
    print(sw.value())
    
  • Bekapcsoló gomb — egy dedikált energiavezérlő állapotgép hajtja meg az RT1062 kártyán, teljesen hardveresen. Nincs kitéve a felhasználói kódnak; a vezérlő dönti el, mit tegyen attól függően, mennyi ideig tartják lenyomva:

    • Tartsa ~5 másodpercig miközben a kártya fut → az állapotgép mélyalvásba vált.

    • Tartsa ~1 másodpercig miközben a kártya mélyalvásban van → az állapotgép visszakapcsolja a rendszert.

    Az ON/OFF fejléc pad alacsonyra húzása ugyanazzal a hatással jár, mint a beépített bekapcsoló gomb megnyomása — hasznos egy külső kapcsoló bekötéséhez vagy a vonal meghajtásához egy másik mikrokontrollerről.

Tápállapot lábak#

Három aktív alacsony állapotbemenet a beépített energiagazdálkodási chiptől:

  • PG — alacsony, amikor VIN vagy USB tápellátás van jelen. Mindig csatlakoztatva.

  • ST — alacsony, amikor a kártya VIN-en fut, magas, amikor USB tápellátáson fut. Alapértelmezetten nincs csatlakoztatva.

  • CHG — alacsony, amíg egy csatlakoztatott LiPo akkumulátor töltődik. Alapértelmezetten nincs csatlakoztatva.

from machine import Pin

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

Kamera érzékelő#

Az OV5640-et a csi — kameraérzékelők modulon keresztül lehet meghajtani:

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

Az OV5640 beépített JPEG tömörítővel rendelkezik. Állítsa be a csi.CSI.pixformat-ot csi.JPEG-re, és az érzékelő tömörített képkockákat ad át közvetlenül a kamerának a kamerabuszon keresztül, ami praktikussá teszi a nagy felbontású felvételeket: csi.HD (1280×720), csi.FHD (1920×1080) és a teljes 5MP-es csi.WQXGA2 (2592×1944) mind JPEG-ként streamel. Hangolja a tömörítést a csi.CSI.quality-val (0-100, magasabb = nagyobb képkockák, több részlet):

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

Az érzékelő egy cserélhető modulon ül — cserélje ki bármelyik másik OpenMV kameramodulra (global shutter, hőkamera, magasabb felbontás stb.) anélkül, hogy a kártya többi részét megváltoztatná.

Gépi tanulás#

A ml — Gépi tanulás kvantált TFLite modelleket futtat a Cortex‑M7-en CMSIS‑NN kernelekkel — elég gyorsan ahhoz, hogy kompakt detektorokat néhány képkocka/másodperc sebességgel futtasson. A csak olvasható /rom fájlrendszeren lévő modellek közvetlenül a flash memóriából töltődnek be, RAM-ba másolás nélkül. Íme egy 128×128-as BlazeFace detektor, amely minden képkockára rávetíti az észlelt arcot és annak hat jellegzetes pontját:

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#

Az RT1062 firmware nem köti össze a beépített gyorsulásmérőt az imu — imu érzékelő modullal. Ehelyett közvetlenül a belső I²C buszon kommunikáljon vele — a chip a 0x15 címen található, és három előjeles 12 bites gyorsulási csatornát plusz egy 8 bites hőmérséklet bájtot tárol a 0x03 regisztertől kezdve:

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#

Az R6 és későbbi kártyák egy általános 4 KB-os I²C EEPROM-ot tartalmaznak ugyanazon a belső buszon, mint a gyorsulásmérő. (A korábbi változatokon nincs ilyen — ezen kódrészletek hívása R4/R5-ön időtúllépést okoz egy hiányzó I²C ack miatt.) Használja a szabványos machine.I2C readfrom_mem / writeto_mem API-t egy 16 bites memóriacímmel:

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

Mind az olvasásoknak, mind az írásoknak egy 32 bájtos oldalon belül kell maradniuk. Bontsa fel a nagyobb átviteleket oldalanként egy-egy hívásra, és adjon hozzá ~5 ms írásciklus-késleltetést az egymást követő írások között.

Wi‑Fi#

A beépített CYW43-családú modul a network — hálózati konfiguráció-en keresztül érhető el állomás interfészként. Csatlakozás után az ipconfig("addr4") visszaadja az (ip, netmask) párt:

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#

Ugyanaz a vezeték nélküli modul Bluetooth 5.1-et is elérhetővé tesz. Használja az aioble — Aszinkron BLE-t az asyncio-barát BLE-hez — például hirdessen perifériaként, és várjon, amíg egy központi csatlakozik:

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#

Amikor egy RJ45 (mágnesességgel) csatlakozik az MDI padokhoz, a 10/100 PHY LAN interfészként jelenik meg. A DHCP automatikusan fut, amint a kapcsolat felépül:

import network, time

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

microSD kártya#

Amikor egy kártyát behelyeznek, az automatikusan a /sdcard helyre csatolódik, és a szokásos fájlrendszeren keresztül használható:

import os

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

Busz referencia#

GPIO#

Használja a machine.Pin-t bármelyik feliratozott láb olvasásához vagy meghajtásához. A kimenetek 3,3 V CMOS-ok, és lábanként legfeljebb 4 mA-t tudnak nyelni/forrásolni.

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ármelyik bemeneti láb megszakítást is kiválthat él-átmenetekkor:

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

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

UART#

Busz

TX

RX

UART1

P4

P5

from machine import UART

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

I²C#

Busz

SCL

SDA

I2C1

P4

P5

from machine import I2C

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

Ugyanaz a hardver cél (slave) módban is használható a machine.I2CTarget-en keresztül, hogy egy memóriaterületet tegyen elérhetővé egy másik I²C vezérlő számára:

from machine import I2CTarget

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

SPI#

Busz

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#

Busz

TX

RX

CAN1

P1

P3

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#

Az egyetlen felhasználói ADC láb a P6, amely ~3,3 V-on teljes skálájú:

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#

Láb

FlexPWM csatorna

P0

PWM2 B3

P2

PWM2 B3

P4

PWM1 X2

P5

PWM1 X3

P7

PWM2 A0

P8

PWM2 B0

P9

PWM1 A3

P10

PWM1 B3

Hajtsa meg bármelyiket a machine.PWM-en keresztül:

from machine import Pin, PWM

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

Szoftveresen bit-bangelt buszok#

A machine.SoftI2C és a machine.SoftSPI bármelyik GPIO-n működik, ha extra buszra van szüksége.

Hőkamera érzékelő (kártyán kívüli)#

A firmware tartalmazza a fir — hőérzékelő-meghajtó (fir == far infrared, távoli infravörös) illesztőprogramot a külsőleg bekötött hőkamerákhoz:

  • MLX90621 — 16 × 4 IR tömb

  • MLX90640 — 32 × 24 IR tömb

  • MLX90641 — 16 × 12 IR tömb

  • AMG8833 — 8 × 8 IR tömb

Kösse a modult a kártya I²C buszára, és olvassa a képkockákat a fir.init() + fir.snapshot() segítségével:

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

A fir illesztőprogram csak az I²C 4-en keresztül kommunikál az érzékelővel — kösse a modult a P4 (SCL) és P5 (SDA) lábakra.

Időzítés#

time#

A time modul lefedi a blokkoló késleltetéseket, a monoton tickeket és az eltelt idő mérését:

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)

Virtuális időzítők#

A machine.Timer periodikus vagy egyszeri visszahívásokat ütemez anélkül, hogy egy hardveres időzítő helyét foglalná. Adjon át -1-et id-ként egy virtuális (szoftveres) időzítő használatához:

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

A periódusértékek milliszekundumban vannak megadva. Hívja meg a deinit()-et a leállításhoz és a hely felszabadításához.

Valós idejű óra#

A machine.RTC megtartja a valós időt az újraindításokon át, és (a hátsó padokra kötött opcionális 3,3 V-os tartalék akkumulátorral, lásd Táp lábak) a teljes áramkimaradáson át is:

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

Az RTC mélyalváson keresztül is fut, így ébresztési forrásként használhatja a machine.deepsleep()-hez.

Watchdog#

A machine.WDT újraindítja a kártyát, ha az alkalmazás lefagy. Egyszer elindítva nem állítható le és nem konfigurálható újra — táplálja periodikusan a fő ciklusán belül:

from machine import WDT

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

Indítási és futásidejű információk#

USB rendszerbetöltő ablak#

Minden bekapcsoláskor a kamera egy rövid rendszerbetöltőt futtat (néhány másodperc), amely lehetővé teszi az OpenMV IDE számára a firmware frissítését anélkül, hogy a felhasználónak DFU módba kellene lépnie. Az ablak lejárta után a rendszerbetöltő átadja a vezérlést a boot.py-nak, majd a main.py-nak.

Egy futó szkript igény szerint újra beléphet a rendszerbetöltőbe a machine.bootloader() hívásával:

import machine

machine.bootloader()

Fájlrendszer és indítási sorrend#

Az RT1062 firmware indításkor legfeljebb három fájlrendszert csatol:

  • Belső flash memória — mindig a /flash helyre csatolva. Alapértelmezetten a main.py-t és a README.txt-et tartalmazza; a legelső indításkor jön létre.

  • microSD kártya — ha egy kártyát behelyeznek, az a /sdcard helyre csatolódik.

  • ROMFS — csak olvasható, memóriába leképezett fájlrendszer a /rom helyen, amelyet nagy adat-eszközök (pl. AI modellek) szállítására használnak, amelyek profitálnak a másolásmentes hozzáférésből. A MicroPython automatikusan csatolja indításkor, mielőtt bármilyen felhasználói Python futna.

A csatolás után a munkakönyvtár a /sdcard-ra van állítva, amikor a kártya jelen van, egyébként a /flash-re. Az értelmező ezután abból a könyvtárból futtatja a szkripteket:

  • A boot.py minden szoft reset alkalmával végrehajtódik (hidegindítás, Ctrl‑D a REPL-ből, vagy amikor a futó szkript visszatér).

  • A main.py csak hidegindításkor hajtódik végre, közvetlenül a boot.py után. A későbbi szoft resetek újra lefuttatják a boot.py-t, de egyenesen a REPL-be esnek — a main.py újrafuttatásához teljesen újra kell indítani a kártyát.

Ha egy boot.py-t vagy main.py-t helyez az SD kártyára, az felülírja a flash memóriában lévő példányt anélkül, hogy hozzányúlna — mindkét fájlt az indítási könyvtárban keresi a rendszer (/sdcard, amikor a kártya csatolva van, egyébként /flash).

Egy frissen flashelt kártyán szállított alapértelmezett main.py egyszerűen villogtatja a felhasználói RGB LED kék csatornáját szívritmusként (két rövid impulzus, rövid szünet), így megállapíthatja, hogy a firmware tisztán elindult, anélkül, hogy bármilyen gazdagép csatlakozna.

A sys.path ki van bővítve mindhárom fájlrendszerrel és azok lib/ alkönyvtáraival, így az importálható modulok a /flash/lib, /sdcard/lib vagy /rom/lib helyen lehetnek.

Ahhoz, hogy a rendszert egy behelyezett SD kártya figyelmen kívül hagyására kényszerítse (például a flash main.py futtatásához akkor is, ha kártya van jelen), hozzon létre egy SKIPSD nevű üres fájlt a /flash gyökerében.

USB-n keresztül csatlakoztatva az indítási fájlrendszer (/sdcard, ha kártya van jelen, egyébként /flash) USB háttértár-meghajtóként is megjelenik a gazdagépen, lehetővé téve a boot.py, main.py és bármely más fájl közvetlen szerkesztését. Adja ki a meghajtót a kamera újraindítása előtt, hogy a gazdagép kiürítse a gyorsítótárazott írásait.

Megjegyzés

Mivel az operációs rendszer a meghajtót passzív blokkeszközként kezeli, az OpenMV Cam-en futó kód által létrehozott vagy módosított fájlok addig nem jelennek meg, amíg a gazdagép újra nem csatolja a meghajtót. Ha az operációs rendszer és az OpenMV Cam egyszerre írja ugyanazt a fájlrendszert, az operációs rendszer nyer, és felülírja a kamera által végzett változtatásokat. Használja az SD kártyát bármely olyan adathoz, amelyet a szkript visszaír, és csatolja újra, mielőtt ezeket a fájlokat a gazdagépről olvasná.

Megjegyzés

A felhasználói RGB LED piros csatornája rövid időre felvillanhat, miközben a gazdagép az USB háttértár-meghajtóról olvas vagy arra ír — ez egy firmware által vezérelt aktivitásjelző, nem hiba.

Tárolási méretek#

Az RT1062 a következőkkel szállít:

  • /flash4 MB FAT fájlrendszer, olvasás/írás.

  • /rom8 MB csak olvasható, memóriába leképezett ROMFS, amelyet olyan szkriptek és ML modellek szállítására használnak, amelyek profitálnak a másolásmentes mmap hozzáférésből.

  • /sdcard — a behelyezett microSD kártya teljes mérete (ha jelen van), olvasás/írás.

Hard-fault jelző#

Ha a felhasználói RGB LED gyorsan végigfut az összes színen — elég gyorsan ahhoz, hogy inkább csillogó fehér LED-nek tűnjön, mint különálló árnyalatoknak —, a firmware helyrehozhatatlan hard fault-ba ütközött. A helyreállításhoz flashelje újra a firmware-t; ha az újraflashelés nem segít, a kártya fizikailag sérült lehet.

Szoftverkönyvtárak#

A modulok teljes listájáért lásd a könyvtárindexet — beleértve azokat is, amelyek egyediek az RT1062 buildhez.