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.

OpenMV N6

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ı

OpenMV N6 PAG7936 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)

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_GREEN ve LED_BLUE olarak 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.

Kullanıcı düğmeleri

N6’da iki düğme bulunur:

  • SW — genel amaçlı kullanıcı düğmesi. Düşüğe çekildiğinde aktiftir.

  • ONOFF (SW2) — uyandırma düğmesi. Kartı derin uykudan çıkarabilen tek düğme.

from machine import Pin

sw    = Pin("SW",    Pin.IN)   # user button
onoff = Pin("ONOFF", Pin.IN)   # SW2 — wakes from deep sleep
print(sw.value(), onoff.value())

Kartı derin uykuya almak ve ONOFF (SW2) ile tekrar uyandırmak için yalnızca machine.deepsleep() çağırın — herhangi bir uyandırma yapılandırması gerekmez, düğme doğrudan WKUP2 girişine bağlıdır:

import machine

machine.deepsleep()   # press ONOFF (SW2) to wake the board

ONOFF’u ayrıca yumuşak bir güç anahtarı olarak da bağlayabilirsiniz. Yükselen kenarda tetikleyin — kullanıcı düğmeyi bıraktıktan sonra hat yükseğe oturur, bu nedenle bir sonraki basış kesin olarak bir uyandırma olayıdır:

import machine
from machine import Pin

def power_off(_):
    machine.deepsleep()

Pin("ONOFF", Pin.IN).irq(power_off, Pin.IRQ_RISING)

# ...rest of the application runs here. Press ONOFF once to sleep,
# press it again to wake.

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 /flash konumuna bağlı. Varsayılan olarak main.py ve README.txt içerir; ilk açılışta oluşturulur.

  • microSD kart — bir kart takılıysa /sdcard konumuna 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 /rom konumundaki 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’den Ctrl‑D veya ç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:

  • /flash4 MB FAT dosya sistemi, okuma/yazma.

  • /rom24 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.