Arduino Nano 33 BLE Sense

Upozorenje

Ova ploča više nije podržana. Posljednje izdanje OpenMV firmvera za Arduino Nano 33 BLE Sense je 4.7.0. Za ovaj cilj neće se izdavati daljnja ažuriranja firmvera, ispravci grešaka ni nove značajke. Informacije u nastavku sačuvane su za korisnike koji koriste verziju 4.7.0 ili stariju.

Arduino Nano 33 BLE Sense je ploča dimenzija 45 × 18 mm u Arduino-Nano formatu izgrađena oko Nordic Semiconductor nRF52840 — jednog ARM Cortex-M4 s FPU-om koji radi na 64 MHz s 256 KB interne SRAM memorije i 1 MB interne flash memorije. BLE dolazi iz radija na čipu, a ploča nosi 9-osni IMU, LPS22HB barometar, HTS221 / HS3003 senzor temperature / vlažnosti, APDS9960 senzor ambijentalnog svjetla / boje / blizine / gesta i MP34DT05 PDM mikrofon. OpenMV firmver upravlja svima njima iz MicroPythona.

Arduino Nano 33 BLE Sense

Za cjeloviti podatkovni list, fotografije i dimenzije pogledajte stranicu proizvoda Arduino Nano 33 BLE Rev2.

Istaknute značajke

  • Nordic nRF52840 Cortex-M4 s FPU-om na 64 MHz s 256 KB interne SRAM memorije i 1 MB interne flash memorije.

  • Bluetooth LE 5.0 putem radija na čipu i Nordic SoftDevice s140.

  • 9-osni IMULSM9DS1 na Rev 1, BMI270 + BMM150 na Rev 2. Zamrznuti imu upravljački program ispituje oba pri pokretanju.

  • LPS22HB barometar, HTS221 / HS3003 senzor temperature i vlažnosti, APDS9960 senzor ambijentalnog svjetla / boje / blizine / gesta i MP34DT05 PDM mikrofon.

  • Micro USB priključak za napajanje, programiranje i CDC REPL.

  • 22 korisnička U/I pina na standardnim Nano priključcima — TX/RX, D2D13 (digitalni), A0A7 (analogni).

Raspored pinova

Raspored pinova Arduino Nano 33 BLE Sense

Referenca pinova

Naziv pina

Referenca

Funkcija

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

pritisnite tipku RESET na ploči ili povucite na GND za resetiranje

LED_BUILTIN

Narančasta korisnička LED na D13

LED_RED

Crveni kanal RGB LED-a (aktivan na niskoj razini)

LED_GREEN

Zeleni kanal RGB LED-a (aktivan na niskoj razini)

LED_BLUE

Plavi kanal RGB LED-a (aktivan na niskoj razini)

Upozorenje

U/I pinovi Nano 33 BLE Sense ploče rade samo na 3,3 Vnisu tolerantni na 5 V. Dovođenje 5 V na njih oštetit će nRF52840.

Pinovi za napajanje

  • VIN — ulaz 4,5 – 21 V. Napaja ploču kroz regulator na ploči. Također se napaja preko diode iz USB 5 V voda, tako da USB i VIN mogu biti istovremeno prisutni bez međusobnog povratnog napajanja.

  • +5V — prema zadanom nije spojen.

  • +3V3 — izlaz 3,3 V regulatora.

  • AREF — pin analogne reference. Na ovoj ploči nije ožičen na nRF52840 — ADC je uvijek referenciran na 3,3 V.

  • GND — zajednička masa.

Nano 33 BLE Sense može se napajati preko bilo kojeg od putova:

  • Micro USB — dovodi 5 V na regulator na ploči.

  • VIN pin — dovedite regulirano napajanje 4,5 – 21 V.

Napomena

Lemni premosnik na donjoj strani ploče označen s VUSB premošćuje +5V na USB 5 V vod. Zatvorite ga kako bi +5V pin na priključku zaista nosio 5 V.

Napomena

Normalno zatvoreni lemni premosnik na izlazu 4,5–21 V prekidačkog regulatora na ploči može se prerezati kako bi se onemogućio regulator, tako da se ploča može napajati izravno iz vanjskog napajanja od 3,3 V na +3V3.

