Arduino Nicla Vision

Arduino Nicla Vision adalah papan visi mesin berukuran 22,86 × 22,86 mm yang dibangun di atas STMicroelectronics STM32H747AII6 — sebuah SoC dual-core yang menggabungkan Cortex‑M7 pada 400 MHz dengan Cortex‑M4 pada 200 MHz. Firmware OpenMV berjalan sepenuhnya pada inti M7. Papan ini memadukan MCU dengan sensor CMOS warna 2 MP GC2145, IMU 6-sumbu LSM6DSOX, mikrofon MEMS MP34DT06, pengukur jarak time-of-flight VL53L1CB, Wi-Fi + Bluetooth LE 5.1, dan pengisi daya baterai / pengukur kapasitas bahan bakar.

Arduino Nicla Vision

Untuk lembar data lengkap, foto, dan dimensi, lihat halaman produk Arduino Nicla Vision.

Sorotan

  • STMicroelectronics STM32H747AII6 dual Cortex‑M7 (400 MHz) + Cortex‑M4 (200 MHz). Firmware OpenMV berjalan hanya pada inti M7.

  • Flash internal 2 MB ditambah flash QSPI eksternal 16 MB (digunakan untuk aplikasi + ROMFS).

  • SRAM internal 1 MB.

  • Enkoder/dekoder JPEG berbasis perangkat keras.

  • Sensor CMOS warna 2 MP GC2145.

  • IMU terpasang (akselerometer + giroskop LSM6DSOX), mikrofon MEMS (MP34DT06JTR), dan pengukur jarak time-of-flight VL53L1CB (hingga ~4 m).

  • Wi-Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 melalui modul Murata 1DX (CYW4343W) — terhubung ke antena yang disertakan melalui konektor U.FL di papan.

  • USB kecepatan tinggi (480 Mb/s) melalui Micro USB dengan PHY ULPI eksternal (USB3320C).

  • 13 pin I/O pengguna pada header tepi Arduino — empat LPIO digital (D0D3), tiga input analog 1,8 V (A0A2), pasangan I²C SCL/SDA, dan kuartet SPI SCLK/CIPO/COPI/CS.

  • Dukungan baterai — konektor Li-Po di bagian belakang, pengisi daya gaya BQ, dan pengukur kapasitas bahan bakar MAX17262 melalui bus PMIC internal.

  • Konektor ESLOV 5 pin di bagian belakang untuk ekspansi I²C tanpa solder.

Peringatan

Pin digital pengguna secara default adalah 3,3 V tetapi diarahkan melalui level shifter yang dapat diprogram secara perangkat lunak (VDDIO_EXT) yang dapat dikonfigurasi ulang ke 1,8 V. Pin analog (A0–A2) hanya 1,8 V — pin ini melewati level shifter dan terhubung langsung ke MCU. Memberikan tegangan 3,3 V ke A0–A2 akan merusak SoC.

Pinout

Arduino Nicla Vision Pinout

Referensi pin

Tiga belas pin pengguna diekspos pada header tepi Arduino (J1 dan J2). Debug tambahan, pemulihan, dan sinyal PMIC diarahkan ke test pad di bagian belakang papan.

Nama pin

Referensi

Fungsi

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 channel 4 (J1‑8)

A1

1,8 V

ADC2 channel 2 (J1‑7)

A2

1,8 V

ADC3 channel 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

tarik ke GND (atau tekan saklar di papan) untuk mereset papan

LED_RED

3,3 V

Saluran merah LED RGB (aktif rendah)

LED_GREEN

3,3 V

Saluran hijau LED RGB (aktif rendah)

LED_BLUE

3,3 V

Saluran biru LED RGB (aktif rendah)

Catatan

D0D3 dan SCLK/CIPO/COPI/CS berada di belakang level shifter bidirectional TXB0108 — komponen itu hanya mendukung drive GPIO push-pull, sehingga lalu lintas bus open-drain (misalnya 1-Wire bit-banged atau I²C pada pin tersebut) tidak akan berfungsi.

