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.
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 IMU —
LSM9DS1na Rev 1,BMI270+BMM150na Rev 2. Zamrznutiimuupravljački program ispituje oba pri pokretanju.LPS22HBbarometar,HTS221/HS3003senzor temperature i vlažnosti,APDS9960senzor 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,D2–D13(digitalni),A0–A7(analogni).
Raspored pinova¶
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 |
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 V — nisu 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
VINmogu 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 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
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 |
|
|
I2C1 |
|
|
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 V — read_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 (PWM0–PWM3), 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
/flashi korištena kao radni direktorij. Sadržimain.pyiREADME.txtprema zadanim postavkama; stvara se pri prvom pokretanju.
Nakon montiranja, interpreter zatim pokreće skripte iz /flash:
boot.pyse izvršava pri svakom mekom resetiranju.main.pyse izvršava samo pri hladnom pokretanju, neposredno nakonboot.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:
/flash— 64 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.