Arduino Nicla Vision

Arduino Nicla Vision, STMicroelectronics STM32H747AII6 etrafında kurulmuş 22.86 × 22.86 mm boyutunda bir makine görüşü kartıdır — bu, 400 MHz’lik bir Cortex‑M7 ile 200 MHz’lik bir Cortex‑M4’ü birleştiren çift çekirdekli bir SoC’dir. OpenMV aygıt yazılımı (firmware) tamamen M7 çekirdeği üzerinde çalışır. Kart, MCU’yu GC2145 2 MP renkli CMOS sensörü, LSM6DSOX 6 eksenli IMU, MP34DT06 MEMS mikrofon, VL53L1CB time‑of‑flight mesafe ölçer, Wi‑Fi + Bluetooth LE 5.1 ve bir pil şarj cihazı / yakıt ölçer ile birlikte sunar.

Arduino Nicla Vision

Tam veri sayfası, fotoğraflar ve boyutlar için Arduino Nicla Vision ürün sayfasına bakın.

Öne çıkanlar

  • STMicroelectronics STM32H747AII6 çift Cortex‑M7 (400 MHz) + Cortex‑M4 (200 MHz). OpenMV aygıt yazılımı yalnızca M7 çekirdeğinde çalışır.

  • 2 MB dahili flash bellek ile birlikte 16 MB harici QSPI flash bellek (uygulama + ROMFS için kullanılır).

  • 1 MB dahili SRAM.

  • Donanımsal JPEG kodlayıcı/kod çözücü.

  • GC2145 2 MP renkli CMOS sensör.

  • Kart üzerinde IMU (LSM6DSOX ivmeölçer + jiroskop), MEMS mikrofon (MP34DT06JTR) ve VL53L1CB time‑of‑flight mesafe ölçer (~4 m’ye kadar).

  • Wi‑Fi b/g/n (2.4 GHz) + Bluetooth LE 5.1, Murata 1DX (CYW4343W) modülü aracılığıyla — birlikte verilen antene kart üzerindeki bir U.FL konektörü ile bağlanır.

  • Harici bir ULPI PHY (USB3320C) üzerinden Micro USB ile Yüksek hızlı USB (480 Mb/s).

  • Arduino kenar başlıklarında 13 kullanıcı G/Ç pini — dört dijital LPIO (D0D3), üç adet 1.8 V analog giriş (A0A2), SCL/SDA I²C çifti ve SCLK/CIPO/COPI/CS SPI dörtlüsü.

  • Pil desteği — arkada Li‑Po konektörü, BQ tarzı şarj cihazı ve dahili PMIC veri yolu üzerinden MAX17262 yakıt ölçer.

  • Lehimsiz I²C genişletmesi için arkada 5 pinli ESLOV konektörü.

Uyarı

Kullanıcı dijital pinleri varsayılan olarak 3.3 V’tur ancak 1.8 V‘a yeniden yapılandırılabilen yazılımla programlanabilir seviye dönüştürücüler (VDDIO_EXT) üzerinden yönlendirilir. Analog pinler (A0–A2) yalnızca 1.8 V’tur — seviye dönüştürücüleri atlayıp doğrudan MCU’ya bağlanırlar. A0–A2’ye 3.3 V sürmek SoC’ye zarar verir.

Pin Yerleşimi

Arduino Nicla Vision Pin Yerleşimi

Pin referansı

On üç kullanıcı pini Arduino kenar başlıklarında (J1 ve J2) açığa çıkarılmıştır. Ek hata ayıklama, kurtarma ve PMIC sinyalleri kartın arkasındaki test pedlerine yönlendirilmiştir.

Pin adı

Referans

İşlev

D0

3.3 V

GPIO / LPIO0 (J1‑1)

D1

3.3 V

LPUART1 TX / TIM1 CH2 / LPIO1 (J2‑3)

D2

3.3 V

LPUART1 RX / TIM1 CH3 / LPIO2 (J2‑4)