SCL/SDA berada di belakang shifter NTS0304 terpisah yang mendukung drive push-pull maupun open-drain, itulah mengapa I²C 1 berfungsi di sana.

Kedua shifter direferensikan ke VDDIO_EXT (3,3 V secara default dari PMIC di papan), dan kekuatan drive-nya terbatas dibandingkan GPIO langsung — dirancang untuk beban level sinyal bukan beban daya.

Pin daya

Pin header tepi:

  • VIN (J2‑9) — rel sistem utama 3,6 – 5 V. PMIC mengambil inputnya dari sini.

  • VDDIO_EXT (J2‑7) — output rel level-shifter, 1,8 V atau 3,3 V (3,3 V secara default). Gunakan ini untuk memberi daya periferal 1,8 V atau 3,3 V eksternal yang terhubung ke pin LPIO/SPI/I²C agar berbicara pada level logika yang sama dengan header.

  • VBAT (J3‑2) — input baterai Li-Po. PMIC di papan mengisi sel dari VIN dan melaporkan status pengisian daya melalui pengukur kapasitas bahan bakar.

  • NTC (J3‑1) — input termistor Li-Po opsional.

  • GND (J2‑6) — ground bersama.

  • NC (J2‑8) — tidak terhubung.

Test pad di bagian belakang papan:

  • +3V3 — rel utama 3,3 V.

  • D_P / D_N — pasangan data USB kecepatan tinggi (pasca-PHY).

USB dan konektor ESLOV keduanya menyuplai VIN melalui sepasang diode ideal LM66100 (satu per sumber), sehingga salah satu catu daya dapat memberi daya papan sendiri dan keduanya tidak pernah saling back-drive. Jika Anda menggerakkan VIN secara eksternal di J2‑9, itu mengambil prioritas — diode-diode tersebut berhenti menghantarkan dari USB / ESLOV begitu rel eksternal naik lebih tinggi.

Papan dapat diberi daya melalui salah satu jalur ini:

  • Micro USB — 5 V ke VIN melalui diode ideal sisi USB.

  • Konektor ESLOV — hingga 5 V pada pin VESLOV dari J5, diarahkan ke VIN melalui diode ideal sisi ESLOV (lihat Konektor ESLOV).

  • Pin VIN (J2‑9) — hubungkan catu daya yang diatur 3,6 – 5 V secara langsung.

  • Baterai Li-Po — hubungkan ke konektor baterai J4 di bagian belakang atau ke pad VBAT/GND/NTC pada J3 / J2‑6. Jangan hubungkan dua baterai secara bersamaan.

Konektor ESLOV

J5 di bagian belakang papan adalah konektor ESLOV Molex bebas-solder 5 pin:

Pin

Nama

Fungsi

J5‑1

VESLOV

input daya (≤ 5 V) — OR'd ke VIN melalui diode ideal LM66100

J5‑2

INT

input interupsi eksternal pada PD9

J5‑3

SCL_EXT

berbagi dengan pad SCL J2 — bus I²C 1 yang sama dengan header pengguna

J5‑4

SDA_EXT

berbagi dengan pad SDA J2 — bus I²C 1 yang sama dengan header pengguna

J5‑5

GND

ground bersama

SCL_EXT/SDA_EXT ESLOV dan SCL/SDA J2 adalah pin yang sama — satu bus I²C 1 yang diekspos pada dua konektor.

Tip

Gunakan estimator masa pakai baterai untuk memodelkan berapa lama Nicla Vision akan berjalan dengan baterai untuk siklus aktif / deep-sleep tertentu.

Pin pemulihan dan debug

  • RESET — baik sebagai saklar sesaat di bagian atas papan maupun pad (J3‑4 / test pad P5) yang terhubung ke jalur NRST SoC. Tarik ke GND untuk mereset.

