OpenMV Cam RT1062¶
OpenMV Cam RT1062, NXP i.MX RT1062 (Cortex‑M7 @ 600 MHz) çevresinde tasarlanmış düşük güçlü bir makine görüşü kartıdır. Kart; USB‑C yüksek hızlı ağ bağlantısını, Wi‑Fi/Bluetooth’u ve 10/100 Ethernet’i, çıkarılabilir bir taşıyıcı üzerindeki OV5640 5MP sensörle bir araya getirir. Kamera, derin uyku modunda bir LiPo bataryadan yalnızca ~30 µA çeker, bu da onu batarya ile çalışan projeler için oldukça uygun kılar.
Tam veri sayfası, fotoğraflar ve boyutlar için OpenMV Cam RT1062 ürün sayfasına bakın.
Öne çıkanlar¶
600 MHz’de NXP i.MX RT1062 Cortex‑M7.
32 MB harici SDRAM (16‑bit @ 160 MHz, 320 MB/s) ile birlikte 1 MB dahili SRAM ve 16 MB QSPI flash bellek (133 MHz 4‑bit SDR, 66 MB/s okuma); R6+ üzerinde 4 KB EEPROM.
OV5640 5MP yuvarlanan obtüratör (rolling‑shutter) sensörü.
Yerleşik IMU (12‑bit 3 eksenli ivmeölçer, ±2/4/8 g).
Yüksek hızlı USB‑C (480 Mb/s, 1.5 A akım sınırı), 10/100 Mb/s Ethernet (shield aracılığıyla PoE uyumlu), Wi‑Fi a/b/g/n + Bluetooth 5.1 (yonga anten veya U.FL seçeneği).
microSD soketi — SD 2 GB’a kadar, SDHC 32 GB’a kadar, SDXC 2 TB’a kadar.
LiPo şarj cihazı (R6+ üzerinde 500 mA, R4/R5 üzerinde 100 mA), yedek batarya padleri olan RTC. Derin uyku modunda batarya üzerinden ~30 µA çeker.
14 G/Ç pini, tümü 3.3 V çıkış / 3.3 V toleranslı, pin başına 4 mA, kesme yeteneğine sahip.
Kullanıcı RGB LED’i, kullanıcı SW butonu, donanım güç butonu (derin uyku / uyandırma durum makinesi) ve şarj / USB / VIN gücü için ayrı bir durum LED’i.
Uyarı
RT1062’nin G/Ç pinleri 5 V toleranslı değildir. Cihazı doğrudan Arduino Mega gibi bir 5 V MCU’ya bağlamayın. Kartı yalnızca VIN üzerinden besleyin.
Pin Bağlantı Şeması¶
Pin referansı¶
Pin adı |
İşlev |
|---|---|
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 / çerçeve eşitleme (frame sync) G/Ç |
P11 |
uyandırma (aktif düşük, uyandırmak için GND’ye bağlayın) |
P12 |
RESET — kartı sıfırlamak için GND’ye çekin (bir GPIO değildir) |
P13 |
dijital G/Ç |
P14 |
dijital G/Ç |
ON/OFF |
donanım güç butonunu çoğaltan header padi (aktif düşük) |
SW |
kullanıcı butonu (aktif düşük) |
ST |
VIN gücünde düşük, USB gücünde yüksek |
CHG |
aktif düşük; takılı bir LiPo batarya şarj olurken düşük |
PG |
aktif düşük; VIN veya USB gücü mevcut olduğunda düşük |
LED_RED |
RGB LED kırmızı kanalı (aktif düşük) |
LED_GREEN |
RGB LED yeşil kanalı (aktif düşük) |
LED_BLUE |
RGB LED mavi kanalı (aktif düşük) |
Not
P10 çerçeve eşitleme (frame‑sync) hattı paylaşımlı bir bustur. Aynı anda MCU’ya, kamera sensörünün tetikleme / pozlama pinine ve kullanıcı header’ına bağlıdır. Yön uygulamaya bağlıdır — sensörün nasıl yapılandırıldığına göre MCU, sensör ya da harici bir sinyal bu hattı sürebilir. Bir seferde yalnızca bir sürücünün aktif olduğundan emin olun.
Not
ON/OFF ve P11, daima açık RAW rayına referanslıdır (anahtarlamalı 3.3 V rayına değil), bu nedenle kartın geri kalanı derin uyku / düşük güç modundayken bile işlevsel kalırlar. Her iki giriş de aktif düşüktür.
Bu pinler, RAW rayı üzerinde çalışabilmeleri için seviye dönüştürücülerden (level shifter) geçer. ON/OFF veya P11 üzerinde kesinlikle 3.3 V doğrudan GPIO davranışına ihtiyacınız varsa (örneğin onları dönüştürücüden geçmeden bir 3.3 V MCU’dan sürmek için), kart, dönüştürücüyü atlamanıza olanak tanıyan pull‑up ve 0‑ohm jumper padleri sunar. Bu, ileri düzey bir donanım değişikliğidir — çoğu kullanıcı buna dokunmamalıdır.
Not
P13 ve P14 varsayılan olarak özel işlevi olmayan düz GPIO’lardır. Padler, kartın arkasındaki 0‑ohm direnç lehim köprülerinin yeniden lehimlenmesiyle isteğe bağlı olarak başka sinyallere yönlendirilebilir:
P13 ↔ CHG durumu / JTAG TRSTB
P14 ↔ ST durumu / JTAG TDI
Çoğu kullanıcı bu jumperlara dokunmayacaktır — özellikle güç yönetimi geri okumasına veya JTAG’a ihtiyacınız olmadıkça onları GPIO varsayılanında bırakın.
Güç pinleri¶
3.3V — regüle edilmiş 3.3 V rayı. RT1062’de yalnızca çıkıştır — bu pine harici güç beslemeyin. Shield’ler için 1 A’e kadar mevcuttur.
VIN — 5 V giriş. Kartı ve yerleşik LiPo şarj cihazını besler.
RAW — giriş/çıkış, daima açık (3.6 V – 5 V). Hangi kaynak aktifse (VIN, USB veya takılı batarya) onu taşır ve bir giriş olarak da kullanılabilir. Buna güç beslerken RAW’ı bir seri diyot üzerinden sürmelisiniz — aksi takdirde akım VIN/USB’ye geri akar ve besleme kaynağına veya yerleşik korumaya zarar verir.
GND — ortak toprak.
Not
Yerleşik güç yönetimi yongası, kartı ve batarya şarj cihazını beslemek için USB veya VIN’den hangisinin voltajı daha yüksekse otomatik olarak onu seçer. Bir LiPo takılıysa, kalan boşlukta şarj olur ve VIN/USB düşerse veya çıkarılırsa, kontrolcü kartı çalışır halde tutmak için bataryaya geri döner.
Not
Kartın arkasında harici bir 3.3 V RTC yedek bataryası için lehim padleri bulunur. Bu padlere bir düğme pil bağlamak, kartın geri kalanı güçsüzken RTC’yi çalışır durumda tutar.
Tüyo
RT1062’nin belirli bir aktif / derin uyku görev döngüsünde bir bataryayla ne kadar süre çalışacağını modellemek için batarya ömrü tahminleyicisini kullanın.
Ethernet pinleri¶
RT1062, 10/100 Mb/s Ethernet PHY’nin MDI çiftlerini GPIO header’ının yanındaki özel padlerde sunar. MDI pinlerini doğrudan bir RJ45’e bağlamak güvenli değildir — PHY ile kablo arasında Ethernet manyetikleri (bir magjack içine yerleştirilmiş ya da shield üzerinde bulunan bir izolasyon transformatörü) gereklidir. OpenMV PoE shield’i bunları içerir; kendi jakınızı yapıyorsanız, manyetik entegre bir RJ45 veya harici bir transformatör kullanın.
ETH_LED — bağlantı/etkinlik LED’i. Bağlantı kurulduğunda aktif düşüktür; trafik olduğunda yanıp söner.
ETH_TXP / ETH_TXN — iletim çifti.
ETH_RXP / ETH_RXN — alım çifti.
Not
Header ayrıca üzerinde Reserved yazan dört pad sunar. Bunlar, OpenMV N6 üzerindeki gigabit Ethernet çiftleriyle (DC P/N ve DD P/N) ayak izi uyumludur, böylece aynı Ethernet / PoE shield’i her iki karta da takılabilir. RT1062’nin PHY’si yalnızca 10/100 Mb/s yapar, dolayısıyla bu dört padin elektriksel bağlantısı yoktur — onları bağlamadan bırakın.
Kurtarma ve hata ayıklama pinleri¶
RESET — kartı sıfırlamak için GND’ye çekin. Bırakıldığında MCU normal şekilde başlar.
SBL — ROM önyükleyici (Serial Boot Loader) moduna girmek için kartı beslerken 3.3 V’a çekin. OpenMV IDE, yerleşik önyükleyiciyi yeniden flaşlamak için bu modu kullanır.
ST‑LINK ve SEGGER J‑Link adaptörleriyle uyumlu özel bir ARM 10 pinli SWD/JTAG header’ı takılıdır.
Not
RT1062, bu konnektör üzerinden varsayılan olarak yalnızca SWD hata ayıklamayı sunar. Tam JTAG kutudan çıktığı gibi mevcut değildir.
Yerleşik çevre birimleri¶
LED’ler¶
RT1062’de iki RGB LED bulunur:
Kullanıcı RGB LED’i — yazılımla kontrol edilebilir,
LED_RED,LED_GREENveLED_BLUEolarak sunulur:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Güç LED’i — yerleşik güç yönetimi donanımı tarafından doğrudan sürülür, yazılım kontrolü yoktur. Beslemenin ne yaptığını bir bakışta okumak için kullanın.
Çalışırken:
Kanal
Anlamı
Mavi
VIN kartı besliyor (USB’de kapalı)
Yeşil
USB veya VIN gücü mevcut
Kırmızı
takılı bir LiPo bataryayı şarj ediyor
Derin uyku modunda Kırmızı hariç tüm kanallar kapalıdır; Kırmızı, bir LiPo şarj olurken hâlâ yanar.
Güç durumu pinleri¶
Yerleşik güç yönetimi yongasından üç aktif düşük durum girişi:
PG — VIN veya USB gücü mevcut olduğunda düşük. Daima bağlıdır.
ST — kart VIN üzerinde çalışırken düşük, USB gücü üzerinde çalışırken yüksek. Varsayılan olarak bağlı değildir.
CHG — takılı bir LiPo batarya şarj olurken düşük. Varsayılan olarak bağlı değildir.
from machine import Pin
power_ok = not Pin("PG", Pin.IN).value()
Kamera sensörü¶
OV5640, csi — kamera sensörleri modülü üzerinden sürülür:
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’ın yerleşik bir JPEG sıkıştırıcısı vardır. csi.CSI.pixformat değerini csi.JPEG olarak ayarlayın; sensör, sıkıştırılmış çerçeveleri kamera busu üzerinden doğrudan kameraya iletir, bu da yüksek çözünürlüklü yakalamaları pratik hale getirir: csi.HD (1280×720), csi.FHD (1920×1080) ve tam 5MP csi.WQXGA2 (2592×1944) hepsi JPEG olarak akış yapar. Sıkıştırmayı csi.CSI.quality ile ayarlayın (0-100, daha yüksek = daha büyük çerçeveler, daha fazla ayrıntı):
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
Sensör çıkarılabilir bir modül üzerinde durur — kartın geri kalanını değiştirmeden onu diğer OpenMV kamera modüllerinden herhangi biriyle (global shutter, termal, daha yüksek çözünürlük vb.) değiştirin.
Makine öğrenmesi¶
ml — Makine Öğrenmesi, CMSIS‑NN çekirdekleriyle Cortex‑M7 üzerinde nicemlenmiş TFLite modellerini çalıştırır — saniyede birkaç çerçevede kompakt tespit ediciler için yeterince hızlıdır. Salt okunur /rom dosya sistemindeki modeller, RAM’e kopyalanmadan doğrudan flash bellekten yüklenir. İşte tespit edilen yüzü ve onun altı işaret noktasını her çerçeveye bindiren 128×128 bir BlazeFace tespit edici:
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 aygıt yazılımı, yerleşik ivmeölçeri imu — imu sensörü modülüne bağlamaz. Bunun yerine onunla dahili I²C busu üzerinden doğrudan konuşun — yonga 0x15 adresinde bulunur ve 0x03 yazmacından başlayarak işaretli üç adet 12‑bit ivme kanalı ile bir 8‑bit sıcaklık baytı paketler:
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 ve sonrası kartlar, ivmeölçerle aynı dahili bus üzerinde genel amaçlı bir 4 KB I²C EEPROM içerir. (Daha eski revizyonlarda bu yoktur — bu kod parçacıklarını R4/R5 üzerinde çağırmak, eksik bir I²C ack nedeniyle zaman aşımına uğrar.) 16‑bit bellek adresiyle standart machine.I2C readfrom_mem / writeto_mem API’sini kullanın:
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))
Hem okumalar hem yazmalar 32 baytlık bir sayfa içinde kalmalıdır. Daha büyük transferleri sayfa başına bir çağrıya bölün ve ardışık yazmalar arasına ~5 ms’lik yazma döngüsü gecikmesini ekleyin.
Wi‑Fi¶
Yerleşik CYW43 ailesi modülü, network — ağ yapılandırması üzerinden bir istasyon arabirimi olarak sunulur. Bağlandıktan sonra ipconfig("addr4") (ip, netmask) çiftini döndürür:
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¶
Aynı kablosuz modül ayrıca Bluetooth 5.1 sunar. asyncio dostu BLE için aioble — Asenkron BLE kullanın — örneğin bir çevre birimi olarak yayın yapın ve bir merkezin bağlanmasını bekleyin:
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¶
MDI padlerine bir RJ45 (manyetikleriyle birlikte) bağlandığında, 10/100 PHY bir LAN arabirimi olarak görünür. Bağlantı kurulur kurulmaz DHCP otomatik olarak çalışır:
import network, time
lan = network.LAN()
lan.active(True)
while not lan.isconnected():
time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])
microSD kart¶
Bir kart takıldığında /sdcard konumuna otomatik olarak bağlanır ve normal dosya sistemi üzerinden kullanılabilir:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Bus referansı¶
GPIO¶
Silkscreen ile işaretlenmiş pinlerden herhangi birini okumak veya sürmek için machine.Pin kullanın. Çıkışlar 3.3 V CMOS’tur ve pin başına 4 mA’e kadar akım çekebilir/sağlayabilir.
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())
Herhangi bir giriş pini, kenar geçişlerinde bir kesme de tetikleyebilir:
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")
Aynı donanım, başka bir I²C kontrolcüsüne bir bellek bölgesi sunmak için machine.I2CTarget üzerinden hedef (slave) modunda da kullanılabilir:
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 |
Not
CAN, v5.0.0 aygıt yazılımında bu kartta henüz desteklenmemektedir.
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¶
Tek kullanıcı ADC pini, ~3.3 V’ta tam ölçekli olan P6‘dır:
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¶
Pin |
FlexPWM kanalı |
|---|---|
P0 |
PWM2 B3 |
P2 |
PWM2 B3 |
P4 |
PWM1 X2 |
P5 |
PWM1 X3 |
P7 |
PWM2 A0 |
P8 |
PWM2 B0 |
P9 |
PWM1 A3 |
P10 |
PWM1 B3 |
Bunlardan herhangi birini machine.PWM üzerinden sürün:
from machine import Pin, PWM
pwm = PWM(Pin("P9"), freq=1_000, duty_u16=32768)
Yazılımla bit‑banged edilen buslar¶
Ekstra bir busa ihtiyacınız varsa machine.SoftI2C ve machine.SoftSPI herhangi bir GPIO üzerinde çalışır.
Termal sensör (kart dışı)¶
Aygıt yazılımı, harici olarak bağlanan termal görüntüleyiciler için fir — termal sensör sürücüsü (fir == far infrared) sürücüsünü içerir:
MLX90621 — 16 × 4 IR dizisi
MLX90640 — 32 × 24 IR dizisi
MLX90641 — 16 × 12 IR dizisi
AMG8833 — 8 × 8 IR dizisi
Modülü kartın I²C busuna bağlayın ve fir.init() + fir.snapshot() ile çerçeveleri okuyun:
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 sürücüsü sensörle yalnızca I²C 4 üzerinden konuşur — modülü P4 (SCL) ve P5 (SDA) pinlerine bağlayın.
Zamanlama¶
time¶
time modülü; bloklayan gecikmeleri, monoton tikleri ve geçen süre ölçümünü kapsar:
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)
Sanal zamanlayıcılar¶
machine.Timer, bir donanım zamanlayıcı yuvası tüketmeden periyodik veya tek seferlik geri çağırmalar zamanlar. Sanal (yazılım) bir zamanlayıcı kullanmak için id olarak -1 geçirin:
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"))
Periyot değerleri milisaniye cinsindendir. Durdurmak ve yuvayı serbest bırakmak için deinit() çağırın.
Gerçek zamanlı saat¶
machine.RTC, sıfırlamalar boyunca ve (arka padlere bağlı isteğe bağlı 3.3 V yedek bataryayla birlikte, bkz. Güç pinleri) tam güç kaybı boyunca duvar saati zamanını korur:
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, derin uyku boyunca da çalışır, böylece onu machine.deepsleep() için bir uyandırma kaynağı olarak kullanabilirsiniz.
Watchdog¶
machine.WDT, uygulama takılırsa kartı sıfırlar. Bir kez başlatıldıktan sonra durdurulamaz veya yeniden yapılandırılamaz — ana döngünüzün içinde onu periyodik olarak besleyin:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Önyükleme ve çalışma zamanı bilgisi¶
USB önyükleyici penceresi¶
Her açılışta kamera, OpenMV IDE’nin kullanıcının DFU moduna girmesine gerek kalmadan aygıt yazılımını güncellemesine olanak tanıyan kısa bir önyükleyici (birkaç saniye) çalıştırır. Pencere sona erdikten sonra önyükleyici, denetimi boot.py ve ardından main.py‘ye devreder.
Çalışan bir betik, machine.bootloader() çağırarak isteğe bağlı olarak önyükleyiciye yeniden girebilir:
import machine
machine.bootloader()
Dosya sistemi ve önyükleme sırası¶
RT1062 aygıt yazılımı, önyüklemede en fazla üç dosya sistemini bağlar:
Dahili flash bellek — daima
/flashkonumuna bağlıdır. Varsayılan olarakmain.pyveREADME.txtdosyalarını barındırır; ilk önyüklemede oluşturulur.microSD kart — bir kart takılıysa
/sdcardkonumuna bağlanır.ROMFS — sıfır kopyalı erişimden yararlanan büyük veri varlıklarını (örn. AI modelleri) göndermek için kullanılan,
/romkonumundaki salt okunur, belleğe eşlenmiş dosya sistemi. Herhangi bir kullanıcı Python kodu çalışmadan önce, başlangıçta MicroPython tarafından otomatik olarak bağlanır.
Bağlandıktan sonra, kart mevcut olduğunda çalışma dizini /sdcard, aksi takdirde /flash olarak ayarlanır. Yorumlayıcı daha sonra betikleri o dizinden çalıştırır:
boot.py, her yazılımsal sıfırlamada çalıştırılır (soğuk önyükleme, REPL’denCtrl‑Dveya çalışan betik döndüğünde).main.py,boot.py‘den hemen sonra yalnızca soğuk önyüklemede çalıştırılır. Sonraki yazılımsal sıfırlamalarboot.py‘yi yeniden çalıştırır ancak doğrudan REPL’e düşer —main.py‘yi yeniden çalıştırmak için kartı tamamen sıfırlamanız gerekir.
SD karta bir boot.py veya main.py bırakmak, flaştaki kopyaya dokunmadan onu geçersiz kılar — her iki dosya da önyükleme dizininde aranır (kart bağlıyken /sdcard, aksi takdirde /flash).
Yeni flaşlanmış bir kartta gelen varsayılan main.py, kalp atışı olarak yalnızca kullanıcı RGB LED’inin mavi kanalını yakıp söndürür (iki kısa darbe, kısa boşluk), böylece herhangi bir ana bilgisayar bağlı olmadan aygıt yazılımının düzgün önyüklendiğini anlayabilirsiniz.
sys.path, üç dosya sisteminin tümünü ve onların lib/ alt dizinlerini içerecek şekilde genişletilir, böylece içe aktarılabilir modüller /flash/lib, /sdcard/lib veya /rom/lib içinde bulunabilir.
Sistemi takılı bir SD kartı yok saymaya zorlamak için (örneğin bir kart takılıyken bile flaştaki main.py‘yi çalıştırmak için), /flash kök dizininde SKIPSD adında boş bir dosya oluşturun.
USB üzerinden bağlandığında, önyükleme dosya sistemi (kart mevcutsa /sdcard, aksi takdirde /flash) ayrıca ana bilgisayarda bir USB yığın depolama sürücüsü olarak listelenir; bu da boot.py, main.py ve diğer dosyaları doğrudan düzenlemenize olanak tanır. Ana bilgisayarın önbelleğe alınmış yazmaları boşaltması için kamerayı sıfırlamadan önce sürücüyü çıkarın.
Not
İşletim sistemi sürücüyü pasif bir blok cihazı olarak ele aldığından, OpenMV Cam üzerinde çalışan kod tarafından oluşturulan veya değiştirilen dosyalar, ana bilgisayar sürücüyü yeniden bağlayana kadar görünmez. Hem işletim sistemi hem de OpenMV Cam aynı dosya sistemine aynı anda yazarsa, işletim sistemi kazanır ve kamera tarafından yapılan değişikliklerin üzerine yazar. Betiğin geri yazdığı veriler için SD kartı kullanın ve bu dosyaları ana bilgisayardan okumadan önce yeniden bağlayın.
Not
Kullanıcı RGB LED’inin kırmızı kanalı, ana bilgisayar USB yığın depolama sürücüsünden okurken veya ona yazarken kısa süreliğine yanabilir — bu, bir arıza değil, aygıt yazılımı tarafından sürülen bir etkinlik göstergesidir.
Depolama boyutları¶
RT1062 şunlarla birlikte gelir:
/flash— 4 MB FAT dosya sistemi, okuma/yazma./rom— 8 MB salt okunur belleğe eşlenmiş ROMFS, sıfır kopyalı mmap erişiminden yararlanan betikleri ve ML modellerini göndermek için kullanılır./sdcard— takılı olan (mevcutsa) microSD kartın tam boyutu, okuma/yazma.
Donanımsal hata (hard‑fault) göstergesi¶
Kullanıcı RGB LED’i tüm renkler arasında hızla geçiş yapıyorsa — belirgin tonlar yerine parıldayan beyaz bir LED gibi görünecek kadar hızlı — aygıt yazılımı kurtarılamaz bir donanımsal hataya (hard fault) çarpmıştır. Kurtarmak için aygıt yazılımını yeniden flaşlayın; yeniden flaşlama yardımcı olmazsa, kart fiziksel olarak hasar görmüş olabilir.
Yazılım kütüphaneleri¶
Modüllerin tam listesi için — RT1062 derlemesine özgü olanlar dahil — kütüphane dizinine bakın.