Pinovi za oporavak i otklanjanje pogrešaka

  • RESET — i izloženi kontakt i trenutna tipka RESET na vrhu ploče, vezani na liniju za resetiranje nRF52840. Povucite na GND ili pritisnite tipku za resetiranje.

Nano 33 BLE Sense koristi Arduinov standardni dvostruki dodir za resetiranje za ulazak u Arduinov pokretač (bootloader). Brzo pritisnite tipku RESET dvaput — ploča ulazi u način rada pokretača i OpenMV IDE može flashati novu sliku firmvera.

SWD signali nRF52840 izloženi su na pozlaćenim kontaktima na stražnjoj strani ploče. Svi signali za otklanjanje pogrešaka su referencirani na 3,3 V.

Periferije na ploči

LED-ovi

Nano 33 BLE Sense ima korisnički RGB LED — pogonjen kroz kanale LED_RED, LED_GREEN i LED_BLUE označene na tisku — uz zaseban narančasti LED_BUILTIN na D13. Sva četiri se mogu kontrolirati softverski preko machine.LED

from machine import LED

LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
LED("LED_BUILTIN").on()

Zaseban zeleni LED napajanja na ploči svijetli kad god je vod +3,3 V aktivan i nije pod korisničkom kontrolom.

Senzor kamere

OpenMV firmver na Nano 33 BLE Sense podržava paralelni CMOS senzor OmniVision OV7670. Ploča nema senzor slike na ploči — spojite OV7670 modul na pinove priključka označene na tisku navedene u nastavku i pogonite ga kroz modul csi — senzori kamere

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

Napomena

OV7670 zauzima 14 pinova. Firmver ih ožičuje na sljedeći način:

Signal senzora

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)

Kontrolna I²C sabirnica OV7670 ista je vanjska I²C 0 izložena na A5/A4. Senzor se nalazi na 7-bitnoj adresi 0x21 — korisnički uređaji na toj sabirnici moraju izbjegavati ovu adresu kada je kamera spojena.

IMU

9-osni IMU izložen je kroz zamrznuti modul imu, koji automatski otkriva ima li ploča LSM9DS1 (Rev 1) ili BMI270 + BMM150 (Rev 2) i predstavlja jedinstvenu klasu imu.IMU. Senzori se nalaze na internoj I²C 1 sabirnici (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)

Za izravan pristup značajkama poput detekcije dodira ili FIFO-a, uvezite odgovarajući zamrznuti upravljački program (lsm9ds1, bmi270 ili bmm150) i instancirajte ga na istoj sabirnici.

Senzori okoline

Barometar (LPS22HB) i senzor temperature / vlažnosti (HTS221 na Rev 1, HS3003 na Rev 2) dijele istu internu I²C 1 sabirnicu kao i 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)

Svjetlo / boja / blizina / geste

Broadcom APDS9960 nalazi se na istoj internoj I²C 1 sabirnici i pruža detekciju ambijentalnog svjetla, RGB boje, blizine i gesta:

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

MP34DT05 PDM mikrofon na ploči snima se kroz audio — Audio modul. Svaki međuspremnik stiže kao predznačeni 16-bitni PCM bytearray, spreman za dovođenje u ulab/numpy za 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 radio nRF52840 radi na Nordic SoftDevice s140 i izložen je kroz naslijeđeni modul ubluepy — moderni bluetooth / aioble — Asinkroni BLE API-ji nisu omogućeni u ovoj verziji. Dostupne su i uloge periferije (GATT poslužitelj, oglašavanje) i središnja (GAP promatrač / skener + povezivanje).

Oglašavajte se kao periferija s jednom uslugom Environmental Sensing i temperaturnom karakteristikom koja podržava obavijesti — povratni poziv event_handler aktivira se pri povezivanju, prekidu veze i CCCD upisima:

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

Skenirajte obližnje uređaje koji se oglašavaju u središnjoj ulozi:

from ubluepy import Scanner

for entry in Scanner().scan(1_000):                  # 1 second window
    print(entry.addr(), entry.rssi(), "dBm")

Pogledajte referencu ubluepy za cjeloviti API — UUID, Service, Characteristic, Peripheral, Scanner, ScanEntry i imenski prostor constants.

Referenca sabirnica

GPIO