Nicla Vision menggunakan double-tap reset standar Arduino untuk masuk ke bootloader Arduino — tekan tombol reset dengan cepat dua kali dan papan akan terdaftar sebagai perangkat DFU. OpenMV IDE menggunakan mode ini untuk mem-flash ulang firmware.

Sinyal SWD STM32 diekspos di bagian belakang papan melalui baris test pad di antara dua header J2. Solder header 2,54 mm (100 mil) ke dalamnya untuk memasang adaptor ST-LINK atau J-Link:

  • P1 / P2 — bus I²C PMIC internal pada PF0 (SDA) dan PF1 (SCL). Ini adalah machine.I2C(2) pada Nicla Vision dan membawa lalu lintas PMIC, pengukur kapasitas bahan bakar, dan ToF.

  • P3 — TMS / SWDIO (PA13)

  • P4 — TCK / SWCLK (PA14)

  • P5 — NRST

  • P6 — TDO / SWO (PB3)

  • P7 — rel +1V8 (catu I/O SoC — juga referensi yang tepat untuk adaptor debug).

  • P8VOTP_PMIChanya untuk pemrograman pabrik. Harus dibiarkan tidak terhubung.

Semua sinyal debug direferensikan ke 1,8 V — ring I/O STM32H747 pada papan ini berjalan dari rel +1V8. Atur adaptor debug Anda untuk logika 1,8 V sebelum menghubungkan.

Periferal terpasang

LED

Nicla Vision memiliki satu LED RGB pengguna, yang dapat dikontrol melalui perangkat lunak menggunakan machine.LED

from machine import LED

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

LED DL2 CHARGE terpisah di sisi papan terhubung langsung ke output CHGB PMIC — menyala saat baterai Li-Po sedang diisi dari USB / ESLOV / VIN dan tidak dapat dikontrol pengguna.

Sensor kamera

GC2145 digerakkan melalui modul csi --- sensor kamera

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()

Ketika Anda meminta framesize kecil, driver GC2145 memotong jendela readout yang proporsional kecil dari sensor — secara default rasio downscale readout-ke-output dibatasi pada 3x untuk menjaga frame rate tetap tinggi. csi.IOCTL_SET_FOV_WIDE menaikkan batas itu ke 5x, yang berarti driver menarik dari area yang lebih luas dari sensor saat streaming resolusi kecil. Hasilnya adalah bidang pandang yang lebih lebar secara nyata pada framesize kecil, dengan mengorbankan sebagian throughput:

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

Inti M4

Inti Cortex-M4 diekspos melalui openamp untuk komunikasi antar-prosesor. Firmware OpenMV berjalan hanya pada M7; M4 tidak memiliki runtime MicroPython sendiri, sehingga menggunakannya berarti membangun image firmware C terpisah dan memuatnya dari filesystem melalui openamp.RemoteProc. Firmware contoh yang telah dibangun yang mengimplementasikan endpoint UART virtual tersedia di repositori openamp_vuart — ikuti README-nya untuk membangun vuart.elf

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)

Dalam praktiknya, dukungan ini paling baik diperlakukan sebagai demonstrasi antarmuka openamp daripada platform dual-core yang berfungsi — M4 tidak dapat direset secara independen dari M7, sehingga menghentikan M4 memaksa reboot sistem penuh.

Mikrofon

Mikrofon PDM MP34DT06JTR yang terpasang di papan ditangkap melalui audio --- Modul Audio melalui periferal DFSDM STM32. Setiap buffer tiba sebagai bytearray PCM signed 16-bit, siap untuk dimasukkan ke ulab/numpy untuk DSP — misalnya, detektor kenyaringan sederhana:

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

Akselerometer + giroskop LSM6DSOX yang terpasang di papan diekspos melalui imu --- sensor imu

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 terhubung ke bus SPI internal khusus (SPI5) sehingga tidak berkonflik dengan SPI4 pengguna yang diekspos pada header.