D3

3.3 V

GPIO / LPIO3 (J2‑5)

A0

1.8 V

ADC1 kanal 4 (J1‑8)

A1

1.8 V

ADC2 kanal 2 (J1‑7)

A2

1.8 V

ADC3 kanal 5 (J1‑2)

SCL

3.3 V

I2C1 SCL / UART4 RX / TIM4 CH3 (J2‑2)

SDA

3.3 V

I2C1 SDA / UART4 TX / TIM4 CH4 (J2‑1)

SCLK

3.3 V

SPI4 SCK / TIM1 CH3N (J1‑6)

CIPO

3.3 V

SPI4 MISO / TIM1 CH3 (J1‑5)

COPI

3.3 V

SPI4 MOSI / TIM1 CH4 (J1‑4)

CS

3.3 V

SPI4 NSS / TIM1 CH2 (J1‑3)

RESET

3.3 V

kartı sıfırlamak için GND’ye çekin (veya kart üzerindeki anahtara basın)

LED_RED

3.3 V

RGB LED kırmızı kanalı (etkin düşük)

LED_GREEN

3.3 V

RGB LED yeşil kanalı (etkin düşük)

LED_BLUE

3.3 V

RGB LED mavi kanalı (etkin düşük)

Not

D0D3 ve SCLK/CIPO/COPI/CS pinleri TXB0108 çift yönlü seviye dönüştürücünün arkasında yer alır — bu parça yalnızca push‑pull GPIO sürüşünü destekler, bu nedenle open‑drain veri yolu trafiği (örneğin bu pinlerde bit‑bang ile yapılan 1‑Wire veya I²C) çalışmaz.

SCL/SDA pinleri hem push‑pull hem de open‑drain sürüşünü destekleyen ayrı bir NTS0304 dönüştürücünün arkasında yer alır; I²C 1’in orada çalışmasının nedeni budur.

Her iki dönüştürücü de VDDIO_EXT‘e referanslıdır (kart üzerindeki PMIC’ten varsayılan olarak 3.3 V) ve sürüş güçleri doğrudan bir GPIO’ya kıyasla sınırlıdır — bunlar güç yükleri için değil, sinyal seviyesi için tasarlanmıştır.

Güç pinleri

Kenar başlığı pinleri:

  • VIN (J2‑9) — ana 3.6 – 5 V sistem hattı. PMIC girişini buradan alır.

  • VDDIO_EXT (J2‑7) — seviye dönüştürücü hattının çıkışı, 1.8 V veya 3.3 V (varsayılan olarak 3.3 V). LPIO/SPI/I²C pinlerine bağlı harici 1.8 V veya 3.3 V çevre birimlerini bununla besleyin, böylece başlıklarla aynı mantık seviyesinde konuşurlar.

  • VBAT (J3‑2) — Li‑Po pil girişi. Kart üzerindeki PMIC, hücreyi VIN’den şarj eder ve yakıt ölçer aracılığıyla şarj durumunu bildirir.

  • NTC (J3‑1) — isteğe bağlı Li‑Po termistör girişi.

  • GND (J2‑6) — ortak toprak.

  • NC (J2‑8) — bağlantı yok.

Kartın arkasındaki test pedleri:

  • +3V3 — ana 3.3 V hattı.

  • D_P / D_N — USB yüksek hızlı veri çifti (PHY sonrası).

USB ve ESLOV konektörünün her ikisi de VIN‘i bir çift LM66100 ideal diyot (kaynak başına bir tane) üzerinden besler, böylece her iki kaynak da kartı tek başına besleyebilir ve ikisi asla birbirini geri sürmez. VIN‘i J2‑9’da harici olarak sürerseniz, bu öncelikli olur — harici hat yükseldiğinde diyotlar USB / ESLOV’dan iletim yapmayı bırakır.

