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.
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 (
D0–D3), tiga input analog 1,8 V (A0–A2), pasangan I²CSCL/SDA, dan kuartet SPISCLK/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¶
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
D0–D3 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
VESLOVdari 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 |
J5‑2 |
INT |
input interupsi eksternal pada |
J5‑3 |
SCL_EXT |
berbagi dengan pad |
J5‑4 |
SDA_EXT |
berbagi dengan pad |
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).
P8 —
VOTP_PMIC— hanya 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 V — read_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
D1danCS.TIM1 CH3 ada pada
D2danCIPO;SCLKmenghasilkan komplemen terbalik (TIM1 CH3N) dari saluran yang sama.TIM1 CH4 ada pada
COPIsaja.
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. Menyimpanmain.pydanREADME.txtsecara default; dibuat pada boot pertama.ROMFS — filesystem yang dipetakan ke memori hanya-baca di
/romyang dipasang secara otomatis oleh MicroPython saat startup.
Setelah pemasangan, direktori kerja diatur ke /flash. Interpreter kemudian menjalankan skrip dari direktori tersebut:
boot.pydijalankan pada setiap soft reset (cold boot,Ctrl‑Ddari REPL, atau kapan pun skrip yang berjalan kembali).main.pydijalankan hanya saat cold boot, segera setelahboot.py. Soft reset berikutnya menjalankan ulangboot.pytetapi langsung turun ke REPL — untuk menjalankan ulangmain.pyAnda 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.