Pengukur jarak time-of-flight

Pengukur jarak time-of-flight ST VL53L1CB yang terpasang di papan berada pada bus I²C PMIC internal (I²C 2). Gunakan driver vl53l1x --- Driver sensor jarak ToF VL53L1X yang dibekukan untuk mendapatkan pembacaan jarak hingga ~4 m:

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)

Pengukur kapasitas baterai

Pengukur kapasitas bahan bakar ModelGauge m5 Maxim MAX17262 melacak tegangan, arus, suhu, dan status pengisian daya baterai Li-Po. Berada pada I²C 2 di alamat 0x36.

MAX17262 memiliki penginderaan arus internal, sehingga register arus membaca langsung dalam mikroampere tanpa faktor Rsense eksternal yang perlu diterapkan. Membaca pengukur kapasitas bahan bakar tidak berbahaya — tidak ada driver yang disertakan, tetapi register yang didokumentasikan dalam lembar data MAX17262 dapat dibaca secara langsung:

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 adalah komplemen dua bertanda: positif saat mengisi, negatif saat menguras. TTE hanya bermakna ketika arus negatif; TTF hanya ketika arus positif.

IC manajemen daya

MC34PF1550A0EP NXP PMIC menangani setiap regulator pada Nicla Vision — rel utama +3V3, rel inti / I/O SoC +1V8, VDDIO_EXT ke level shifter, dan pengisi daya Li-Po. Berada pada I²C 2 di alamat 0x08.

Peringatan

Membaca register PMIC tidak apa-apa; menulis ke register tersebut berbahaya. Salah konfigurasi regulator buck atau pengaturan pengisi daya dapat merusak papan, baterai, atau keduanya secara permanen. Perlakukan PMIC sebagai hanya-baca kecuali Anda tahu persis apa yang Anda lakukan.

Hal paling berguna yang diberitahukan PMIC yang tidak bisa dilakukan oleh pengukur kapasitas bahan bakar adalah mesin status pengisi daya — apakah papan saat ini berjalan pada USB / ESLOV / VIN, tahap siklus pengisian apa yang sedang dilakukan Li-Po, dan apakah pengisi daya mengalami kesalahan termal atau watchdog. Register pengisi daya berada pada offset 0x80 di ruang alamat I²C utama PF1550 (lihat §22.2 dari lembar data PF1550), jadi misalnya CHG_INT_OK pada alamat pengisi daya 0x04 dibaca dari register PMIC 0x84

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)

Register hanya-baca lain yang layak dilihat dalam lembar data (semua pada offset pengisi daya 0x80): 0x80 CHG_INT (interupsi pengisi daya yang dikunci — flag kesalahan), 0x86 VBUS_SNS (status VBUS multi-bit termasuk OVLO / UVLO / DPM), dan 0x88 BATT_SNS (keberadaan baterai dan status arus lebih).

Wi-Fi

Murata 1DX (CYW4343W) yang terpasang di papan diekspos melalui network --- konfigurasi jaringan sebagai antarmuka stasiun. Hubungkan antena yang disertakan ke konektor U.FL di papan sebelum mengaktifkan radio:

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

Murata 1DX yang sama juga mengekspos Bluetooth LE 5.1. Gunakan aioble --- Async BLE untuk BLE yang ramah asyncio — misalnya, iklankan sebagai periferal dan tunggu pusat terhubung:

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())

Referensi bus

GPIO

Gunakan machine.Pin untuk membaca atau menggerakkan pin silkscreen mana pun. Output adalah CMOS 3,3 V (VDDIO_EXT default) dan level shifter membatasi kekuatan drive per-pin ke beberapa miliampere — dirancang untuk beban level sinyal bukan beban daya.

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())

Pin input mana pun juga dapat memicu interupsi pada transisi tepi:

def handler(pin):
    print("triggered:", pin)

