Arduino Nano 33 BLE Sense¶
Varování
Tato deska již není podporována. Posledním vydáním OpenMV firmware pro Arduino Nano 33 BLE Sense je verze 4.7.0. Pro tento cíl nebudou vydávány žádné další aktualizace firmware, opravy chyb ani nové funkce. Informace níže jsou zachovány pro uživatele provozující verzi 4.7.0 nebo starší.
Arduino Nano 33 BLE Sense je deska o rozměrech 45 × 18 mm ve formátu Arduino‑Nano postavená kolem čipu Nordic Semiconductor nRF52840 — jediného jádra ARM Cortex‑M4 s FPU běžícího na 64 MHz s 256 KB interní SRAM a 1 MB interní flash paměti. BLE zajišťuje rádio integrované na čipu a deska nese 9‑osý IMU, barometr LPS22HB, senzor teploty / vlhkosti HTS221 / HS3003, senzor okolního světla / barvy / přiblížení / gest APDS9960 a PDM mikrofon MP34DT05. OpenMV firmware ovládá všechny tyto prvky z prostředí MicroPython.
Kompletní datasheet, fotografie a rozměry najdete na produktové stránce Arduino Nano 33 BLE Rev2.
Hlavní vlastnosti¶
Nordic nRF52840 Cortex‑M4 s FPU na 64 MHz s 256 KB interní SRAM a 1 MB interní flash pamětí.
Bluetooth LE 5.0 prostřednictvím rádia integrovaného na čipu a Nordic SoftDevice s140.
9‑osý IMU —
LSM9DS1na Rev 1,BMI270+BMM150na Rev 2. Zamrzlý ovladačimupři startu detekuje oba.Barometr
LPS22HB, senzor teploty a vlhkostiHTS221/HS3003, senzor okolního světla / barvy / přiblížení / gestAPDS9960a PDM mikrofon MP34DT05.Konektor Micro USB pro napájení, programování a CDC REPL.
22 uživatelských I/O pinů na standardních konektorech Nano —
TX/RX,D2–D13(digitální),A0–A7(analogové).
Rozložení pinů¶
Referenční přehled pinů¶
Název pinu |
Reference |
Funkce |
|---|---|---|
TX |
3,3 V |
UART1 TX |
RX |
3,3 V |
UART1 RX |
D2 |
3,3 V |
PWM |
D3 |
3,3 V |
PWM |
D4 |
3,3 V |
PWM |
D5 |
3,3 V |
PWM |
D6 |
3,3 V |
PWM |
D7 |
3,3 V |
PWM |
D8 |
3,3 V |
PWM |
D9 |
3,3 V |
PWM |
D10 |
3,3 V |
PWM |
D11 |
3,3 V |
PWM / SPI0 MOSI |
D12 |
3,3 V |
PWM / SPI0 MISO |
D13 |
3,3 V |
PWM / SPI0 SCK |
A0 |
3,3 V |
ADC / PWM |
A1 |
3,3 V |
ADC / PWM |
A2 |
3,3 V |
ADC / PWM |
A3 |
3,3 V |
ADC / PWM |
A4 / I2C_SDA |
3,3 V |
ADC / PWM / I2C0 SDA |
A5 / I2C_SCL |
3,3 V |
ADC / PWM / I2C0 SCL |
A6 |
3,3 V |
ADC / PWM |
A7 |
3,3 V |
ADC / PWM |
RESET |
3,3 V |
stiskněte tlačítko RESET na desce nebo stáhněte na GND pro reset |
LED_BUILTIN |
— |
Oranžová uživatelská LED na |
LED_RED |
— |
Červený kanál RGB LED (aktivní v nule) |
LED_GREEN |
— |
Zelený kanál RGB LED (aktivní v nule) |
LED_BLUE |
— |
Modrý kanál RGB LED (aktivní v nule) |
Varování
I/O piny desky Nano 33 BLE Sense jsou pouze 3,3 V — nejsou tolerantní k 5 V. Přivedení 5 V na ně poškodí čip nRF52840.
Napájecí piny¶
VIN — vstup 4,5 – 21 V. Napájí desku přes regulátor na desce. Je rovněž napájen přes diodu z 5 V větve USB, takže USB i
VINmohou být přítomny současně, aniž by se vzájemně zpětně napájely.+5V — ve výchozím stavu nezapojeno.
+3V3 — výstup 3,3 V regulátoru.
AREF — pin analogové reference. Na této desce není zapojen do nRF52840 — ADC je vždy vztažen k 3,3 V.
GND — společná zem.
Nano 33 BLE Sense lze napájet kteroukoli z cest:
Micro USB — dodává 5 V do regulátoru na desce.
Pin VIN — přiveďte regulovaný zdroj 4,5 – 21 V.
Poznámka
Pájecí propojka na spodní straně desky označená VUSB propojuje +5V s 5 V větví USB. Uzavřete ji, aby pin konektoru +5V skutečně vedl 5 V.
Poznámka
Standardně uzavřenou pájecí propojku na výstupu spínaného regulátoru 4,5–21 V na desce lze přerušit a regulátor tak vypnout, takže desku lze napájet přímo z externího 3,3 V zdroje na +3V3.
Piny pro obnovu a ladění¶
RESET — jak vyvedená ploška, tak tlačítko RESET (momentové) na horní straně desky, propojené s resetovací linkou nRF52840. Stáhněte na GND nebo stiskněte tlačítko pro reset.
Nano 33 BLE Sense používá standardní Arduino dvojí stisk reset pro vstup do bootloaderu Arduino. Rychle stiskněte tlačítko RESET dvakrát — deska vstoupí do režimu bootloaderu a OpenMV IDE může nahrát nový obraz firmware.
SWD signály čipu nRF52840 jsou vyvedeny na pokovené plošky na zadní straně desky. Všechny ladicí signály jsou vztaženy k 3,3 V.
Periferie na desce¶
LED diody¶
Nano 33 BLE Sense má uživatelskou RGB LED — ovládanou přes potištěné kanály LED_RED, LED_GREEN a LED_BLUE — plus samostatnou oranžovou LED_BUILTIN na D13. Všechny čtyři jsou softwarově ovladatelné přes machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
LED("LED_BUILTIN").on()
Samostatná zelená napájecí LED na desce svítí vždy, když je 3,3 V větev aktivní, a není uživatelsky ovladatelná.
Kamerový senzor¶
OpenMV firmware na Nano 33 BLE Sense podporuje paralelní CMOS senzor OmniVision OV7670. Deska nemá vlastní obrazový senzor — zapojte modul OV7670 k potištěným pinům konektoru uvedeným níže a ovládejte jej přes modul 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()
Poznámka
OV7670 zabírá 14 pinů. Firmware je zapojuje následovně:
Signál senzoru |
Pin Nano 33 BLE Sense |
|---|---|
D0 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
Řídicí I²C sběrnice OV7670 je tatáž externí I²C 0 vyvedená na A5/A4. Senzor sídlí na 7‑bitové adrese 0x21 — uživatelská zařízení na této sběrnici se musí této adrese vyhnout, pokud je kamera zapojena.
IMU¶
9‑osý IMU je vyveden přes zamrzlý modul imu, který automaticky detekuje, zda má deska LSM9DS1 (Rev 1) nebo BMI270 + BMM150 (Rev 2), a poskytuje jednotnou třídu imu.IMU. Senzory sídlí na interní sběrnici I²C 1 (P14 / P15):
import time
from machine import I2C, Pin
from imu import IMU
bus = I2C(1, scl=Pin("P15"), sda=Pin("P14"))
sensor = IMU(bus)
while True:
print(sensor.accel()) # (x, y, z) in g
print(sensor.gyro()) # (x, y, z) in deg/s
print(sensor.magnet()) # (x, y, z) magnetometer
time.sleep_ms(100)
Pro přímý přístup k funkcím jako detekce poklepání nebo FIFO importujte odpovídající zamrzlý ovladač (lsm9ds1, bmi270 nebo bmm150) a vytvořte jeho instanci na téže sběrnici.
Senzory prostředí¶
Barometr (LPS22HB) a senzor teploty / vlhkosti (HTS221 na Rev 1, HS3003 na Rev 2) sdílejí stejnou interní sběrnici I²C 1 jako IMU:
import time
from machine import I2C, Pin
from lps22h import LPS22H
from hts221 import HTS221
bus = I2C(1, scl=Pin("P15"), sda=Pin("P14"))
lps = LPS22H(bus)
try:
hts = HTS221(bus)
except OSError:
from hs3003 import HS3003
hts = HS3003(bus)
while True:
print("pressure: %.2f hPa" % lps.pressure())
print("temperature: %.2f C" % lps.temperature())
print("humidity: %.2f %%" % hts.humidity())
time.sleep_ms(500)
Světlo / barva / přiblížení / gesta¶
Senzor Broadcom APDS9960 sídlí na téže interní sběrnici I²C 1 a poskytuje snímání okolního světla, RGB barvy, přiblížení a gest:
import time
from machine import I2C, Pin
from apds9960 import uAPDS9960 as APDS9960
bus = I2C(1, scl=Pin("P15"), sda=Pin("P14"))
apds = APDS9960(bus)
apds.enableLightSensor()
while True:
print("ambient light:", apds.readAmbientLight())
time.sleep_ms(250)
Mikrofon¶
PDM mikrofon MP34DT05 na desce se snímá přes audio — Modul Audio. Každý buffer přichází jako 16bitové PCM se znaménkem jako bytearray, připravené ke zpracování v ulab/numpy pro DSP:
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
Bluetooth¶
Bluetooth LE 5.0 rádio čipu nRF52840 běží na Nordic SoftDevice s140 a je vyvedeno přes starší modul ubluepy — moderní API bluetooth / aioble — Asynchronní BLE nejsou v tomto sestavení povolena. K dispozici jsou obě role: peripheral (GATT server, advertise) i central (GAP observer / scanner + připojení).
Inzerujte se jako peripheral s jedinou službou Environmental Sensing a oznamovatelnou teplotní charakteristikou — callback event_handler se spustí při připojení, odpojení a zápisech CCCD:
from ubluepy import Service, Characteristic, UUID, Peripheral, constants
from machine import LED
def event_handler(event_id, handle, data):
if event_id == constants.EVT_GAP_CONNECTED:
LED("LED_GREEN").on()
elif event_id == constants.EVT_GAP_DISCONNECTED:
LED("LED_GREEN").off()
periph.advertise(device_name="Nano 33", services=[svc])
svc = Service(UUID("181A")) # Environmental Sensing
char = Characteristic(UUID("2A6E"), # Temperature
props=Characteristic.PROP_NOTIFY | Characteristic.PROP_READ,
attrs=Characteristic.ATTR_CCCD)
svc.addCharacteristic(char)
periph = Peripheral()
periph.addService(svc)
periph.setConnectionHandler(event_handler)
periph.advertise(device_name="Nano 33", services=[svc])
Vyhledávejte okolní inzerující zařízení v roli central:
from ubluepy import Scanner
for entry in Scanner().scan(1_000): # 1 second window
print(entry.addr(), entry.rssi(), "dBm")
Kompletní API najdete v referenci ubluepy — UUID, Service, Characteristic, Peripheral, Scanner, ScanEntry a jmenný prostor constants.
Referenční přehled sběrnic¶
GPIO¶
Pro čtení nebo ovládání kteréhokoli z potištěných pinů použijte machine.Pin. Výstupy jsou 3,3 V CMOS — 15 mA na pin, 25 mA celkem přes všechny GPIO.
from machine import Pin
out = Pin("D2", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("D3", Pin.IN, Pin.PULL_UP)
print(inp.value())
Kterýkoli vstupní pin může také spustit přerušení při přechodu hrany:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Sběrnice |
TX |
RX |
|---|---|---|
UART1 |
TX |
RX |
Použijte potištěné názvy TX/RX se třídou machine.UART
from machine import UART
uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
Sběrnice |
SDA |
SCL |
|---|---|---|
I2C0 |
|
|
I2C1 |
|
|
Obě sběrnice potřebují své piny předané explicitně třídě machine.I2C
from machine import I2C, Pin
bus0 = I2C(0, scl=Pin("I2C_SCL"), sda=Pin("I2C_SDA"), freq=400_000)
bus0.scan()
bus1 = I2C(1, scl=Pin("P15"), sda=Pin("P14"), freq=400_000)
bus1.scan()
Poznámka
Sběrnice 1 je interní senzorová sběrnice na P14/P15 (nikoli na uživatelských konektorech) — obsluhuje IMU, barometr, senzor prostředí a APDS9960. Zamrzlé ovladače senzorů ji používají přímo; uživatelský kód ji může také prohledat, ale adresy jsou již obsazeny senzory na desce.
SPI¶
Sběrnice |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI0 |
D11 |
D12 |
D13 |
D10 |
Linku CS neřídí periferie SPI — nakonfigurujte D10 jako výstup a přepínejte jej ručně kolem přenosu:
from machine import SPI, Pin
spi = SPI(0, baudrate=10_000_000)
cs = Pin("D10", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
Poznámka
D13 slouží zároveň jako oranžová LED_BUILTIN — řízení SPI na této sběrnici bude blikat LED v rytmu hodin sběrnice.
ADC¶
Čip nRF52840 má osm 12bitových ADC kanálů (SAADC) vyvedených na A0–A7, všechny vztažené k 3,3 V — read_u16 vrací 0–65535 v rozsahu 0–3,3 V na pinu. Pin AREF desky není zapojen, takže reference je vždy 3,3 V:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 3.3 / 65535
print(voltage)
time.sleep_ms(100)
PWM¶
Čip nRF52840 vyvádí čtyři PWM periferie (PWM0–PWM3), z nichž každá řídí čtyři kanály, tedy celkem 16 hardwarových PWM slotů. Na rozdíl od portů s pevnou funkcí se periferie směrují přes matici GPIOTE — jakýkoli GPIO může být PWM výstupem, takže neexistuje žádné mapování pinů na řezy. Cenou za tuto flexibilitu jsou dvě omezení zabudovaná v křemíku:
Všechny čtyři kanály uvnitř jednoho modulu sdílejí jedinou periodu/frekvenci.
Každý kanál má vlastní střídu a polaritu.
Koncepčně vypadá 16 slotů takto:
Modul |
Kanál 0 |
Kanál 1 |
Kanál 2 |
Kanál 3 |
|---|---|---|---|---|
PWM0 |
střída |
střída |
střída |
střída |
PWM1 |
střída |
střída |
střída |
střída |
PWM2 |
střída |
střída |
střída |
střída |
PWM3 |
střída |
střída |
střída |
střída |
Každý řádek běží na jedné frekvenci; čtyři buňky v řádku každá řídí nezávisle zvolený pin s vlastní střídou. Různé řádky mohou běžet na zcela odlišných frekvencích.
Řiďte kterýkoli potištěný pin (nebo LED na desce) přes machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D3"), freq=1_000, duty_u16=32768)
Varování
Automatická alokace spotřebuje celý modul na jedno volání. Když vytvoříte PWM bez kwargs device=/channel=, ovladač zabere první volný modul a naváže váš pin pouze na jeho kanál 0. Zbývající tři kanály toho modulu zůstanou nečinné a jsou dosažitelné pouze přes explicitní device=/channel=. To omezuje samostatná volání PWM(Pin(...)) na čtyři, než ovladač vyvolá ValueError: all PWM devices in use — přestože dvanáct slotů je technicky stále volných.
Pro použití více než čtyř PWM, nebo pro záměrné sdílení frekvence mezi piny, předejte device (0–3) a channel (0–3):
# Two PWMs on the same module → forced to share frequency,
# but each gets its own duty cycle.
pwm_a = PWM(Pin("D3"), device=0, channel=0,
freq=1_000, duty_u16=32768)
pwm_b = PWM(Pin("D5"), device=0, channel=1,
freq=1_000, duty_u16=16384)
# A third PWM on a separate module, free to pick any frequency.
pwm_c = PWM(Pin("D6"), device=1, channel=0,
freq=20_000, duty_u16=49152)
Střída přijímá duty (0–100 %), duty_u16 (0–65535) nebo duty_ns. Přidejte invert=1 pro obrácení polarity výstupu (užitečné pro RGB LED aktivní v nule).
Poznámka
Protože frekvence je vlastnost na úrovni modulu, volání pwm.freq(new_freq) na kterémkoli kanálu modulu znovu spustí nrfx_pwm_init pro celý modul a změní frekvenci, kterou vidí každý další kanál, jenž jej sdílí.
Poznámka
Povolené frekvence pokrývají zhruba 4 Hz až 5,3 MHz, odvozené ze základních hodin 16 MHz s prescalery 1/2/4/8/16/32/64/128 a 15bitovým čítačem periody. Ovladač automaticky vybere nejbližší dělitel — freq() hlásí požadovanou hodnotu, nikoli přesně dosažitelnou.
Softwarově bit‑bangované sběrnice¶
machine.SoftI2C a machine.SoftSPI fungují na kterémkoli GPIO, pokud potřebujete další sběrnici.
Tepelný senzor (externí)¶
Firmware obsahuje ovladač fir — ovladač termálního senzoru (fir == far infrared, vzdálené infračervené záření) pro externě zapojené termovize:
MLX90621 — IR pole 16 × 4
MLX90640 — IR pole 32 × 24
MLX90641 — IR pole 16 × 12
AMG8833 — IR pole 8 × 8
Zapojte modul k I²C sběrnici 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 0 — zapojte modul k ploškám I2C_SCL / I2C_SDA (A5 / A4).
Č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 spotřebování 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. Voláním deinit() slot zastavíte a uvolníte.
Hodiny reálného času¶
machine.RTC udržuje skutečný čas přes resety. RTC čipu nRF52840 je vázán na oscilátor na čipu a nepřežije úplnou ztrátu napájení — nastavte čas při každém studeném startu, pokud na tom vaší aplikaci záleží:
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. Po spuštění jej nelze zastavit ani překonfigurovat — periodicky jej krmte uvnitř hlavní smyčky:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informace o startu a běhu¶
Aktualizace firmware¶
Nano 33 BLE Sense používá standardní Arduino dvojí stisk reset pro vstup do bootloaderu Arduino. Rychle stiskněte tlačítko RESET dvakrát — deska vstoupí do režimu bootloaderu a OpenMV IDE může nahrát nový obraz firmware.
Běžící skript může na vyžádání znovu vstoupit do bootloaderu voláním machine.bootloader()
import machine
machine.bootloader()
Souborový systém a pořadí startu¶
Firmware Nano 33 BLE Sense připojuje při startu jediný souborový systém:
Interní flash — vždy připojena na
/flasha používána jako pracovní adresář. Standardně obsahujemain.pyaREADME.txt; vytváří se při úplně prvním startu.
Po připojení interpret spustí skripty z /flash:
boot.pyse spustí při každém měkkém resetu.main.pyse spustí pouze při studeném startu, ihned poboot.py.
Výchozí main.py dodávaný na čerstvě naflashované desce pouze bliká modrým kanálem uživatelské RGB LED jako tlukot srdce (dva krátké pulzy, krátká pauza), takže poznáte, že firmware naběhl čistě, aniž by byl připojen jakýkoli hostitel.
/flash není na této desce vyveden jako USB mass‑storage disk.
Velikosti úložiště¶
Nano 33 BLE Sense se dodává s:
/flash— souborový systém FAT o velikosti 64 KB, pro čtení/zápis.
Sestavení Nano 33 BLE Sense neobsahuje ROMFS; dodávejte moduly Pythonu přímo na /flash.
Softwarové knihovny¶
Kompletní seznam modulů — včetně toho, které jsou jedinečné pro sestavení Nano 33 BLE Sense — najdete v indexu knihoven.