Bu nedenle kart aşağıdaki yollardan herhangi biriyle beslenebilir:

  • Micro USB — USB tarafındaki ideal diyot aracılığıyla VIN’e 5 V.

  • ESLOV konektörü — J5’in VESLOV pininde 5 V’a kadar, ESLOV tarafındaki ideal diyot aracılığıyla VIN’e yönlendirilir (bkz. ESLOV konektörü).

  • VIN pini (J2‑9) — düzenlenmiş bir 3.6 – 5 V kaynağını doğrudan sürün.

  • Li‑Po pili — arkadaki J4 pil konektörüne veya J3 / J2‑6 üzerindeki VBAT/GND/NTC pedlerine bağlayın. Aynı anda iki pil bağlamayın.

ESLOV konektörü

Kartın arkasındaki J5, 5 pinli lehimsiz bir Molex ESLOV konektörüdür:

Pin

Ad

İşlev

J5‑1

VESLOV

güç girişi (≤ 5 V) — bir LM66100 ideal diyot aracılığıyla VIN ile VEYA’lanır

J5‑2

INT

PD9 üzerinde harici kesme girişi

J5‑3

SCL_EXT

J2 SCL pedi ile paylaşılır — kullanıcı başlığıyla aynı I²C 1 veri yolu

J5‑4

SDA_EXT

J2 SDA pedi ile paylaşılır — kullanıcı başlığıyla aynı I²C 1 veri yolu

J5‑5

GND

ortak toprak

ESLOV’un SCL_EXT/SDA_EXT pinleri ile J2’nin SCL/SDA pinleri aynı pinlerdir — iki konektörde açığa çıkarılan tek bir I²C 1 veri yolu.

Tüyo

Nicla Vision’ın belirli bir etkin / derin uyku çalışma döngüsünde bir pille ne kadar süre çalışacağını modellemek için pil ömrü tahmin edicisini kullanın.

Kurtarma ve hata ayıklama pinleri

  • RESET — hem kartın üstünde anlık bir anahtar hem de SoC’nin NRST hattına bağlı bir ped (J3‑4 / test pedi P5). Sıfırlamak için GND’ye çekin.

Nicla Vision, Arduino’nun önyükleyicisine (bootloader) girmek için Arduino’nun standart çift dokunmalı sıfırlama yöntemini kullanır — sıfırlama düğmesine hızlıca iki kez basın; kart bir DFU aygıtı olarak sayımlanır. OpenMV IDE, aygıt yazılımını yeniden yazmak için bu modu kullanır.

STM32 SWD sinyalleri, iki J2 başlığı arasındaki bir test pedi sırası aracılığıyla kartın arkasında açığa çıkarılır. Bir ST‑LINK veya J‑Link adaptörü takmak için bunlara 2.54 mm (100‑mil) bir başlık lehimleyin:

  • P1 / P2 — PF0 (SDA) ve PF1 (SCL) üzerinde dahili PMIC I²C veri yolu. Bu, Nicla Vision’da machine.I2C(2) olup PMIC, yakıt ölçer ve ToF trafiğini taşır.

  • P3 — TMS / SWDIO (PA13)

  • P4 — TCK / SWCLK (PA14)

  • P5 — NRST

  • P6 — TDO / SWO (PB3)

  • P7 — +1V8 hattı (SoC’nin G/Ç beslemesi — ayrıca hata ayıklama adaptörü için doğru referans).

  • P8VOTP_PMICyalnızca fabrika programlaması. Bağlantısız bırakılmalıdır.

Tüm hata ayıklama sinyalleri 1.8 V referanslıdır — bu karttaki STM32H747’nin G/Ç halkası +1V8 hattından çalışır. Bağlamadan önce hata ayıklama adaptörünüzü 1.8 V mantık için ayarlayın.

Kart üzerindeki çevre birimleri

LED’ler

Nicla Vision, machine.LED aracılığıyla yazılımla kontrol edilebilen tek bir kullanıcı RGB LED’ine sahiptir:

from machine import LED

LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()

