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.
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 (
D0–D3), üç adet 1.8 V analog giriş (A0–A2),SCL/SDAI²C çifti veSCLK/CIPO/COPI/CSSPI 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¶
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
D0–D3 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
VESLOVpininde 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 |
J5‑2 |
INT |
|
J5‑3 |
SCL_EXT |
J2 |
J5‑4 |
SDA_EXT |
J2 |
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).
P8 —
VOTP_PMIC— yalnı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ır — read_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,
D1veCSüzerindedir.TIM1 CH3,
D2veCIPOü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
/flashkonumuna bağlanır. Varsayılan olarakmain.pyveREADME.txtdosyaları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
/romkonumuna 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.pyher yazılımsal sıfırlamada çalıştırılır (soğuk önyükleme, REPL’denCtrl‑Dveya çalışan betik her döndüğünde).main.pyyalnızca soğuk önyüklemede,boot.py‘den hemen sonra ç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.
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:
/flash— 11 MB FAT dosya sistemi, okuma/yazma./rom— 4 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.