OpenMV N6¶
OpenMV N6, INT8’de 600 GOPS değerine sahip 1 GHz çip üstü NPU’lu STMicroelectronics STM32N657 (Cortex‑M55 @ 800 MHz) üzerine kuruludur. Kart, NPU’yu çıkarılabilir bir taşıyıcı üzerindeki PAG7936 1 MP global‑shutter sensör, gigabit Ethernet, USB‑C yüksek hız, Wi‑Fi ve Bluetooth 5.1 ile birleştirir ve canlı video akışıyla birlikte 30 FPS’de YOLOv8/YOLOv11 çıkarımı çalıştırır.
Tam veri sayfası, fotoğraflar ve boyutlar için OpenMV N6 ürün sayfasına bakın.
Öne çıkanlar¶
STM32N657 Cortex‑M55, 800 MHz’de (1280 DMIPS), ARM Helium 128‑bit SIMD ile — 6,4 gigaops vektör iş hacmi.
1 GHz NPU, 600 GOPS INT8 — YOLOv8/YOLOv11 tespitini 30 FPS’de çalıştırır.
5MP RAW Bayer’e kadar destekleyen ISP, ölçekleme ve 3D döndürme için 2D GPU, 1080p’ye H.264 kodlama ve donanımsal JPEG codec.
64 MB harici SDRAM (16‑bit @ 200 MHz DDR, 800 MB/s) artı 4,2 MB dahili SRAM ve 32 MB octal flash bellek (200 MHz DDR, 400 MB/s).
PAG7936 1 MP renkli global‑shutter sensör.
Ses + hareket füzyonu için kart üstü IMU (ivmeölçer + jiroskop) ve mikrofon.
Yüksek hızlı USB‑C (480 Mb/s, 1,5 A akım sınırı), gigabit Ethernet (shield ile PoE özellikli), Wi‑Fi a/b/g/n + Bluetooth 5.1 (çip anten veya U.FL seçeneği).
microSD yuvası — SD 2 GB’a kadar, SDHC 32 GB’a kadar, SDXC 2 TB’a kadar.
LiPo şarj cihazı (500 mA hızlı şarj), batarya gerilimi ADC, 8 KB yedek RAM’li RTC ve ayrılmış bir yedek batarya pini.
18 G/Ç pini, tümü 3,3 V çıkış / 3,3 V toleranslı, pin başına 20 mA, kesme yeteneğine sahip.
Kullanıcı RGB LED’i, kullanıcı düğmesi ve şarj / USB / VIN gücü için ayrı bir durum LED’i.
Uyarı
N6’nın G/Ç pinleri 5 V toleranslı değildir. Cihazı doğrudan Arduino Mega gibi bir 5 V MCU’ya bağlamayın. N6’yı yalnızca VIN üzerinden besleyin.
Pin Dağılımı¶
Pin referansı¶
Pin adı |
İşlev |
|---|---|
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 (bu pinde ADC yok — bkz. |
P6_ADC |
ayrılmış 12‑bit ADC girişi (dahili olarak P6’ya bağlı) |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM17 CH1 |
P10 |
TIM15 CH2 / çerçeve senkronizasyon G/Ç |
P11 |
uyandırma (aktif düşük, WKUP3) |
P12 |
RESET — kartı sıfırlamak için GND’ye çekin (bir GPIO değildir) |
P13 |
UART7 RX |
P14 |
UART7 TX |
P15 |
SPI4 CS |
P16 |
SPI4 SCK |
P17 |
SPI4 MISO |
P18 |
SPI4 MOSI |
SW |
kullanıcı düğmesi (aktif düşük) |
ONOFF (SW2) |
derin uyku uyandırma düğmesi (aktif düşük, WKUP2) |
ST |
VIN gücünde düşük, USB gücünde yüksek |
CHG |
aktif düşük; bağlı bir LiPo batarya şarj olurken düşük |
PG |
aktif düşük; VIN veya USB gücü mevcut olduğunda düşük |
BAT_ADC |
bağlı LiPo batarya gerilimini ölçen dahili ADC kanalı |
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 senkronizasyon hattı paylaşımlı bir veri yoludur. MCU’ya, kamera sensörünün tetik / pozlama pinine ve kullanıcı başlığına aynı anda bağlıdır. Yön uygulama tanımlıdır — sensörün nasıl yapılandırıldığına bağlı olarak onu MCU, sensör veya harici bir sinyal sürebilir (bazı sensörler aynı pini tetik girişi veya pozlama çıkışı olarak kullanabilir). Bir seferde yalnızca bir sürücünün aktif olduğundan emin olun.
Not
ONOFF ve P11, sürekli açık RAW hattına referanslıdır (anahtarlamalı 3,3 V hattı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 hattı üzerinde çalışabilmeleri için seviye kaydırıcılardan geçer. ONOFF veya P11’de kesinlikle 3,3 V doğrudan GPIO davranışına ihtiyacınız varsa (örneğin onları kaydırıcıdan geçmeden bir 3,3 V MCU’dan sürmek için), kart kaydırıcıyı atlamanıza olanak tanıyan çekme ve 0 ohm jumper pedleri sunar. Bu, ileri düzey bir donanım değişikliğidir — çoğu kullanıcının buna dokunmaması gerekir.
Not
P15–P18, Gigabit Ethernet PHY ile paylaşılır ve bu varsayılan olarak bağlı ve aktiftir. Bu pinleri kullanıcı G/Ç olarak kullanmak için kartın arkasındaki 0 ohm direnci GPIO konumuna lehimlemeniz gerekir. Bu yalnızca gigabit Ethernet’i devre dışı bırakır — 10/100 Mb/s Ethernet kendi ayrılmış pinlerinde çalışmaya devam eder.
Güç pinleri¶
3.3V — düzenlenmiş 3,3 V hattı. N6’da yalnızca çıkıştır — bu pine harici güç beslemeyin. Shield’lar için 1 A’e kadar mevcuttur.
VIN — 5 V giriş. Kartı ve kart üstü LiPo şarj cihazını besler.
RAW — giriş/çıkış, sürekli açık (3,6 V – 5 V). Hangi kaynak aktifse onu (VIN, USB veya bağlı batarya) taşır ve ayrıca 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 kaynağa veya kart üstü korumaya zarar verir.
GND — ortak toprak.
Not
Kart üstü güç yönetimi çipi, kartı ve batarya şarj cihazını beslemek için USB veya VIN’den hangisinin gerilimi daha yüksekse onu otomatik olarak seçer. Bir LiPo bağlıysa, kalan kapasitede şarj olur ve VIN/USB düşerse veya çıkarılırsa kontrolör kartı çalışır tutmak için bataryaya geçer.
Not
Kartın arkasında harici bir 3,3 V RTC yedek bataryası için lehim pedleri vardır. Bu pedlere bir düğme pil bağlamak, kartın geri kalanı güçsüzken RTC’yi ve 8 KB yedek RAM’i çalışır tutar.
Tüyo
Belirli bir aktif / derin uyku görev döngüsü için N6’nın bir batarya ile ne kadar süre çalışacağını modellemek üzere batarya ömrü tahmincisini kullanın.
Ethernet pinleri¶
N6, Ethernet PHY’nin MDI çiftlerini GPIO başlığının yanındaki ayrılmış pedlerde sunar. MDI pinleri doğrudan bir RJ45’e bağlanacak kadar güvenli değildir — PHY ile kablo arasında Ethernet manyetikleri (bir magjack içine yerleşik veya shield üzerinde olan bir izolasyon transformatörü) gereklidir. OpenMV PoE shield’ı bunları içerir; kendi jakınızı oluşturuyorsanız manyetik entegre bir RJ45 veya harici bir transformatör kullanın.
ETH_LED — bağlantı/etkinlik LED’i. Bir bağlantı kurulduğunda aktif düşük; trafik olduğunda yanıp söner.
DA P / DA N — çift A (10/100’de TX, tüm hızlarda kullanılır).
DB P / DB N — çift B (10/100’de RX, tüm hızlarda kullanılır).
DC P / DC N — çift C, yalnızca gigabit’te kullanılır.
DD P / DD N — çift D, yalnızca gigabit’te kullanılır.
10/100 Mb/s yalnızca A ve B çiftlerine ihtiyaç duyar. Gigabit, dört çiftin tümüne A–D ihtiyaç duyar.
Kurtarma ve hata ayıklama pinleri¶
RESET — kartı sıfırlamak için GND’ye çekin. Bırakmak MCU’nun normal şekilde başlamasını sağlar.
BOOT0 — ROM önyükleyici (bootloader) moduna girmek için kartı beslerken 3,3 V’a çekin. OpenMV IDE, kart üstü önyükleyiciyi yeniden flashlamak için bu modu kullanır.
BOOT1 — kartı ST’nin araç setiyle (ARM 10‑pin SWD/JTAG başlığına bağlı bir ST‑LINK) kullanmak üzere geliştirici moduna alan anahtar. OpenMV aygıt yazılımı (firmware) ve araçlarıyla normal çalışma için bunu devre dışı bırakın.
ST‑LINK ve SEGGER J‑Link adaptörleriyle uyumlu, ayrılmış bir ARM 10‑pin SWD/JTAG başlığı takılıdır.
Kart üstü çevre birimleri¶
LED’ler¶
N6’da 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 — doğrudan kart üstü güç yönetimi donanımı tarafından sürülür, yazılım kontrolü yoktur. Güç kaynağının 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ı
bağlı bir LiPo batarya şarj oluyor
Derin uykuda Kırmızı dışında tüm kanallar kapalıdır; Kırmızı, bir LiPo şarj olurken hâlâ yanar.
Güç durumu pinleri¶
Üç aktif düşük durum girişi, aygıt yazılımının kart üstü güç yönetimi çipinin ne yaptığını görmesini sağlar:
ST — kart VIN ile çalışırken düşük, USB gücü ile çalışırken yüksek.
CHG — bağlı bir LiPo batarya şarj olurken düşük.
PG — VIN veya USB gücü mevcut olduğunda düşük.
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()
Kamera sensörü¶
PAG7936, 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.HD) # 1280×800
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
Sensör çıkarılabilir bir modül üzerinde bulunur — 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.
PAG7936 tetiklemeli modu destekler — piksel entegrasyonu, serbest çalışan çerçeve saati yerine her csi.CSI.snapshot çağrısıyla tam olarak hizalanır; bu, yakalamayı harici bir olaya veya başka bir sensöre senkronize etmek için yararlıdır. Bunu csi.CSI.ioctl üzerinden csi.IOCTL_SET_TRIGGERED_MODE ile etkinleştirin. Okuma artık bir sonraki çerçevenin entegrasyonuyla ardışık çalışmadığından çerçeve hızı, serbest çalışan modun kabaca yarısına düşer:
cam.ioctl(csi.IOCTL_SET_TRIGGERED_MODE, True)
NPU¶
N6’nın 1 GHz Neural‑ART NPU’su (600 GOPS INT8) ml — Makine Öğrenmesi modülü üzerinden sunulur. Salt okunur /rom dosya sisteminde saklanan modeller, RAM’e kopyalanmadan doğrudan flash bellekten yüklenir, bu nedenle büyük tespit edicilerle bile canlı çerçeve arabelleğiyle (frame buffer) birlikte rahatça sığarlar. Her çerçevede bir YOLOv8 tespit edici çalıştırın ve tahminleri canlı görüntünün üzerine çizin:
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")
Mikrofon¶
Kart üstü mikrofon audio — Audio Modülü üzerinden yakalanır. Her arabellek işaretli‑16‑bit PCM bytearray olarak gelir, bu da onu hızlı DSP için ulab/numpy içine beslemeyi son derece kolaylaştırır. Basit bir ses yüksekliği tespit edicisi — RMS ses seviyesi bir eşiği aştığında yazdırın:
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¶
Kamera modülünün altındaki kart üstü ivmeölçer + jiroskop imu — imu sensörü üzerinden sunulur:
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¶
Kart üstü CYW43439, bir istasyon arabirimi olarak network — ağ yapılandırması üzerinden 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ı CYW43439 ayrıca Bluetooth 5.1 sunar. asyncio dostu BLE için aioble — Asenkron BLE kullanın — örneğin, bir çevre birimi olarak reklam 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-N6")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
Ethernet¶
MDI pedlerine bir RJ45 (manyetiklerle) bağlandığında, gigabit PHY bir LAN arabirimi olarak görünür. Bağlantı kurulduğunda 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 otomatik olarak /sdcard konumuna bağlanır ve normal dosya sistemi üzerinden kullanılabilir:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Veri yolu referansı¶
GPIO¶
Serigrafili pinlerden herhangi birini okumak veya sürmek için machine.Pin kullanın. Çıkışlar 3,3 V CMOS’tur ve pin başına 20 mA’e kadar batırabilir/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 ayrıca kenar geçişlerinde bir kesme tetikleyebilir:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Veri yolu |
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¶
Veri yolu |
SCL |
SDA |
|---|---|---|
I2C2 |
P4 |
P5 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Aynı donanım, başka bir I²C kontrolörü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(2, addr=0x42, mem=buf)
SPI¶
Veri yolu |
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¶
Veri yolu |
TX |
RX |
|---|---|---|
CAN1 |
P2 |
P3 |
Not
CAN, aygıt yazılımı v5.0.0’da 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¶
Her iki ADC kanalı, MCU’ya ulaşmadan önce bir op‑amp ile arabelleğe alınmış bir gerilim bölücüden geçer, bu nedenle read_u16() her pinde farklı bir tam ölçek giriş gerilimine eşlenir.
Pin |
Tam ölçek |
Notlar |
|---|---|---|
P6_ADC |
~3,3 V |
genel amaçlı ped, dahili olarak P6’ya bağlı |
BAT_ADC |
~5,0 V |
LiPo bataryası için dahili kanal |
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¶
Pin |
Zamanlayıcı / kanal |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM12 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
P9 |
TIM17 CH1 |
P10 |
TIM15 CH2 |
Bunlardan herhangi birini machine.PWM üzerinden sürün:
from machine import Pin, PWM
pwm = PWM(Pin("P6"), freq=1_000, duty_u16=32768)
Yazılım bit‑banged veri yolları¶
Ekstra bir veri yoluna 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 veri yoluna bağlayın ve çerçeveleri fir.init() + fir.snapshot() ile 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 2 ü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 (callback) zamanlar. Sanal (yazılım) 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 pedlere bağlı isteğe bağlı 3,3 V yedek bataryasıyla, 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 ayrıca derin uyku boyunca çalışır, bu nedenle onu machine.deepsleep() için bir uyandırma kaynağı olarak kullanabilirsiniz.
Bekçi (Watchdog)¶
machine.WDT, uygulama takılırsa kartı sıfırlar. Bir kez başlatıldığında 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üncellemesini sağlayan kısa bir önyükleyici (birkaç saniye) çalıştırır. Pencere sona erdikten sonra önyükleyici, kontrolü boot.py‘a ve ardından main.py‘a devreder.
Çalışan bir betik, machine.bootloader() çağırarak istek üzerine önyükleyiciye yeniden girebilir:
import machine
machine.bootloader()
Dosya sistemi ve önyükleme sırası¶
N6 aygıt yazılımı, önyüklemede en fazla üç dosya sistemi bağlar:
Dahili flash bellek — her zaman
/flashkonumuna bağlı. Varsayılan olarakmain.pyveREADME.txtiçerir; ilk açılışta oluşturulur.microSD kart — bir kart takılıysa
/sdcardkonumuna bağlanır.ROMFS — sıfır kopya erişimden yararlanan büyük veri varlıklarını (örneğin yapay zeka 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ım sıfırlamasında (soğuk önyükleme, REPL’denCtrl‑Dveya çalışan betik geri döndüğünde) çalıştırılır.main.py, yalnızca soğuk önyüklemede,boot.py‘dan hemen sonra çalıştırılır. Sonraki yazılım sıfırlamalarıboot.py‘ı yeniden çalıştırır ancak doğrudan REPL’e düşer —main.py‘ı yeniden çalıştırmak için kartı tamamen sıfırlamanız gerekir.
SD karta bir boot.py veya main.py bırakmak, flash bellekteki kopyaya dokunmadan onu geçersiz kılar — her iki dosya da önyükleme dizininde (kart bağlıyken /sdcard, aksi takdirde /flash) aranır.
Yeni flashlanmış bir kartta gönderilen varsayılan main.py, bir kalp atışı olarak yalnızca kullanıcı RGB LED’inin mavi kanalını yanıp söndürür (iki kısa darbe, kısa aralık), böylece herhangi bir ana bilgisayar bağlı olmadan aygıt yazılımının temiz bir şekilde ö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 mevcut olsa bile flash main.py‘ı çalıştırmak için), /flash kökünde SKIPSD adlı boş bir dosya oluşturun.
USB üzerinden bağlandığında, önyükleme dosya sistemi (kart mevcutsa /sdcard, aksi takdirde /flash) ana bilgisayarda bir USB yığın depolama sürücüsü olarak da numaralandırılır ve boot.py, main.py ve diğer dosyaları doğrudan düzenlemenize olanak tanır. Kamerayı sıfırlamadan önce sürücüyü çıkarın ki ana bilgisayar önbelleğe alınmış yazmalarını boşaltsın.
Not
İşletim sistemi sürücüyü pasif bir blok aygıtı 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ığı her veri için SD kartı kullanın ve bu dosyaları ana bilgisayardan okumadan önce yeniden bağlayın.
Not
Ana bilgisayar USB yığın depolama sürücüsünden okurken veya yazarken kullanıcı RGB LED’inin kırmızı kanalı kısa bir süre yanabilir — bu, aygıt yazılımı kaynaklı bir etkinlik göstergesidir, bir arıza değildir.
Depolama boyutları¶
N6 şunlarla gönderilir:
/flash— 4 MB FAT dosya sistemi, okuma/yazma./rom— 24 MB salt okunur belleğe eşlenmiş ROMFS, sıfır kopya mmap erişiminden yararlanan betikleri ve ML modellerini göndermek için kullanılır./sdcard— takılı microSD kartın tam boyutu (mevcut olduğunda), okuma/yazma.
Hard fault göstergesi¶
Kullanıcı RGB LED’i tüm renkler arasında hızla geçiş yapıyorsa — belirgin tonlardan çok bir parıldayan beyaz LED gibi görünecek kadar hızlı — aygıt yazılımı kurtarılamaz bir hard fault’a takılmıştır. Kurtarmak için aygıt yazılımını yeniden flashlayın; yeniden flashlama yardımcı olmazsa, kart fiziksel olarak hasar görmüş olabilir.
Yazılım kütüphaneleri¶
Modüllerin tam listesi için — N6 yapımına özgü olanlar dahil — kütüphane dizinine bakın.