Kartın yan tarafındaki ayrı bir DL2 CHARGE LED’i doğrudan PMIC’in CHGB çıkışına bağlıdır — bir Li‑Po pil USB / ESLOV / VIN’den şarj edilirken yanar ve kullanıcı tarafından kontrol edilemez.

Kamera sensörü

GC2145, csi — kamera sensörleri modülü aracılığıyla 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()

Küçük bir çerçeve boyutu istediğinizde GC2145 sürücüsü sensörden orantılı olarak küçük bir okuma penceresi kırpar — varsayılan olarak okuma-çıkış küçültme oranı, çerçeve hızını yüksek tutmak için 3x ile sınırlandırılmıştır. csi.IOCTL_SET_FOV_WIDE bu sınırı 5x’e yükseltir, bu da sürücünün küçük çözünürlükler akışında sensörün daha geniş bir alanından çekim yaptığı anlamına gelir. Sonuç, küçük çerçeve boyutlarında bir miktar iş hacmi (throughput) kaybı pahasına gözle görülür şekilde daha geniş bir görüş alanıdır:

cam.ioctl(csi.IOCTL_SET_FOV_WIDE, True)
cam.ioctl(csi.IOCTL_GET_FOV_WIDE)  # returns the current setting

M4 çekirdeği

Cortex‑M4 çekirdeği, işlemciler arası iletişim için openamp aracılığıyla açığa çıkarılır. OpenMV aygıt yazılımı yalnızca M7’de çalışır; M4’ün kendine ait bir MicroPython çalışma zamanı yoktur, bu nedenle onu kullanmak ayrı bir C aygıt yazılımı görüntüsü oluşturmayı ve bunu openamp.RemoteProc aracılığıyla dosya sisteminden yüklemeyi gerektirir. Sanal bir UART uç noktası uygulayan önceden derlenmiş örnek aygıt yazılımı openamp_vuart deposunda mevcuttur — vuart.elf‘i derlemek için README dosyasını izleyin:

import openamp
import time

def ept_recv_callback(src_addr, data):
    print("Received:", data.decode())

ept = openamp.Endpoint("vuart-channel", callback=ept_recv_callback)

rproc = openamp.RemoteProc("vuart.elf")
rproc.start()

count = 0
while True:
    if ept.is_ready():
        ept.send("Hello World %d!" % count, timeout=1000)
        count += 1
    time.sleep_ms(1000)

Uygulamada bu desteği, çalışan çift çekirdekli bir platformdan ziyade openamp arayüzünün bir gösterimi olarak ele almak en iyisidir — M4, M7’den bağımsız olarak sıfırlanamaz, bu nedenle M4’ü durdurmak tam bir sistem yeniden başlatmaya zorlar.

Mikrofon

Kart üzerindeki MP34DT06JTR PDM mikrofon, STM32’nin DFSDM çevre birimi üzerinden audio — Audio Modülü aracılığıyla yakalanır. Her arabellek, işaretli 16 bit PCM bytearray olarak gelir ve DSP için ulab/numpy‘a beslenmeye hazırdır — örneğin, basit bir ses yüksekliği dedektörü:

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

Kart üzerindeki LSM6DSOX ivmeölçer + jiroskop, imu — imu sensörü aracılığıyla açığa çıkarılır:

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)

IMU, başlıklarda açığa çıkarılan kullanıcı SPI4 ile çakışmaması için özel bir dahili SPI veri yoluna (SPI5) bağlıdır.

Time‑of‑flight mesafe ölçer

Kart üzerindeki ST VL53L1CB time‑of‑flight mesafe ölçer, dahili PMIC I²C veri yolu (I²C 2) üzerinde yer alır. ~4 m’ye kadar mesafe okumaları almak için dondurulmuş vl53l1x — VL53L1X ToF mesafe sensörü sürücüsü sürücüsünü kullanın:

import time
from machine import I2C
import vl53l1x

bus = I2C(2)               # internal bus (PMIC / fuel gauge / ToF)
tof = vl53l1x.VL53L1X(bus)