Koristite machine.Pin za čitanje ili pogon bilo kojeg od pinova označenih na tisku. Izlazi su 3,3 V CMOS — 15 mA po pinu, 25 mA ukupno preko svih GPIO-ova.

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

Bilo koji ulazni pin također može pokrenuti prekid pri prijelazima na rubu:

def handler(pin):
    print("triggered:", pin)

Pin("D3", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Sabirnica

TX

RX

UART1

TX

RX

Koristite nazive s tiska TX/RX uz machine.UART

from machine import UART

uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

Sabirnica

SDA

SCL

I2C0

I2C_SDA / A4

I2C_SCL / A5

I2C1

P14

P15

Objema sabirnicama pinovi se moraju proslijediti eksplicitno klasi 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()

Napomena

Sabirnica 1 je interna sabirnica senzora na P14/P15 (nije na korisničkim priključcima) — opslužuje IMU, barometar, senzor okoline i APDS9960. Zamrznuti upravljački programi senzora koriste je izravno; korisnički kôd je također može skenirati, ali adrese su već zauzete senzorima na ploči.

SPI

Sabirnica

MOSI

MISO

SCK

CS

SPI0

D11

D12

D13

D10

Liniju CS ne pogoni SPI periferija — konfigurirajte D10 kao izlaz i ručno ga prebacujte oko prijenosa:

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)

Napomena

D13 ujedno služi kao narančasti LED_BUILTIN — pogon SPI-a na ovoj sabirnici treperit će LED-om u ritmu takta sabirnice.

ADC

nRF52840 ima osam 12-bitnih ADC kanala (SAADC) izloženih na A0–A7, svi referencirani na 3,3 Vread_u16 vraća 0–65535 u rasponu 0–3,3 V na pinu. Pin AREF ploče nije ožičen, pa je referenca uvijek 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

nRF52840 izlaže četiri PWM periferije (PWM0PWM3), od kojih svaka pogoni četiri kanala, za ukupno 16 hardverskih PWM utora. Za razliku od portova s fiksnom funkcijom, periferije se usmjeravaju kroz GPIOTE matricu — bilo koji GPIO može biti PWM izlaz, pa ne postoji mapiranje pina na rezinu. Cijena te fleksibilnosti su dva ograničenja ugrađena u silicij:

  • Sva četiri kanala unutar modula dijele jedinstveni period/frekvenciju.

  • Svaki kanal ima vlastiti radni ciklus i polaritet.

Konceptualno 16 utora izgledaju ovako:

Modul

Kan 0

Kan 1

Kan 2

Kan 3

PWM0

radni ciklus

radni ciklus

radni ciklus

radni ciklus

PWM1

radni ciklus

radni ciklus

radni ciklus

radni ciklus

PWM2

radni ciklus

radni ciklus

radni ciklus

radni ciklus

PWM3

radni ciklus

radni ciklus

radni ciklus

radni ciklus

Svaki redak radi na jednoj frekvenciji; četiri ćelije u retku svaka pogoni neovisno odabran pin s vlastitim radnim ciklusom. Različiti retci mogu raditi na potpuno različitim frekvencijama.

Pogonite bilo koji pin označen na tisku (ili LED-ove na ploči) preko machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("D3"), freq=1_000, duty_u16=32768)

Upozorenje

Automatska dodjela troši cijeli modul po pozivu. Kada stvorite PWM bez kwargova device=/channel=, upravljački program preuzima prvi slobodan modul i vezuje vaš pin samo na njegov kanal 0. Preostala tri kanala tog modula ostaju neaktivna i dostupna su samo kroz eksplicitne device=/channel=. To ograničava nepomognute pozive PWM(Pin(...)) na četiri prije nego što upravljački program podigne ValueError: all PWM devices in use — iako je tehnički još uvijek slobodno dvanaest utora.

Za korištenje više od četiri PWM-a ili za namjerno dijeljenje frekvencije među pinovima, proslijedite device (0–3) i 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)

Radni ciklus prihvaća duty (0–100%), duty_u16 (0–65535) ili duty_ns. Dodajte invert=1 za preokretanje polariteta izlaza (zgodno za RGB LED aktivan na niskoj razini).

Napomena

