Arduino Nicla Vision¶
Arduino Nicla Vision je deska pro strojové vidění o rozměrech 22,86 × 22,86 mm postavená kolem obvodu STMicroelectronics STM32H747AII6 — dvoujádrového SoC kombinujícího Cortex‑M7 na 400 MHz s Cortex‑M4 na 200 MHz. Firmware OpenMV běží výhradně na jádře M7. Deska doplňuje MCU o barevný CMOS senzor GC2145 s rozlišením 2 MP, 6osou IMU LSM6DSOX, MEMS mikrofon MP34DT06, dálkoměr VL53L1CB využívající princip doby letu (time‑of‑flight), Wi‑Fi + Bluetooth LE 5.1 a nabíječku baterie / měřič stavu nabití.
Úplný datasheet, fotografie a rozměry najdete na produktové stránce Arduino Nicla Vision.
Hlavní vlastnosti¶
STMicroelectronics STM32H747AII6 s dvojicí Cortex‑M7 (400 MHz) + Cortex‑M4 (200 MHz). Firmware OpenMV běží pouze na jádře M7.
2 MB interní flash paměti plus 16 MB externí QSPI flash paměti (využité pro aplikaci + ROMFS).
1 MB interní SRAM.
Hardwarový JPEG enkodér/dekodér.
GC2145 barevný CMOS senzor s rozlišením 2 MP.
Vestavěná IMU (akcelerometr + gyroskop LSM6DSOX), MEMS mikrofon (MP34DT06JTR) a dálkoměr VL53L1CB typu time‑of‑flight (dosah až ~4 m).
Wi‑Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 prostřednictvím modulu Murata 1DX (CYW4343W) — připojuje se k dodávané anténě přes konektor U.FL na desce.
Vysokorychlostní USB (480 Mb/s) přes Micro USB prostřednictvím externí ULPI PHY (USB3320C).
13 uživatelských I/O pinů na okrajových konektorech Arduino — čtyři digitální LPIO (
D0–D3), tři 1,8V analogové vstupy (A0–A2), párSCL/SDApro I²C a čtveřiceSCLK/CIPO/COPI/CSpro SPI.Podpora baterie — Li‑Po konektor na zadní straně, nabíječka typu BQ a měřič stavu nabití MAX17262 na interní sběrnici PMIC.
5pinový konektor ESLOV na zadní straně pro připojení I²C bez pájení.
Varování
Uživatelské digitální piny jsou ve výchozím nastavení 3,3 V, ale jsou vedeny přes softwarově programovatelné převodníky úrovní (VDDIO_EXT), které lze překonfigurovat na 1,8 V. Analogové piny (A0–A2) jsou pouze 1,8 V — obcházejí převodníky úrovní a připojují se přímo k MCU. Přivedení 3,3 V na A0–A2 poškodí SoC.
Pinout¶
Reference pinů¶
Na okrajových konektorech Arduino (J1 a J2) je vyvedeno třináct uživatelských pinů. Další ladicí, obnovovací a PMIC signály jsou vedeny na testovací plošky na zadní straně desky.
Název pinu |
Reference |
Funkce |
|---|---|---|
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 kanál 4 (J1‑8) |
A1 |
1,8 V |
ADC2 kanál 2 (J1‑7) |
A2 |
1,8 V |
ADC3 kanál 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 |
připojte na GND (nebo stiskněte tlačítko na desce) pro reset desky |
LED_RED |
3,3 V |
červený kanál RGB LED (aktivní v nule) |
LED_GREEN |
3,3 V |
zelený kanál RGB LED (aktivní v nule) |
LED_BLUE |
3,3 V |
modrý kanál RGB LED (aktivní v nule) |
Poznámka
D0–D3 a SCLK/CIPO/COPI/CS jsou připojeny přes obousměrný převodník úrovní TXB0108 — tento obvod podporuje pouze push‑pull buzení GPIO, takže provoz se sběrnicí typu open‑drain (např. softwarově emulovaná 1‑Wire nebo I²C na těchto pinech) nebude fungovat.
SCL/SDA jsou připojeny přes samostatný převodník NTS0304, který podporuje jak push‑pull, tak open‑drain buzení, a proto tam I²C 1 funguje.
Oba převodníky jsou vztaženy k VDDIO_EXT (ve výchozím nastavení 3,3 V z PMIC na desce) a jejich budicí schopnost je oproti přímému GPIO omezena — jsou navrženy pro signálovou, nikoliv výkonovou zátěž.
Napájecí piny¶
Piny okrajových konektorů:
VIN (J2‑9) — hlavní systémová napájecí větev 3,6 – 5 V. PMIC zde odebírá svůj vstup.
VDDIO_EXT (J2‑7) — výstup napájecí větve převodníku úrovní, 1,8 V nebo 3,3 V (ve výchozím nastavení 3,3 V). Použijte jej k napájení externích 1,8V nebo 3,3V periferií připojených k pinům LPIO/SPI/I²C, aby pracovaly na stejné logické úrovni jako konektory.
VBAT (J3‑2) — vstup Li‑Po baterie. PMIC na desce nabíjí článek z VIN a hlásí stav nabití prostřednictvím měřiče stavu nabití.
NTC (J3‑1) — volitelný vstup termistoru Li‑Po.
GND (J2‑6) — společná zem.
NC (J2‑8) — nezapojeno.
Testovací plošky na zadní straně desky:
+3V3 — hlavní napájecí větev 3,3 V.
D_P / D_N — vysokorychlostní datový pár USB (za PHY).
USB i konektor ESLOV napájejí VIN přes dvojici ideálních diod LM66100 (jednu na každý zdroj), takže každý zdroj může napájet desku samostatně a oba se nikdy navzájem zpětně nenapájejí. Pokud externě přivedete napětí na VIN na J2‑9, má to přednost — diody jednoduše přestanou vést z USB / ESLOV, jakmile externí větev vystoupá výše.
Desku lze tedy napájet kteroukoliv z těchto cest:
Micro USB — 5 V do VIN přes ideální diodu na straně USB.
Konektor ESLOV — až 5 V na pinu
VESLOVkonektoru J5, vedených do VIN přes ideální diodu na straně ESLOV (viz Konektor ESLOV).Pin VIN (J2‑9) — přiveďte přímo regulovaný zdroj 3,6 – 5 V.
Li‑Po baterie — připojte k bateriovému konektoru J4 na zadní straně nebo k ploškám VBAT/GND/NTC na J3 / J2‑6. Nepřipojujte dvě baterie současně.
Konektor ESLOV¶
J5 na zadní straně desky je 5pinový konektor Molex ESLOV bez pájení:
Pin |
Název |
Funkce |
|---|---|---|
J5‑1 |
VESLOV |
napájecí vstup (≤ 5 V) — sloučený do |
J5‑2 |
INT |
vstup externího přerušení na |
J5‑3 |
SCL_EXT |
sdílený s ploškou J2 |
J5‑4 |
SDA_EXT |
sdílený s ploškou J2 |
J5‑5 |
GND |
společná zem |
SCL_EXT/SDA_EXT konektoru ESLOV a SCL/SDA konektoru J2 jsou stejné piny — jedna sběrnice I²C 1 vyvedená na dvou konektorech.
Tip
Pomocí odhadovače výdrže baterie můžete modelovat, jak dlouho Nicla Vision vydrží na baterii při daném pracovním cyklu aktivního / hlubokého spánku.
Piny pro obnovu a ladění¶
RESET — jak tlačítko na horní straně desky, tak ploška (J3‑4 / testovací ploška P5) připojená k lince NRST obvodu SoC. Připojte na GND pro reset.
Nicla Vision používá standardní dvojité ťuknutí na reset od Arduina pro vstup do bootloaderu Arduina — rychle dvakrát stiskněte tlačítko reset a deska se zaregistruje jako zařízení DFU. OpenMV IDE tento režim používá k přehrání firmwaru.
Signály STM32 SWD jsou vyvedeny na zadní straně desky přes řadu testovacích plošek mezi dvěma konektory J2. Připájejte do nich kolíkovou lištu s roztečí 2,54 mm (100 mil) pro připojení adaptéru ST‑LINK nebo J‑Link:
P1 / P2 — interní sběrnice I²C PMIC na PF0 (SDA) a PF1 (SCL). Na Nicla Vision je to
machine.I2C(2)a přenáší provoz PMIC, měřiče stavu nabití a ToF.P3 — TMS / SWDIO (PA13)
P4 — TCK / SWCLK (PA14)
P5 — NRST
P6 — TDO / SWO (PB3)
P7 — napájecí větev +1V8 (I/O napájení SoC — také správná reference pro ladicí adaptér).
P8 —
VOTP_PMIC— pouze pro tovární programování. Musí zůstat nezapojeno.
Všechny ladicí signály jsou vztaženy k 1,8 V — I/O okruh STM32H747 na této desce je napájen z větve +1V8. Před připojením nastavte svůj ladicí adaptér na logiku 1,8 V.
Vestavěné periferie¶
LED diody¶
Nicla Vision má jednu uživatelskou RGB LED, softwarově ovladatelnou prostřednictvím machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
Samostatná LED DL2 CHARGE na boku desky je zapojena přímo na výstup CHGB obvodu PMIC — svítí během nabíjení Li‑Po baterie z USB / ESLOV / VIN a není uživatelsky ovladatelná.
Senzor kamery¶
GC2145 je řízen prostřednictvím modulu csi — kamerové senzory
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()
Když si vyžádáte malou velikost snímku, ovladač GC2145 ořízne ze senzoru úměrně malé čtecí okno — ve výchozím nastavení je poměr zmenšení mezi čtením a výstupem omezen na 3x, aby se udržela vysoká snímková frekvence. csi.IOCTL_SET_FOV_WIDE zvyšuje tento limit na 5x, což znamená, že ovladač při streamování malých rozlišení čte z širší oblasti senzoru. Výsledkem je znatelně širší zorné pole při malých velikostech snímku, za cenu určité ztráty propustnosti:
cam.ioctl(csi.IOCTL_SET_FOV_WIDE, True)
cam.ioctl(csi.IOCTL_GET_FOV_WIDE) # returns the current setting
Jádro M4¶
Jádro Cortex‑M4 je vyvedeno prostřednictvím openamp pro meziprocesorovou komunikaci. Firmware OpenMV běží pouze na M7; M4 nemá vlastní běhové prostředí MicroPython, takže jeho použití znamená sestavit samostatný firmwarový obraz v jazyce C a načíst jej ze souborového systému přes openamp.RemoteProc. Předem sestavený ukázkový firmware implementující virtuální koncový bod UART je k dispozici v repozitáři openamp_vuart — postupujte podle jeho README a sestavte 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)
V praxi je nejlepší tuto podporu chápat jako ukázku rozhraní openamp spíše než jako fungující dvoujádrovou platformu — M4 nelze resetovat nezávisle na M7, takže zastavení M4 vynutí úplný restart systému.
Mikrofon¶
Vestavěný PDM mikrofon MP34DT06JTR je snímán prostřednictvím audio — Modul Audio přes periferii DFSDM obvodu STM32. Každý buffer přichází jako bytearray se signed 16bitovým PCM, připravený k předání do ulab/numpy pro DSP — například jednoduchý detektor hlasitosti:
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¶
Vestavěný akcelerometr + gyroskop LSM6DSOX je vyveden prostřednictvím imu — imu senzor
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 je zapojena na vyhrazenou interní sběrnici SPI (SPI5), takže nekoliduje s uživatelskou SPI4 vyvedenou na konektorech.
Dálkoměr time‑of‑flight¶
Vestavěný dálkoměr ST VL53L1CB typu time‑of‑flight je umístěn na interní sběrnici PMIC I²C (I²C 2). Použijte zabudovaný (frozen) ovladač vl53l1x — ovladač ToF senzoru vzdálenosti VL53L1X pro získání měření vzdálenosti až do ~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)
Měřič stavu nabití baterie¶
Měřič stavu nabití Maxim MAX17262 ModelGauge m5 sleduje napětí, proud, teplotu a stav nabití Li‑Po baterie. Nachází se na I²C 2 na adrese 0x36.
MAX17262 má interní snímání proudu, takže registr proudu se čte přímo v mikroampérech bez nutnosti aplikovat externí faktor Rsense. Čtení měřiče stavu nabití je neškodné — žádný ovladač není dodáván, ale registry zdokumentované v datasheetu MAX17262 lze číst přímo:
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 je se znaménkem v dvojkovém doplňku: kladný během nabíjení, záporný během vybíjení. TTE má význam pouze tehdy, když je proud záporný; TTF pouze tehdy, když je proud kladný.
Obvod správy napájení (PMIC)¶
PMIC NXP MC34PF1550A0EP obsluhuje každý regulátor na Nicla Vision — hlavní větev +3V3, větev +1V8 pro jádro / I/O SoC, VDDIO_EXT k převodníkům úrovní a nabíječku Li‑Po. Nachází se na I²C 2 na adrese 0x08.
Varování
Čtení registrů PMIC je v pořádku; zápis do nich je nebezpečný. Chybná konfigurace snižujícího regulátoru nebo nastavení nabíječky může trvale poškodit desku, baterii nebo obojí. S PMIC zacházejte jako s pouze pro čtení, pokud přesně nevíte, co děláte.
Nejužitečnější informace, kterou vám PMIC sdělí a měřič stavu nabití nikoliv, je stavový automat nabíječky — zda deska aktuálně běží na USB / ESLOV / VIN, v jaké fázi nabíjecího cyklu se Li‑Po nachází a zda je nabíječka v tepelné chybě nebo chybě watchdogu. Registry nabíječky se nacházejí na offsetu 0x80 v hlavním I²C adresním prostoru obvodu PF1550 (viz §22.2 datasheetu PF1550), takže například CHG_INT_OK na adrese nabíječky 0x04 se čte z registru 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)
Další registry pouze pro čtení, na které stojí za to se v datasheetu podívat (všechny na offsetu nabíječky 0x80): 0x80 CHG_INT (zachycená přerušení nabíječky — příznaky chyb), 0x86 VBUS_SNS (vícebitový stav VBUS včetně OVLO / UVLO / DPM) a 0x88 BATT_SNS (přítomnost baterie a stav nadproudu).
Wi‑Fi¶
Vestavěný modul Murata 1DX (CYW4343W) je vyveden prostřednictvím network — konfigurace sítě jako rozhraní stanice. Před spuštěním rádia připojte dodávanou anténu k konektoru U.FL na desce:
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¶
Stejný modul Murata 1DX rovněž vyvádí Bluetooth LE 5.1. Použijte aioble — Asynchronní BLE pro práci s BLE pohodlnou pro asyncio — například inzerujte jako periferie a čekejte na připojení centrálního zařízení:
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())
Reference sběrnic¶
GPIO¶
Použijte machine.Pin ke čtení nebo buzení kteréhokoliv z popsaných pinů. Výstupy jsou 3,3V CMOS (ve výchozím nastavení VDDIO_EXT) a převodníky úrovní omezují budicí schopnost na pin na několik miliampérů — jsou navrženy pro signálovou, nikoliv výkonovou zátěž.
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())
Kterýkoliv vstupní pin může také vyvolat přerušení při hranových přechodech:
def handler(pin):
print("triggered:", pin)
Pin("D1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Sběrnice |
TX |
RX |
|---|---|---|
UART4 |
SDA |
SCL |
from machine import UART
uart = UART(4, baudrate=115200)
uart.write("hello")
uart.read(5)
Poznámka
UART4 sdílí své piny s I²C 1 — stejné plošky SDA/SCL přenášejí obě sběrnice. Na těchto pinech zvolte buď UART, nebo I²C, ne obojí.
Popisek D1/D2 rovněž uvádí UART_TX/UART_RX, ale v tomto firmwaru jsou tyto piny vedeny na LPUART1, nikoliv na machine.UART. Samotné machine.UART(1) je vyhrazeno pro vestavěný řadič Bluetooth a není na konektorech přístupné.
I²C¶
Sběrnice |
SCL |
SDA |
|---|---|---|
I2C1 |
SCL |
SDA |
from machine import I2C
i2c = I2C(1, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Plošky SCL/SDA na J2 a piny SCL_EXT/SDA_EXT konektoru ESLOV ústí na stejnou sběrnici I²C 1 — pinout ESLOV viz Konektor ESLOV výše.
Stejný hardware lze také použít v cílovém režimu (slave) prostřednictvím machine.I2CTarget k vyvedení paměťové oblasti jinému I²C řadiči:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(1, addr=0x42, mem=buf)
SPI¶
Sběrnice |
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 vyvádí tři 12bitové ADC kanály na A0, A1 a A2. Všechny tři jsou vztaženy k 1,8 V — read_u16 vrací 0–65535 v rozsahu 0–1,8 V na pinu:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 1.8 / 65535
print(voltage)
time.sleep_ms(100)
Varování
ADC vstupy Nicla Vision jsou vztaženy k 1,8 V (a před SoC nemají žádný převodník úrovní). Přivedení 3,3V signálu nasytí převodník a může poškodit pin — vyšší napětí dělte externě.
PWM¶
Pin |
Časovač / kanál |
|---|---|
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 |
Buzte kterýkoliv z nich prostřednictvím machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D1"), freq=1_000, duty_u16=32768)
Poznámka
Několik pinů sdílí kanály TIM1:
TIM1 CH2 je na
D1iCS.TIM1 CH3 je na
D2iCIPO;SCLKvydává invertovaný doplněk (TIM1 CH3N) téhož kanálu.TIM1 CH4 je pouze na
COPI.
Na každý kanál časovače zvolte jen jednoho konzumenta. Piny čtveřice SPI (SCLK/CIPO/COPI/CS) také nelze budit PWM, dokud je používá machine.SPI(4).
Softwarově emulované sběrnice¶
machine.SoftI2C a machine.SoftSPI fungují na kterémkoliv GPIO, pokud potřebujete další sběrnici.
Tepelný senzor (mimo desku)¶
Firmware obsahuje ovladač fir — ovladač termálního senzoru (fir == far infrared, vzdálené infračervené záření) pro externě zapojené tepelné kamery:
MLX90621 — IR pole 16 × 4
MLX90640 — IR pole 32 × 24
MLX90641 — IR pole 16 × 12
AMG8833 — IR pole 8 × 8
Zapojte modul na sběrnici I²C desky a čtěte snímky pomocí 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())
Ovladač fir komunikuje se senzorem pouze přes I²C 1 — zapojte modul na popsané plošky SCL / SDA.
Časování¶
time¶
Modul time pokrývá blokující zpoždění, monotónní tiky a měření uplynulého času:
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)
Virtuální časovače¶
machine.Timer plánuje periodické nebo jednorázové callbacky bez obsazení hardwarového slotu časovače. Předejte -1 jako id pro použití virtuálního (softwarového) časovače:
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"))
Hodnoty periody jsou v milisekundách. Pro zastavení a uvolnění slotu zavolejte deinit().
Hodiny reálného času¶
machine.RTC udržuje skutečný čas napříč resety:
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 resetuje desku, pokud aplikace zamrzne. Jakmile je spuštěn, nelze jej zastavit ani překonfigurovat — pravidelně jej obsluhujte uvnitř hlavní smyčky:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informace o bootu a běhu¶
Aktualizace firmwaru (DFU)¶
Nicla Vision používá standardní dvojité ťuknutí na reset od Arduina pro vstup do bootloaderu Arduina. Rychle dvakrát stiskněte tlačítko reset — deska se znovu zaregistruje přes USB jako zařízení DFU a OpenMV IDE může nahrát nový firmwarový obraz.
Běžící skript může na vyžádání znovu vstoupit do bootloaderu zavoláním machine.bootloader()
import machine
machine.bootloader()
Souborový systém a pořadí bootování¶
Firmware Nicla Vision při bootu připojuje až dva souborové systémy:
Interní flash — vždy připojen v
/flash. Ve výchozím nastavení obsahujemain.pyaREADME.txt; vytvořen při úplně prvním bootu.ROMFS — souborový systém pouze pro čtení mapovaný do paměti v
/rom, automaticky připojený MicroPythonem při startu.
Po připojení je pracovní adresář nastaven na /flash. Interpret pak spouští skripty z tohoto adresáře:
boot.pyje spuštěn při každém softwarovém resetu (studený start,Ctrl‑Dz REPL nebo kdykoliv se běžící skript vrátí).main.pyje spuštěn pouze při studeném startu, ihned poboot.py. Následné softwarové resety znovu spustíboot.py, ale přejdou rovnou do REPL — pro opětovné spuštěnímain.pymusíte desku plně resetovat.
Výchozí main.py dodávaný na čerstvě nahrané desce pouze bliká modrým kanálem uživatelské RGB LED jako tlukot srdce (dva krátké pulzy, krátká mezera), takže poznáte, že firmware naběhl čistě, i bez připojeného hostitele.
sys.path je rozšířen o oba souborové systémy a jejich podadresáře lib/, takže importovatelné moduly mohou být v /flash/lib nebo /rom/lib.
Při připojení přes USB se /flash na hostiteli zaregistruje také jako USB úložiště typu mass‑storage, což vám umožní přímo upravovat boot.py, main.py a jakékoliv další soubory. Před resetem kamery jednotku vysuňte, aby hostitel vyprázdnil svůj zápisový buffer.
Poznámka
Protože OS s jednotkou zachází jako s pasivním blokovým zařízením, soubory vytvořené nebo upravené kódem běžícím na kameře se neobjeví, dokud hostitel jednotku znovu nepřipojí. Pokud OS i kamera zapisují do stejného souborového systému současně, vyhraje OS a přepíše změny provedené kamerou. Pro jakákoliv data, která skript zapisuje zpět, použijte SD kartu a před čtením těchto souborů z hostitele jednotku znovu připojte.
Poznámka
Červený kanál uživatelské RGB LED se může krátce rozsvítit, když hostitel čte z USB úložiště mass‑storage nebo do něj zapisuje — jde o indikátor aktivity řízený firmwarem, nikoliv o chybu.
Velikosti úložiště¶
Nicla Vision se dodává s:
/flash— souborový systém FAT o velikosti 11 MB, pro čtení i zápis./rom— 4 MB ROMFS pouze pro čtení mapovaný do paměti, používaný pro dodávání skriptů a ML modelů, které těží z přístupu mmap bez kopírování (zero‑copy).
Indikátor hard fault¶
Pokud uživatelská RGB LED rychle prochází všemi barvami — natolik rychle, že to spíše vypadá jako blikající bílá LED než jako rozlišitelné odstíny — firmware narazil na neodstranitelný hard fault. Pro obnovu přehrajte firmware; pokud přehrání nepomůže, deska může být fyzicky poškozena.
Softwarové knihovny¶
Úplný seznam modulů — včetně toho, které jsou unikátní pro sestavení Nicla Vision — najdete v indexu knihovny.