while True:
    print("Distance:", tof.read(), "mm")
    time.sleep_ms(100)

Pil yakıt ölçer

Maxim MAX17262 ModelGauge m5 yakıt ölçer, Li‑Po pilin gerilimini, akımını, sıcaklığını ve şarj durumunu izler. 0x36 adresinde I²C 2 üzerinde yer alır.

MAX17262 dahili akım algılamaya sahiptir, bu nedenle akım yazmacı, uygulanacak harici bir Rsense faktörü olmadan doğrudan mikroamper cinsinden okunur. Yakıt ölçeri okumak zararsızdır — bir sürücü ile birlikte gelmez, ancak MAX17262 veri sayfasında belgelenen yazmaçlar doğrudan okunabilir:

import time
import struct
from machine import I2C

FUEL_GAUGE = 0x36   # MAX17262

def read_reg(bus, addr, reg):
    return struct.unpack("<H", bus.readfrom_mem(addr, reg, 2))[0]

def read_signed(bus, addr, reg):
    v = read_reg(bus, addr, reg)
    return v - 0x10000 if v & 0x8000 else v

bus = I2C(2)

while True:
    # 0x05 RepCap — remaining capacity, raw × 0.5 mAh
    rep_cap   = read_reg(bus, FUEL_GAUGE, 0x05) * 0.5
    # 0x06 RepSOC — state of charge, raw / 256 %
    soc       = read_reg(bus, FUEL_GAUGE, 0x06) / 256
    # 0x08 Temp — die temperature, signed, raw / 256 °C
    temp      = read_signed(bus, FUEL_GAUGE, 0x08) / 256
    # 0x09 VCell — battery voltage, raw × 78.125 µV
    vcell     = read_reg(bus, FUEL_GAUGE, 0x09) * 78.125 / 1_000_000
    # 0x0A Current — signed, raw × 156.25 µA
    current   = read_signed(bus, FUEL_GAUGE, 0x0A) * 156.25 / 1000
    # 0x0B AvgCurrent — averaged current
    avg_curr  = read_signed(bus, FUEL_GAUGE, 0x0B) * 156.25 / 1000
    # 0x10 FullCapRep — learned full capacity, raw × 0.5 mAh
    full_cap  = read_reg(bus, FUEL_GAUGE, 0x10) * 0.5
    # 0x11 TTE — time-to-empty (valid while discharging), raw × 5.625 s
    tte_s     = read_reg(bus, FUEL_GAUGE, 0x11) * 5.625
    # 0x20 TTF — time-to-full   (valid while charging),  raw × 5.625 s
    ttf_s     = read_reg(bus, FUEL_GAUGE, 0x20) * 5.625
    # 0x17 Cycles — charge-cycle counter, 1% per LSB
    cycles    = read_reg(bus, FUEL_GAUGE, 0x17) / 100

    print("V:        %.3f V" % vcell)
    print("Capacity: %.1f / %.1f mAh (%.1f %%)" % (rep_cap, full_cap, soc))
    print("Temp:     %.1f C" % temp)
    print("Current:  %.1f mA  (avg %.1f mA)" % (current, avg_curr))
    print("TTE:      %.0f s   TTF: %.0f s" % (tte_s, ttf_s))
    print("Cycles:   %.2f" % cycles)
    print()
    time.sleep_ms(1000)

Current işaretli ikiye tümleyendir: şarj olurken pozitif, deşarj olurken negatif. TTE yalnızca akım negatifken anlamlıdır; TTF yalnızca akım pozitifken.

Güç yönetimi IC’si

NXP MC34PF1550A0EP PMIC, Nicla Vision üzerindeki her regülatörü yönetir — +3V3 ana hattı, +1V8 SoC çekirdeği / G/Ç hattı, seviye dönüştürücülere giden VDDIO_EXT ve Li‑Po şarj cihazı. 0x08 adresinde I²C 2 üzerinde yer alır.

