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.

Arduino Nano 33 BLE Sense

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ý IMULSM9DS1 na Rev 1, BMI270 + BMM150 na Rev 2. Zamrzlý ovladač imu při startu detekuje oba.

  • Barometr LPS22HB, senzor teploty a vlhkosti HTS221 / HS3003, senzor okolního světla / barvy / přiblížení / gest APDS9960 a 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, D2D13 (digitální), A0A7 (analogové).

Rozložení pinů

Rozložení pinů Arduino Nano 33 BLE Sense

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 D13

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 Vnejsou 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 VIN mohou 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

D10

D1

TX

D2

RX

D3

D2

D4

D3

D5

D5

D6

D6

D7

D4

HSYNC

A1

VSYNC

D8

PXCLK

A0

MXCLK

D9

POWER

A3

RESET

A2

SCL

A5 (I²C 0)

SDA

A4 (I²C 0)

Ří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 ubluepyUUID, 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

I2C_SDA / A4

I2C_SCL / A5

I2C1

P14

P15

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 Vread_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 (PWM0PWM3), 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 /flash a používána jako pracovní adresář. Standardně obsahuje main.py a README.txt; vytváří se při úplně prvním startu.

Po připojení interpret spustí skripty z /flash:

  • boot.py se spustí při každém měkkém resetu.

  • main.py se spustí pouze při studeném startu, ihned po boot.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.