Pin("D1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Bus

TX

RX

UART4

SDA

SCL

from machine import UART

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

Catatan

UART4 berbagi pin dengan I²C 1 — pad SDA/SCL yang sama membawa kedua bus. Pilih UART atau I²C, tidak keduanya, pada pin tersebut.

Silkscreen D1/D2 juga bertuliskan UART_TX/UART_RX, tetapi pada firmware ini pin tersebut diarahkan ke LPUART1, bukan ke machine.UART. machine.UART(1) sendiri dicadangkan untuk kontroler Bluetooth on-chip dan tidak dapat diakses pada header.

I²C

Bus

SCL

SDA

I2C1

SCL

SDA

from machine import I2C

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

Pad SCL/SDA pada J2 dan pin SCL_EXT/SDA_EXT konektor ESLOV mendarat pada bus I²C 1 yang sama — lihat Konektor ESLOV di atas untuk pinout ESLOV.

Perangkat keras yang sama juga dapat digunakan dalam mode target (slave) melalui machine.I2CTarget untuk mengekspos wilayah memori ke kontroler I²C lain:

from machine import I2CTarget

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

SPI

Bus

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 mengekspos tiga saluran ADC 12-bit pada A0, A1, dan A2. Ketiganya direferensikan ke 1,8 Vread_u16 mengembalikan 0–65535 pada rentang 0–1,8 V di pin:

from machine import ADC
import time

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

Peringatan

Input ADC Nicla Vision direferensikan ke 1,8 V (dan tidak memiliki level shifter di depan SoC). Memberikan sinyal 3,3 V akan menjenuhkan konverter dan dapat merusak pin — bagi tegangan yang lebih tinggi secara eksternal.

PWM

Pin

Timer / saluran

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

Gerakkan salah satunya melalui machine.PWM

from machine import Pin, PWM

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

Catatan

Beberapa pin berbagi saluran TIM1:

  • TIM1 CH2 ada pada D1 dan CS.

  • TIM1 CH3 ada pada D2 dan CIPO; SCLK menghasilkan komplemen terbalik (TIM1 CH3N) dari saluran yang sama.

  • TIM1 CH4 ada pada COPI saja.

Pilih satu konsumen per saluran timer. Pin kuartet SPI (SCLK/CIPO/COPI/CS) juga tidak dapat digerakkan oleh PWM saat machine.SPI(4) menggunakannya.

Bus perangkat lunak bit-banged

machine.SoftI2C dan machine.SoftSPI berfungsi pada GPIO mana pun jika Anda membutuhkan bus tambahan.

Sensor termal (di luar papan)

Firmware menyertakan driver fir --- driver sensor termal (fir == far infrared) untuk imager termal yang dihubungkan secara eksternal:

  • MLX90621 — array IR 16 × 4

  • MLX90640 — array IR 32 × 24

  • MLX90641 — array IR 16 × 12

  • AMG8833 — array IR 8 × 8

Hubungkan modul ke bus I²C papan dan baca bingkai dengan fir.init() + fir.snapshot()

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())

Driver fir hanya berkomunikasi dengan sensor melalui I²C 1 — hubungkan modul ke pad SCL / SDA yang tercetak di silkscreen.

Waktu

time

Modul time mencakup penundaan pemblokiran, tik monotonis, dan pengukuran waktu yang berlalu:

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)

Timer virtual

machine.Timer menjadwalkan callback berkala atau satu kali tanpa menggunakan slot timer perangkat keras. Berikan -1 sebagai id untuk menggunakan timer virtual (perangkat lunak):

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"))

Nilai periode dalam milidetik. Panggil deinit() untuk menghentikan dan melepaskan slot.

Jam waktu nyata

machine.RTC menjaga waktu jam dinding melewati reset:

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())

Watchdog