Uyarı

PMIC yazmaçlarını okumak sorun değildir; onlara yazmak tehlikelidir. Bir buck regülatörünü veya şarj cihazı ayarını yanlış yapılandırmak kartı, pili veya her ikisini de kalıcı olarak hasara uğratabilir. Tam olarak ne yaptığınızı bilmediğiniz sürece PMIC’i salt okunur olarak ele alın.

PMIC’in size söyleyebileceği ancak yakıt ölçerin söyleyemeyeceği en yararlı şey şarj cihazı durum makinesidir — kartın şu anda USB / ESLOV / VIN üzerinde çalışıp çalışmadığı, Li‑Po’nun şarj döngüsünün hangi aşamasında olduğu ve şarj cihazının termal veya bekçi köpeği arızasında olup olmadığı. Şarj cihazı yazmaçları, PF1550’nin ana I²C adres alanında 0x80 ofsetinde bulunur (PF1550 veri sayfasının §22.2 bölümüne bakın), bu nedenle örneğin şarj cihazı adresi 0x04‘teki CHG_INT_OK PMIC yazmacı 0x84‘ten okunur:

import time
from machine import I2C

PMIC = 0x08

# Charger state machine (low nibble of CHG_SNS, register 0x87)
CHG_STATES = {
    0x0: "precharge",
    0x1: "fast charge (constant current)",
    0x2: "fast charge (constant voltage)",
    0x3: "end of charge",
    0x4: "done",
    0x6: "timer fault",
    0x7: "thermistor suspend",
    0x8: "off — input invalid or charger disabled",
    0x9: "battery overvoltage",
    0xA: "thermal shutdown",
    0xC: "linear mode (not charging)",
}

bus = I2C(2)

while True:
    # 0x84 CHG_INT_OK — single-bit indicators
    ok = bus.readfrom_mem(PMIC, 0x84, 1)[0]
    vbus_ok = bool(ok & (1 << 5))   # bit 5 — VBUS valid (USB/ESLOV/VIN)
    bat_ok  = bool(ok & (1 << 2))   # bit 2 — battery OK
    chg_ok  = bool(ok & (1 << 3))   # bit 3 — charger actively charging
    thm_ok  = bool(ok & (1 << 7))   # bit 7 — thermistor in normal range

    # 0x87 CHG_SNS — charger state + thermal regulation flag
    chg_sns = bus.readfrom_mem(PMIC, 0x87, 1)[0]
    state   = CHG_STATES.get(chg_sns & 0x0F, "reserved")
    treg    = bool(chg_sns & (1 << 7))   # thermal regulation active

    print("VBUS valid:         ", vbus_ok)
    print("battery OK:         ", bat_ok)
    print("charger active:     ", chg_ok)
    print("thermistor normal:  ", thm_ok)
    print("thermal reg active: ", treg)
    print("state:              ", state)
    print()
    time.sleep_ms(1000)

Veri sayfasında bakmaya değer diğer salt okunur yazmaçlar (tümü şarj cihazı ofseti 0x80‘de): 0x80 CHG_INT (mandallanmış şarj cihazı kesmeleri — arıza bayrakları), 0x86 VBUS_SNS (OVLO / UVLO / DPM dahil çok bitli VBUS durumu) ve 0x88 BATT_SNS (pil varlığı ve aşırı akım durumu).

Wi‑Fi

Kart üzerindeki Murata 1DX (CYW4343W), bir istasyon arayüzü olarak network — ağ yapılandırması aracılığıyla açığa çıkarılır. Radyoyu çalıştırmadan önce birlikte verilen anteni kart üzerindeki U.FL konektörüne bağlayın:

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ı Murata 1DX ayrıca Bluetooth LE 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 merkezi cihazın bağlanmasını bekleyin:

import asyncio
import aioble

async def run():
    while True:
        conn = await aioble.advertise(250_000, name="Nicla-Vision")
        print("Connected:", conn.device)
        await conn.disconnected()