Budući da je frekvencija svojstvo po modulu, pozivanje pwm.freq(new_freq) na bilo kojem kanalu modula ponovno pokreće nrfx_pwm_init za cijeli modul i mijenja frekvenciju koju vidi svaki drugi kanal koji ga dijeli.

Napomena

Dopuštene frekvencije obuhvaćaju otprilike 4 Hz do 5,3 MHz, izvedene iz osnovnog takta od 16 MHz s djeliteljima 1/2/4/8/16/32/64/128 i 15-bitnim brojačem perioda. Upravljački program automatski bira najbliži djelitelj — freq() izvještava traženu vrijednost, a ne točno ostvarivu.

Softverski bit-bang sabirnice

machine.SoftI2C i machine.SoftSPI rade na bilo kojem GPIO-u ako vam je potrebna dodatna sabirnica.

Toplinski senzor (izvan ploče)

Firmver uključuje upravljački program fir — upravljački program termalnog senzora (fir == daleko infracrveno) za vanjski ožičene toplinske kamere:

  • MLX90621 — 16 × 4 IR matrica

  • MLX90640 — 32 × 24 IR matrica

  • MLX90641 — 16 × 12 IR matrica

  • AMG8833 — 8 × 8 IR matrica

Spojite modul na I²C sabirnicu ploče i čitajte sličice s 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())

Upravljački program fir komunicira sa senzorom samo preko I²C 0 — spojite modul na kontakte I2C_SCL / I2C_SDA (A5 / A4).

Vremensko upravljanje

time

Modul time pokriva blokirajuća odgađanja, monotone otkucaje i mjerenje proteklog vremena:

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)

Virtualni mjerači vremena

machine.Timer zakazuje periodičke ili jednokratne povratne pozive bez trošenja utora hardverskog mjerača vremena. Proslijedite -1 kao id za korištenje virtualnog (softverskog) mjerača vremena:

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

Vrijednosti perioda izražene su u milisekundama. Pozovite deinit() za zaustavljanje i oslobađanje utora.

Sat stvarnog vremena

machine.RTC čuva stvarno vrijeme kroz resetiranja. RTC nRF52840 vezan je na oscilator na čipu i ne preživljava potpuni gubitak napajanja — postavite vrijeme pri svakom hladnom pokretanju ako je to važno za vašu aplikaciju:

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 resetira ploču ako se aplikacija zaglavi. Jednom pokrenut ne može se zaustaviti ni ponovno konfigurirati — hranite ga periodički unutar glavne petlje:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Informacije o pokretanju i izvođenju

Ažuriranje firmvera

Nano 33 BLE Sense koristi Arduinov standardni dvostruki dodir za resetiranje za ulazak u Arduinov pokretač (bootloader). Brzo pritisnite tipku RESET dvaput — ploča ulazi u način rada pokretača i OpenMV IDE može flashati novu sliku firmvera.

Pokrenuta skripta može ponovno ući u pokretač (bootloader) na zahtjev pozivanjem machine.bootloader()

import machine

machine.bootloader()

Datotečni sustav i redoslijed pokretanja

Firmver Nano 33 BLE Sense montira jedan datotečni sustav pri pokretanju:

  • Interna flash memorija — uvijek montirana na /flash i korištena kao radni direktorij. Sadrži main.py i README.txt prema zadanim postavkama; stvara se pri prvom pokretanju.

Nakon montiranja, interpreter zatim pokreće skripte iz /flash:

  • boot.py se izvršava pri svakom mekom resetiranju.

  • main.py se izvršava samo pri hladnom pokretanju, neposredno nakon boot.py.

Zadani main.py isporučen na svježe flashanoj ploči samo treperi plavim kanalom korisničkog RGB LED-a kao otkucaj srca (dva kratka impulsa, kratka stanka), tako da možete znati da se firmver čisto pokrenuo bez ikakvog spojenog domaćina.

/flash nije izložen kao USB masovni medij za pohranu na ovoj ploči.

Veličine pohrane

Nano 33 BLE Sense isporučuje se s:

  • /flash64 KB FAT datotečni sustav, za čitanje/pisanje.

Verzija Nano 33 BLE Sense ne uključuje ROMFS; isporučite Python module izravno na /flash.

Softverske biblioteke

Pogledajte indeks biblioteke za cjeloviti popis modula — uključujući one koji su jedinstveni za verziju Nano 33 BLE Sense.