machine.WDT mereset papan jika aplikasi hang. Setelah dimulai tidak dapat dihentikan atau dikonfigurasi ulang — umpan secara berkala di dalam loop utama Anda:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Info boot dan runtime

Pembaruan firmware (DFU)

Nicla Vision menggunakan double-tap reset standar Arduino untuk masuk ke bootloader Arduino. Tekan tombol reset dengan cepat dua kali — papan mendaftar ulang melalui USB sebagai perangkat DFU dan OpenMV IDE dapat mem-flash image firmware baru.

Skrip yang sedang berjalan dapat masuk kembali ke bootloader sesuai permintaan dengan memanggil machine.bootloader()

import machine

machine.bootloader()

Filesystem dan urutan boot

Firmware Nicla Vision memasang hingga dua filesystem saat boot:

  • Flash internal — selalu dipasang di /flash. Menyimpan main.py dan README.txt secara default; dibuat pada boot pertama.

  • ROMFS — filesystem yang dipetakan ke memori hanya-baca di /rom yang dipasang secara otomatis oleh MicroPython saat startup.

Setelah pemasangan, direktori kerja diatur ke /flash. Interpreter kemudian menjalankan skrip dari direktori tersebut:

  • boot.py dijalankan pada setiap soft reset (cold boot, Ctrl‑D dari REPL, atau kapan pun skrip yang berjalan kembali).

  • main.py dijalankan hanya saat cold boot, segera setelah boot.py. Soft reset berikutnya menjalankan ulang boot.py tetapi langsung turun ke REPL — untuk menjalankan ulang main.py Anda harus mereset penuh papan.

main.py default yang disertakan pada papan yang baru di-flash hanya berkedip saluran biru LED RGB pengguna sebagai detak jantung (dua denyut pendek, jeda pendek), sehingga Anda dapat mengetahui firmware telah boot dengan bersih tanpa host yang terpasang.

sys.path diperluas untuk menyertakan kedua filesystem dan subdirektori lib/ mereka, sehingga modul yang dapat diimpor dapat berada di /flash/lib atau /rom/lib.

Saat terhubung melalui USB, /flash juga terdaftar sebagai drive penyimpanan massal USB pada host, memungkinkan Anda mengedit boot.py, main.py, dan file lainnya secara langsung. Keluarkan drive sebelum mereset kamera agar host membuang tulisan yang di-cache.

Catatan

Karena OS memperlakukan drive sebagai perangkat blok pasif, file yang dibuat atau dimodifikasi oleh kode yang berjalan pada kamera tidak akan muncul sampai host memasang ulang drive. Jika OS dan kamera menulis filesystem yang sama pada saat yang sama, OS akan menang dan menimpa perubahan yang dibuat oleh kamera. Gunakan kartu SD untuk data apa pun yang ditulis kembali oleh skrip, dan pasang ulang sebelum membaca file tersebut dari host.

Catatan

Saluran merah LED RGB pengguna mungkin menyala sebentar saat host membaca dari atau menulis ke drive penyimpanan massal USB — ini adalah indikator aktivitas yang digerakkan firmware, bukan kesalahan.

Ukuran penyimpanan

Nicla Vision dilengkapi dengan:

  • /flash — filesystem FAT 11 MB, baca/tulis.

  • /rom — ROMFS yang dipetakan ke memori hanya-baca 4 MB, digunakan untuk menyertakan skrip dan model ML yang mendapat manfaat dari akses mmap zero-copy.

Indikator hard-fault

Jika LED RGB pengguna bersepeda cepat melalui semua warna — cukup cepat sehingga cenderung terlihat seperti LED putih berkelip daripada warna yang berbeda — firmware telah mengalami hard fault yang tidak dapat dipulihkan. Flash ulang firmware untuk memulihkan; jika reflashing tidak membantu, papan mungkin rusak secara fisik.

Pustaka perangkat lunak

Lihat indeks pustaka untuk daftar lengkap modul — termasuk yang unik untuk build Nicla Vision.