asyncio.run(run())

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 (varsayılan VDDIO_EXT) ve seviye dönüştürücüler pin başına sürüş gücünü birkaç miliampere sınırlar — bunlar güç yükleri için değil, sinyal seviyesi için tasarlanmıştır.

from machine import Pin

out = Pin("D0", Pin.OUT)
out.on()
out.off()
out.value(1)

inp = Pin("D1", 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("D1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Veri yolu

TX

RX

UART4

SDA

SCL

from machine import UART

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

Not

UART4 pinlerini I²C 1 ile paylaşır — aynı SDA/SCL pedleri her iki veri yolunu da taşır. Bu pinlerde UART veya I²C’den birini seçin, ikisini birden değil.

D1/D2 serigrafisinde UART_TX/UART_RX de yazar, ancak bu aygıt yazılımında bu pinler machine.UART‘a değil, LPUART1‘e yönlendirilir. machine.UART(1)‘in kendisi yonga üzerindeki Bluetooth denetleyicisi için ayrılmıştır ve başlıklarda erişilebilir değildir.

I²C

Veri yolu

SCL

SDA

I2C1

SCL

SDA

from machine import I2C

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

J2 üzerindeki SCL/SDA pedleri ile ESLOV konektörünün SCL_EXT/SDA_EXT pinleri aynı I²C 1 veri yoluna iner — ESLOV pin yerleşimi için yukarıdaki ESLOV konektörü bölümüne bakın.

Aynı donanım, bir bellek bölgesini başka bir I²C denetleyicisine açığa çıkarmak için machine.I2CTarget aracılığıyla hedef (slave) modunda da kullanılabilir:

from machine import I2CTarget

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

SPI

Veri yolu

MOSI

MISO

SCK

CS

SPI4

COPI

CIPO

SCLK

CS

from machine import SPI
from machine import Pin

spi = SPI(4, baudrate=10_000_000)
cs = Pin("CS", Pin.OUT, value=1)   # CS is not driven by the SPI peripheral

cs.value(0)
spi.write(b"hello")
cs.value(1)

ADC

Nicla Vision, A0, A1 ve A2 üzerinde üç adet 12 bit ADC kanalı açığa çıkarır. Üçü de 1.8 V referanslıdırread_u16 pinde 0–1.8 V aralığında 0–65535 döndürür:

from machine import ADC
import time

adc = ADC("A0")
while True:
    voltage = adc.read_u16() * 1.8 / 65535
    print(voltage)
    time.sleep_ms(100)

Uyarı

Nicla Vision’ın ADC girişleri 1.8 V referanslıdır (ve SoC’nin önünde seviye dönüştürücü yoktur). 3.3 V’luk bir sinyal sürmek dönüştürücüyü doyurur ve pine zarar verebilir — daha yüksek gerilimleri harici olarak bölün.

PWM

Pin

Zamanlayıcı / kanal

D1

TIM1 CH2

D2

TIM1 CH3

SCL

TIM4 CH3, TIM16 CH1

SDA

TIM4 CH4, TIM17 CH1

SCLK

TIM1 CH3N

CIPO

TIM1 CH3

COPI

TIM1 CH4

CS

TIM1 CH2

Bunlardan herhangi birini machine.PWM aracılığıyla sürün:

from machine import Pin, PWM

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

Not

Birkaç pin TIM1 kanallarını paylaşır:

  • TIM1 CH2, D1 ve CS üzerindedir.

  • TIM1 CH3, D2 ve CIPO üzerindedir; SCLK, aynı kanalın ters tümleyenini (TIM1 CH3N) verir.

  • TIM1 CH4, yalnızca COPI üzerindedir.

Zamanlayıcı kanalı başına bir tüketici seçin. SPI dörtlüsü pinleri (SCLK/CIPO/COPI/CS) ayrıca machine.SPI(4) onları kullanırken PWM ile sürülemez.

Yazılım bit‑bang 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ğlanmış 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 1 üzerinden konuşur — modülü serigrafili SCL / SDA pedlerine bağlayın.

Zamanlama

time

time modülü, engelleyici 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) 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. Yuvayı durdurmak ve serbest bırakmak için deinit() çağırın.

Gerçek zamanlı saat

machine.RTC, sıfırlamalar boyunca gerçek zamanı 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())

