Arduino Nicla Vision¶
Arduino Nicla Vision on 22,86 × 22,86 mm:n konenäkölevy, joka rakentuu STMicroelectronicsin STM32H747AII6:n ympärille — kaksiytiminen SoC, jossa yhdistyvät 400 MHz:n Cortex‑M7 ja 200 MHz:n Cortex‑M4. OpenMV-laiteohjelmisto toimii kokonaan M7-ytimellä. Levy yhdistää mikro-ohjaimeen GC2145 2 MP -värisensori (CMOS), LSM6DSOX 6-akselinen IMU, MP34DT06 MEMS-mikrofoni, VL53L1CB time‑of‑flight-etäisyysanturi, Wi‑Fi + Bluetooth LE 5.1 sekä akkulaturi / varauksen mittari.
Täydellinen datalehti, valokuvat ja mitat löytyvät Arduino Nicla Vision -tuotesivulta.
Kohokohdat¶
STMicroelectronics STM32H747AII6 kaksi ydintä, Cortex‑M7 (400 MHz) + Cortex‑M4 (200 MHz). OpenMV-laiteohjelmisto toimii vain M7-ytimellä.
2 MB sisäistä flash-muistia sekä 16 MB ulkoista QSPI-flash-muistia (käytetään sovellukseen + ROMFS:ään).
1 MB sisäistä SRAM-muistia.
Laitteistopohjainen JPEG-enkooderi/-dekooderi.
GC2145 2 MP:n CMOS-värisensori.
Sisäänrakennettu IMU (LSM6DSOX-kiihtyvyysanturi + gyroskooppi), MEMS-mikrofoni (MP34DT06JTR) ja VL53L1CB time‑of‑flight-etäisyysanturi (jopa ~4 m).
Wi‑Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 Murata 1DX (CYW4343W) -moduulin kautta — kytkeytyy mukana toimitettuun antenniin levyllä olevan U.FL-liittimen kautta.
Suurinopeuksinen USB (480 Mb/s) Micro USB -liitännän yli ulkoisen ULPI PHY:n (USB3320C) kautta.
13 käyttäjän I/O-nastaa Arduinon reunaliittimissä — neljä digitaalista LPIO:ta (
D0–D3), kolme 1,8 V:n analogiatuloa (A0–A2),SCL/SDAI²C-pari sekäSCLK/CIPO/COPI/CSSPI-nelikko.Akkutuki — Li‑Po-liitin takana, BQ-tyyppinen laturi sekä MAX17262-varauksen mittari sisäisen PMIC-väylän yli.
5-nastainen ESLOV-liitin takana juottamatonta I²C-laajennusta varten.
Varoitus
Käyttäjän digitaaliset nastat ovat oletuksena 3,3 V, mutta reititetään ohjelmoitavien tasonsiirtimien (VDDIO_EXT) kautta, jotka voidaan konfiguroida uudelleen 1,8 V:iin. Analogiset nastat (A0–A2) ovat vain 1,8 V — ne ohittavat tasonsiirtimet ja kytkeytyvät suoraan mikro-ohjaimeen. 3,3 V:n syöttäminen A0–A2:een vaurioittaa SoC:ia.
Nastajärjestys¶
Nastojen viitetiedot¶
Kolmetoista käyttäjän nastaa on tuotu esiin Arduinon reunaliittimissä (J1 ja J2). Lisäksi virheenjäljitys-, palautus- ja PMIC-signaalit on reititetty levyn takana oleviin testipisteisiin.
Nastan nimi |
Viite |
Toiminto |
|---|---|---|
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-kanava 4 (J1‑8) |
A1 |
1,8 V |
ADC2-kanava 2 (J1‑7) |
A2 |
1,8 V |
ADC3-kanava 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 |
vedä GND:hen (tai paina levyn kytkintä) nollataksesi levyn |
LED_RED |
3,3 V |
RGB-LEDin punainen kanava (aktiivinen alhaalla) |
LED_GREEN |
3,3 V |
RGB-LEDin vihreä kanava (aktiivinen alhaalla) |
LED_BLUE |
3,3 V |
RGB-LEDin sininen kanava (aktiivinen alhaalla) |
Muista
D0–D3 ja SCLK/CIPO/COPI/CS ovat TXB0108-kaksisuuntaisen tasonsiirtimen takana — tuo komponentti tukee vain push‑pull-tyyppistä GPIO-ohjausta, joten open‑drain-väyläliikenne (esim. bittiräpsytetty 1‑Wire tai I²C näillä nastoilla) ei toimi.
SCL/SDA ovat erillisen NTS0304-siirtimen takana, joka tukee sekä push‑pull- että open‑drain-ohjausta, minkä vuoksi I²C 1 toimii siinä.
Molemmat siirtimet on viitattu VDDIO_EXT:iin (oletuksena 3,3 V levyn PMIC:ltä), ja niiden ohjauskyky on rajoitettu suoraan GPIO:hon verrattuna — ne on suunniteltu signaalitason kuormille eikä tehokuormille.
Virtanastat¶
Reunaliittimen nastat:
VIN (J2‑9) — pääjärjestelmän 3,6 – 5 V:n virtakisko. PMIC ottaa tulonsa tästä.
VDDIO_EXT (J2‑7) — tasonsiirrinkiskon lähtö, 1,8 V tai 3,3 V (oletuksena 3,3 V). Käytä tätä syöttämään virtaa LPIO/SPI/I²C-nastoihin liitetyille ulkoisille 1,8 V:n tai 3,3 V:n oheislaitteille, jotta ne käyttävät samaa logiikkatasoa kuin liittimet.
VBAT (J3‑2) — Li‑Po-akun tulo. Levyn PMIC lataa kennon VIN:stä ja raportoi varaustilan varauksen mittarin kautta.
NTC (J3‑1) — valinnainen Li‑Po-termistorin tulo.
GND (J2‑6) — yhteinen maa.
NC (J2‑8) — ei kytkentää.
Testipisteet levyn takana:
+3V3 — pää-3,3 V:n virtakisko.
D_P / D_N — USB:n suurinopeuksinen datapari (PHY:n jälkeen).
USB ja ESLOV-liitin syöttävät molemmat VIN:iä parin LM66100-ideaalidiodin kautta (yksi per lähde), joten kumpi tahansa syöttö voi virrittää levyn yksinään eivätkä ne koskaan syötä takaisin toisiaan. Jos ohjaat VIN:iä ulkoisesti J2‑9:ssä, se menee etusijalle — diodit yksinkertaisesti lakkaavat johtamasta USB:stä / ESLOV:sta heti, kun ulkoinen kisko nousee korkeammalle.
Levyä voidaan siis virrittää minkä tahansa näistä reiteistä kautta:
Micro USB — 5 V VIN:iin USB-puolen ideaalidiodin kautta.
ESLOV-liitin — jopa 5 V J5:n
VESLOV-nastassa, reititettynä VIN:iin ESLOV-puolen ideaalidiodin kautta (katso ESLOV-liitin).VIN-nasta (J2‑9) — syötä säädelty 3,6 – 5 V:n virta suoraan.
Li‑Po-akku — kytke levyn takana olevaan J4-akkuliittimeen tai J3:n / J2‑6:n VBAT/GND/NTC-pisteisiin. Älä kytke kahta akkua samanaikaisesti.
ESLOV-liitin¶
J5 levyn takana on 5-nastainen Molexin juottamaton ESLOV-liitin:
Nasta |
Nimi |
Toiminto |
|---|---|---|
J5‑1 |
VESLOV |
virtatulo (≤ 5 V) — OR-yhdistetty |
J5‑2 |
INT |
ulkoinen keskeytystulo nastassa |
J5‑3 |
SCL_EXT |
jaettu J2:n |
J5‑4 |
SDA_EXT |
jaettu J2:n |
J5‑5 |
GND |
yhteinen maa |
ESLOV:n SCL_EXT/SDA_EXT ja J2:n SCL/SDA ovat samat nastat — yksi I²C 1 -väylä, joka on tuotu esiin kahdessa liittimessä.
Vihje
Käytä akun keston arviointityökalua mallintaaksesi, kuinka kauan Nicla Vision toimii akulla tietyllä aktiivi- / syväunijaksolla.
Palautus- ja virheenjäljitysnastat¶
RESET — sekä hetkellinen kytkin levyn päällä että piste (J3‑4 / testipiste P5), joka on kytketty SoC:n NRST-linjaan. Vedä GND:hen nollataksesi.
Nicla Vision käyttää Arduinon vakiomenetelmää kaksoispainallusnollausta päästäkseen Arduinon käynnistyslataimeen — paina nollauspainiketta nopeasti kahdesti, niin levy ilmestyy DFU-laitteena. OpenMV IDE käyttää tätä tilaa laiteohjelmiston uudelleenflashaukseen.
STM32:n SWD-signaalit on tuotu esiin levyn takana testipisterivin kautta kahden J2-liittimen välissä. Juota niihin 2,54 mm (100‑mil) -liitin kytkeäksesi ST‑LINK- tai J‑Link-sovittimen:
P1 / P2 — sisäinen PMIC-I²C-väylä nastoissa PF0 (SDA) ja PF1 (SCL). Tämä on
machine.I2C(2)Nicla Visionissa ja kuljettaa PMIC-, varauksen mittari- ja ToF-liikennettä.P3 — TMS / SWDIO (PA13)
P4 — TCK / SWCLK (PA14)
P5 — NRST
P6 — TDO / SWO (PB3)
P7 — +1V8-kisko (SoC:n I/O-syöttö — myös oikea viite virheenjäljityssovittimelle).
P8 —
VOTP_PMIC— vain tehdasohjelmointiin. On jätettävä kytkemättä.
Kaikki virheenjäljityssignaalit ovat 1,8 V:iin viitattuja — STM32H747:n I/O-rengas tällä levyllä toimii +1V8-kiskosta. Aseta virheenjäljityssovittimesi 1,8 V:n logiikalle ennen kytkemistä.
Sisäänrakennetut oheislaitteet¶
LEDit¶
Nicla Visionissa on yksi käyttäjän RGB-LED, joka on ohjelmistollisesti ohjattavissa machine.LED:n kautta:
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
Erillinen DL2 CHARGE -LED levyn sivulla on kytketty suoraan PMIC:n CHGB-lähtöön — se palaa, kun Li‑Po-akkua ladataan USB:stä / ESLOV:sta / VIN:stä, eikä se ole käyttäjän ohjattavissa.
Kamerasensori¶
GC2145:tä ohjataan csi — kennot -moduulin kautta:
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()
Kun pyydät pientä kehyskokoa, GC2145-ajuri rajaa suhteellisesti pienen lukualueen sensorista — oletuksena lukualueen ja lähdön välinen alasskaalaussuhde on rajoitettu 3-kertaiseksi kehysnopeuden pitämiseksi korkeana. csi.IOCTL_SET_FOV_WIDE nostaa tämän rajan 5-kertaiseksi, mikä tarkoittaa, että ajuri vetää laajemmalta sensorin alueelta suoratoistaessaan pieniä resoluutioita. Tuloksena on huomattavasti laajempi näkökenttä pienillä kehyskoilla, hieman läpäisykyvyn kustannuksella:
cam.ioctl(csi.IOCTL_SET_FOV_WIDE, True)
cam.ioctl(csi.IOCTL_GET_FOV_WIDE) # returns the current setting
M4-ydin¶
Cortex‑M4-ydin on tuotu esiin openamp:n kautta prosessorien välistä viestintää varten. OpenMV-laiteohjelmisto toimii vain M7:llä; M4:llä ei ole omaa MicroPython-ajoympäristöä, joten sen käyttäminen tarkoittaa erillisen C-laiteohjelmistovedoksen kääntämistä ja sen lataamista tiedostojärjestelmästä openamp.RemoteProc:n kautta. Valmiiksi käännetty esimerkkilaiteohjelmisto, joka toteuttaa virtuaalisen UART-päätepisteen, on saatavilla openamp_vuart -repositoriossa — seuraa sen README-ohjeita kääntääksesi 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)
Käytännössä tätä tukea kannattaa pitää pikemminkin openamp-rajapinnan esittelynä kuin toimivana kaksiytimisenä alustana — M4:ää ei voi nollata M7:stä riippumatta, joten M4:n pysäyttäminen pakottaa koko järjestelmän uudelleenkäynnistyksen.
Mikrofoni¶
Levyllä oleva MP34DT06JTR PDM -mikrofoni kaapataan audio — Audio-moduuli:n kautta STM32:n DFSDM-oheislaitteen yli. Jokainen puskuri saapuu etumerkillisenä 16-bittisenä PCM bytearray:nä, valmiina syötettäväksi ulab/numpy:hin DSP:tä varten — esimerkiksi yksinkertainen äänenvoimakkuuden tunnistin:
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¶
Levyllä oleva LSM6DSOX-kiihtyvyysanturi + gyroskooppi on tuotu esiin imu — imu-sensori:n kautta:
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 on kytketty omaan sisäiseen SPI-väyläänsä (SPI5), joten se ei kilpaile liittimiin tuodun käyttäjän SPI4:n kanssa.
Time‑of‑flight-etäisyysanturi¶
Levyllä oleva ST VL53L1CB time‑of‑flight-etäisyysanturi sijaitsee sisäisellä PMIC-I²C-väylällä (I²C 2). Käytä jäädytettyä vl53l1x — VL53L1X ToF-etäisyyssensorin ajuri -ajuria saadaksesi etäisyyslukemia jopa ~4 m:iin asti:
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)
Akun varauksen mittari¶
Maximin MAX17262 ModelGauge m5 -varauksen mittari seuraa Li‑Po-akun jännitettä, virtaa, lämpötilaa ja varaustilaa. Se sijaitsee I²C 2:lla osoitteessa 0x36.
MAX17262:ssa on sisäinen virranmittaus, joten virtarekisteri lukee suoraan mikroampeereina ilman ulkoista Rsense-kerrointa. Varauksen mittarin lukeminen on vaaratonta — ajuria ei toimiteta mukana, mutta MAX17262-datalehdessä dokumentoidut rekisterit voidaan lukea suoraan:
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 on etumerkillinen kahden komplementti: positiivinen ladattaessa, negatiivinen purettaessa. TTE on merkityksellinen vain virran ollessa negatiivinen; TTF vain virran ollessa positiivinen.
Tehonhallintapiiri¶
NXP:n MC34PF1550A0EP PMIC hoitaa kaikki Nicla Visionin säätimet — pää-+3V3-kiskon, +1V8 SoC-ydin- / I/O-kiskon, VDDIO_EXT:n tasonsiirtimiin sekä Li‑Po-laturin. Se sijaitsee I²C 2:lla osoitteessa 0x08.
Varoitus
PMIC-rekisterien lukeminen on turvallista; niihin kirjoittaminen on vaarallista. Buck-säätimen tai laturin asetuksen virheellinen konfigurointi voi vaurioittaa pysyvästi levyä, akkua tai molempia. Käsittele PMIC:tä vain luku -tyyppisenä, ellet tiedä tarkalleen mitä teet.
Hyödyllisin asia, jonka PMIC kertoo ja jota varauksen mittari ei pysty kertomaan, on laturin tilakone — toimiiko levy parhaillaan USB:llä / ESLOV:lla / VIN:llä, missä latausjakson vaiheessa Li‑Po on, ja onko laturi lämpö- tai vahtikoiravirheessä. Laturin rekisterit sijaitsevat 0x80:n siirtymällä PF1550:n pää-I²C-osoiteavaruudessa (katso PF1550-datalehden §22.2), joten esimerkiksi CHG_INT_OK laturin osoitteessa 0x04 luetaan PMIC-rekisteristä 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)
Muita datalehdessä silmäilemisen arvoisia vain luku -rekistereitä (kaikki laturin siirtymällä 0x80): 0x80 CHG_INT (lukitut laturin keskeytykset — virhelippuja), 0x86 VBUS_SNS (monibittinen VBUS-tila mukaan lukien OVLO / UVLO / DPM) ja 0x88 BATT_SNS (akun läsnäolo ja ylivirtatila).
Wi‑Fi¶
Levyllä oleva Murata 1DX (CYW4343W) on tuotu esiin network — verkkomääritykset:n kautta asemarajapintana. Kytke mukana toimitettu antenni levyllä olevaan U.FL-liittimeen ennen radion käynnistämistä:
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¶
Sama Murata 1DX tuo esiin myös Bluetooth LE 5.1:n. Käytä aioble — Asynkroninen BLE:a asyncio-ystävälliseen BLE:hen — esimerkiksi mainosta oheislaitteena ja odota keskuslaitteen yhdistymistä:
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())
Väyläviite¶
GPIO¶
Käytä machine.Pin:iä lukeaksesi tai ohjataksesi mitä tahansa silkkipainettua nastaa. Lähdöt ovat 3,3 V:n CMOS-tasoa (oletuksena VDDIO_EXT), ja tasonsiirtimet rajoittavat nastakohtaisen ohjauskyvyn muutamaan milliampeeriin — ne on suunniteltu signaalitason kuormille eikä tehokuormille.
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())
Mikä tahansa tulonasta voi myös laukaista keskeytyksen reunasiirtymillä:
def handler(pin):
print("triggered:", pin)
Pin("D1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Väylä |
TX |
RX |
|---|---|---|
UART4 |
SDA |
SCL |
from machine import UART
uart = UART(4, baudrate=115200)
uart.write("hello")
uart.read(5)
Muista
UART4 jakaa nastansa I²C 1:n kanssa — samat SDA/SCL-pisteet kuljettavat molempia väyliä. Valitse UART tai I²C, ei molempia, näillä nastoilla.
D1/D2-silkkipainatuksessa lukee myös UART_TX/UART_RX, mutta tällä laiteohjelmistolla nuo nastat on reititetty LPUART1:een eikä machine.UART:iin. machine.UART(1) itse on varattu piirin sisäiselle Bluetooth-ohjaimelle, eikä se ole käytettävissä liittimissä.
I²C¶
Väylä |
SCL |
SDA |
|---|---|---|
I2C1 |
SCL |
SDA |
from machine import I2C
i2c = I2C(1, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
J2:n SCL/SDA-pisteet ja ESLOV-liittimen SCL_EXT/SDA_EXT-nastat osuvat samalle I²C 1 -väylälle — katso ESLOV-nastajärjestys yltä ESLOV-liitin.
Samaa laitteistoa voidaan käyttää myös kohdetilassa (orjana) machine.I2CTarget:n kautta paljastaaksesi muistialueen toiselle I²C-ohjaimelle:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(1, addr=0x42, mem=buf)
SPI¶
Väylä |
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 tuo esiin kolme 12-bittistä ADC-kanavaa nastoissa A0, A1 ja A2. Kaikki kolme ovat 1,8 V:iin viitattuja — read_u16 palauttaa arvon 0–65535 alueella 0–1,8 V nastassa:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 1.8 / 65535
print(voltage)
time.sleep_ms(100)
Varoitus
Nicla Visionin ADC-tulot ovat 1,8 V:iin viitattuja (eikä niissä ole tasonsiirrintä SoC:n edessä). 3,3 V:n signaalin syöttäminen kyllästää muuntimen ja voi vaurioittaa nastaa — jaa korkeammat jännitteet alaspäin ulkoisesti.
PWM¶
Nasta |
Ajastin / kanava |
|---|---|
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 |
Ohjaa mitä tahansa niistä machine.PWM:n kautta:
from machine import Pin, PWM
pwm = PWM(Pin("D1"), freq=1_000, duty_u16=32768)
Muista
Useat nastat jakavat TIM1-kanavia:
TIM1 CH2 on nastoissa
D1jaCS.TIM1 CH3 on nastoissa
D2jaCIPO;SCLKlähettää saman kanavan käännetyn komplementin (TIM1 CH3N).TIM1 CH4 on yksin nastassa
COPI.
Valitse yksi kuluttaja per ajastinkanava. SPI-nelikon nastoja (SCLK/CIPO/COPI/CS) ei myöskään voi PWM-ohjata, kun machine.SPI(4) käyttää niitä.
Ohjelmistolla bittiräpsytetyt väylät¶
machine.SoftI2C ja machine.SoftSPI toimivat millä tahansa GPIO:lla, jos tarvitset ylimääräisen väylän.
Lämpösensori (levyn ulkopuolinen)¶
Laiteohjelmisto sisältää fir — lämpösensorin ajuri (fir == far infrared) -ajurin ulkoisesti kytketyille lämpökuvantajille:
MLX90621 — 16 × 4 IR-matriisi
MLX90640 — 32 × 24 IR-matriisi
MLX90641 — 16 × 12 IR-matriisi
AMG8833 — 8 × 8 IR-matriisi
Kytke moduuli levyn I²C-väylään ja lue kehyksiä komennoilla 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())
fir-ajuri kommunikoi sensorin kanssa vain I²C 1:n yli — kytke moduuli silkkipainettuihin SCL / SDA -pisteisiin.
Ajoitus¶
time¶
time-moduuli kattaa estävät viiveet, monotoniset tikit ja kuluneen ajan mittaamisen:
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)
Virtuaaliset ajastimet¶
machine.Timer ajoittaa jaksollisia tai kertaluonteisia takaisinkutsuja kuluttamatta laitteistoajastinpaikkaa. Anna -1 id:nä käyttääksesi virtuaalista (ohjelmistollista) ajastinta:
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"))
Jaksoarvot ovat millisekunteina. Kutsu deinit() pysäyttääksesi ja vapauttaaksesi paikan.
Reaaliaikakello¶
machine.RTC säilyttää seinäkellonajan nollausten yli:
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())
Vahtikoira¶
machine.WDT nollaa levyn, jos sovellus jumiutuu. Kun se on käynnistetty, sitä ei voi pysäyttää eikä konfiguroida uudelleen — syötä sitä säännöllisesti pääsilmukassasi:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Käynnistys- ja ajonaikaiset tiedot¶
Laiteohjelmiston päivitys (DFU)¶
Nicla Vision käyttää Arduinon vakiomenetelmää kaksoispainallusnollausta päästäkseen Arduinon käynnistyslataimeen. Paina nollauspainiketta nopeasti kahdesti — levy ilmestyy uudelleen USB:n yli DFU-laitteena ja OpenMV IDE voi flashata uuden laiteohjelmistovedoksen.
Käynnissä oleva skripti voi siirtyä uudelleen käynnistyslataimeen pyydettäessä kutsumalla machine.bootloader()
import machine
machine.bootloader()
Tiedostojärjestelmä ja käynnistysjärjestys¶
Nicla Visionin laiteohjelmisto liittää käynnistyksessä enintään kaksi tiedostojärjestelmää:
Sisäinen flash-muisti — aina liitettynä polkuun
/flash. Sisältää oletuksena tiedostotmain.pyjaREADME.txt; luodaan aivan ensimmäisellä käynnistyksellä.ROMFS — vain luku -tyyppinen, muistiin kartoitettu tiedostojärjestelmä polussa
/rom, jonka MicroPython liittää automaattisesti käynnistyksen yhteydessä.
Liittämisen jälkeen työhakemistoksi asetetaan /flash. Tulkki suorittaa sitten skriptejä tästä hakemistosta:
boot.pysuoritetaan jokaisella pehmeällä nollauksella (kylmäkäynnistys,Ctrl‑DREPL:stä tai aina kun käynnissä oleva skripti palaa).main.pysuoritetaan vain kylmäkäynnistyksellä, hetiboot.py:n jälkeen. Myöhemmät pehmeät nollaukset suorittavatboot.py:n uudelleen mutta siirtyvät suoraan REPL:iin — suorittaaksesimain.py:n uudelleen sinun on nollattava levy täysin.
Tuoreesti flashatulla levyllä toimitettu oletus-main.py vain vilkuttaa käyttäjän RGB-LEDin sinistä kanavaa sydämenlyöntinä (kaksi lyhyttä pulssia, lyhyt tauko), jotta tiedät laiteohjelmiston käynnistyneen siististi ilman mitään isäntään kytkettynä.
sys.path:ia laajennetaan kattamaan molemmat tiedostojärjestelmät ja niiden lib/-alihakemistot, joten tuotavat moduulit voivat sijaita poluissa /flash/lib tai /rom/lib.
Kun USB:n yli on kytketty, /flash ilmestyy isännässä myös USB-massamuistiasemana, jolloin voit muokata tiedostoja boot.py, main.py ja mitä tahansa muita tiedostoja suoraan. Poista asema turvallisesti ennen kameran nollaamista, jotta isäntä tyhjentää välimuistissa olevat kirjoitukset.
Muista
Koska käyttöjärjestelmä käsittelee asemaa passiivisena lohkolaitteena, kameralla suoritettavan koodin luomat tai muokkaamat tiedostot eivät näy ennen kuin isäntä liittää aseman uudelleen. Jos sekä käyttöjärjestelmä että kamera kirjoittavat samaan tiedostojärjestelmään yhtä aikaa, käyttöjärjestelmä voittaa ja ylikirjoittaa kameran tekemät muutokset. Käytä SD-korttia kaikelle datalle, jonka skripti kirjoittaa takaisin, ja liitä uudelleen ennen kuin luet noita tiedostoja isännästä.
Muista
Käyttäjän RGB-LEDin punainen kanava saattaa lyhyesti syttyä, kun isäntä lukee USB-massamuistiasemasta tai kirjoittaa siihen — tämä on laiteohjelmiston ohjaama toimintailmaisin, ei vika.
Tallennuskoot¶
Nicla Vision toimitetaan seuraavin tallennustiloin:
/flash— 11 MB FAT-tiedostojärjestelmä, luku/kirjoitus./rom— 4 MB vain luku -tyyppinen muistiin kartoitettu ROMFS, jota käytetään skriptien ja ML-mallien toimittamiseen, jotka hyötyvät nollakopioivasta mmap-käytöstä.
Vakavan virheen ilmaisin¶
Jos käyttäjän RGB-LED syklaa nopeasti kaikkien värien läpi — niin nopeasti, että se näyttää pikemminkin tuikkivalta valkoiselta LEDiltä kuin erillisiltä sävyiltä — laiteohjelmisto on osunut palautumattomaan vakavaan virheeseen. Flashaa laiteohjelmisto uudelleen palautuaksesi; jos uudelleenflashaus ei auta, levy saattaa olla fyysisesti vaurioitunut.
Ohjelmistokirjastot¶
Katso täydellinen lista moduuleista kirjastohakemistosta — mukaan lukien mitkä niistä ovat ainutlaatuisia Nicla Vision -käännökselle.