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í.

Arduino Nicla Vision

Ú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 (D0D3), tři 1,8V analogové vstupy (A0A2), pár SCL/SDA pro I²C a čtveřice SCLK/CIPO/COPI/CS pro 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

Pinout Arduino Nicla Vision

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

D0D3 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 VESLOV konektoru 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 VIN přes ideální diodu LM66100

J5‑2

INT

vstup externího přerušení na PD9

J5‑3

SCL_EXT

sdílený s ploškou J2 SCL — stejná sběrnice I²C 1 jako u uživatelského konektoru

J5‑4

SDA_EXT

sdílený s ploškou J2 SDA — stejná sběrnice I²C 1 jako u uživatelského konektoru

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

  • P8VOTP_PMICpouze 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 Vread_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 D1 i CS.

  • TIM1 CH3 je na D2 i CIPO; SCLK vydá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í obsahuje main.py a README.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.py je spuštěn při každém softwarovém resetu (studený start, Ctrl‑D z REPL nebo kdykoliv se běžící skript vrátí).

  • main.py je spuštěn pouze při studeném startu, ihned po boot.py. Následné softwarové resety znovu spustí boot.py, ale přejdou rovnou do REPL — pro opětovné spuštění main.py musí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.

  • /rom4 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.