Bekçi köpeği (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 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

Aygıt yazılımı güncellemesi (DFU)

Nicla Vision, Arduino’nun önyükleyicisine (bootloader) girmek için Arduino’nun standart çift dokunmalı sıfırlama yöntemini kullanır. Sıfırlama düğmesine hızlıca iki kez basın — kart USB üzerinden bir DFU aygıtı olarak yeniden sayımlanır ve OpenMV IDE yeni bir aygıt yazılımı görüntüsü yükleyebilir.

Çalışan bir betik, machine.bootloader() çağırarak önyükleyiciye isteğe bağlı olarak yeniden girebilir:

import machine

machine.bootloader()

Dosya sistemi ve önyükleme sırası

Nicla Vision aygıt yazılımı, önyükleme sırasında en fazla iki dosya sistemi bağlar:

  • Dahili flash bellek — her zaman /flash konumuna bağlanır. Varsayılan olarak main.py ve README.txt dosyalarını tutar; ilk önyüklemede oluşturulur.

  • ROMFS — salt okunur, belleğe eşlenmiş dosya sistemi olup MicroPython tarafından başlangıçta otomatik olarak /rom konumuna bağlanır.

Bağlamadan sonra çalışma dizini /flash olarak ayarlanır. Yorumlayıcı daha sonra o dizindeki betikleri çalıştırır:

  • boot.py her yazılımsal sıfırlamada çalıştırılır (soğuk önyükleme, REPL’den Ctrl‑D veya çalışan betik her döndüğünde).

  • main.py yalnızca soğuk önyüklemede, boot.py‘den hemen sonra çalıştırılır. Sonraki yazılımsal sıfırlamalar boot.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.

Yeni yazılmış bir kartta gelen varsayılan main.py, bir kalp atışı olarak kullanıcı RGB LED’inin mavi kanalını yanı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 temiz bir şekilde önyüklendiğini anlayabilirsiniz.

sys.path, her iki dosya sistemini ve bunların lib/ alt dizinlerini içerecek şekilde genişletilir, böylece içe aktarılabilir modüller /flash/lib veya /rom/lib içinde bulunabilir.

USB üzerinden bağlandığında, /flash ayrıca ana bilgisayarda bir USB yığın depolama sürücüsü olarak sayımlanı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 gördüğünden, kamerada ç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 kamera aynı anda aynı dosya sistemine 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

Ana bilgisayar USB yığın depolama sürücüsünden okurken veya ona yazarken kullanıcı RGB LED’inin kırmızı kanalı kısaca yanabilir — bu, bir arıza değil, aygıt yazılımı tarafından sürülen bir etkinlik göstergesidir.

Depolama boyutları

Nicla Vision şunlarla birlikte gelir:

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

  • /rom4 MB salt okunur belleğe eşlenmiş ROMFS, sıfır kopyalı mmap erişiminden yararlanan betikleri ve ML modellerini sunmak için kullanılır.

Hard‑fault göstergesi

Kullanıcı RGB LED’i tüm renkler arasında hızla dönüyorsa — belirgin renk tonlarından ziyade parıldayan beyaz bir LED gibi görünecek kadar hızlı — aygıt yazılımı kurtarılamaz bir hard fault’a düşmüş demektir. Kurtarmak için aygıt yazılımını yeniden yazın; yeniden yazma yardımcı olmazsa kart fiziksel olarak hasarlı olabilir.

Yazılım kütüphaneleri

Modüllerin tam listesi için — Nicla Vision derlemesine özgü olanlar dahil — kütüphane dizinine bakın.