Arduino Nano 33 BLE Sense

Warning

บอร์ดนี้ไม่ได้รับการสนับสนุนอีกต่อไปแล้ว เวอร์ชันเฟิร์มแวร์ OpenMV สุดท้ายสำหรับ Arduino Nano 33 BLE Sense คือ 4.7.0 จะไม่มีการอัปเดตเฟิร์มแวร์ การแก้ไขข้อผิดพลาด หรือฟีเจอร์ใหม่สำหรับเป้าหมายนี้อีกต่อไป ข้อมูลด้านล่างนี้ถูกเก็บรักษาไว้สำหรับผู้ใช้ที่ยังใช้เวอร์ชัน 4.7.0 หรือก่อนหน้า

Arduino Nano 33 BLE Sense เป็นบอร์ดขนาด 45 × 18 มม. ในรูปแบบ Arduino Nano ที่สร้างขึ้นรอบ Nordic Semiconductor nRF52840 — โปรเซสเซอร์ ARM Cortex‑M4 ตัวเดียวพร้อม FPU ทำงานที่ความเร็ว 64 MHz พร้อม SRAM ภายใน 256 KB และแฟลชภายใน 1 MB ระบบ BLE มาจากวิทยุในชิป และบอร์ดมี IMU 9 แกน บาโรมิเตอร์ LPS22HB เซนเซอร์อุณหภูมิ/ความชื้น HTS221/HS3003 เซนเซอร์แสงแวดล้อม/สี/ระยะใกล้/ท่าทาง APDS9960 และไมโครโฟน PDM รุ่น MP34DT05 เฟิร์มแวร์ OpenMV ขับเคลื่อนทั้งหมดนี้ผ่าน MicroPython

Arduino Nano 33 BLE Sense

สำหรับแผ่นข้อมูลฉบับสมบูรณ์ ภาพถ่าย และขนาด ดูได้ที่ หน้าผลิตภัณฑ์ Arduino Nano 33 BLE Rev2

จุดเด่น

  • Nordic nRF52840 Cortex‑M4 พร้อม FPU ที่ความเร็ว 64 MHz พร้อม SRAM ภายใน 256 KB และ แฟลชภายใน 1 MB

  • Bluetooth LE 5.0 ผ่านวิทยุในชิปและ Nordic SoftDevice s140

  • IMU 9 แกนLSM9DS1 สำหรับ Rev 1, BMI270 + BMM150 สำหรับ Rev 2 ไดรเวอร์ imu แบบ frozen จะตรวจสอบทั้งสองตัวเมื่อบูต

  • LPS22HB บาโรมิเตอร์, HTS221 / HS3003 เซนเซอร์อุณหภูมิและความชื้น, APDS9960 เซนเซอร์แสงแวดล้อม/สี/ระยะใกล้/ท่าทาง และไมโครโฟน PDM รุ่น MP34DT05

  • Micro USB สำหรับการจ่ายไฟ การโปรแกรม และ CDC REPL

  • พิน I/O สำหรับผู้ใช้ 22 พิน บน Nano headers มาตรฐาน — TX/RX, D2D13 (ดิจิทัล), A0A7 (อนาล็อก)

ผังพิน

Arduino Nano 33 BLE Sense Pinout

ตารางอ้างอิงพิน

ชื่อพิน

อ้างอิง

ฟังก์ชัน

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

กดปุ่ม RESET บนบอร์ดหรือดึงลง GND เพื่อรีเซ็ต

LED_BUILTIN

LED สีส้มสำหรับผู้ใช้บน D13

LED_RED

ช่องสีแดง RGB LED (active low)

LED_GREEN

ช่องสีเขียว RGB LED (active low)

LED_BLUE

ช่องสีน้ำเงิน RGB LED (active low)

Warning

พิน I/O ของ Nano 33 BLE Sense เป็น 3.3 V เท่านั้นไม่รองรับ 5 V การป้อน 5 V เข้าไปจะทำให้ nRF52840 เสียหาย

พินพลังงาน

  • VIN — อินพุต 4.5 – 21 V ส่งพลังงานให้บอร์ดผ่านตัวควบคุมแรงดันบนบอร์ด นอกจากนี้ยังรับจาก USB 5 V ผ่านไดโอด ดังนั้น USB และ VIN สามารถต่อพร้อมกันได้โดยไม่กระทบกัน

  • +5V — ไม่ได้ต่อไว้โดยค่าเริ่มต้น

  • +3V3 — เอาต์พุตของตัวควบคุมแรงดัน 3.3 V

  • AREF — พินอ้างอิงอนาล็อก ไม่ได้ต่อเข้ากับ nRF52840 บนบอร์ดนี้ — ADC อ้างอิงกับ 3.3 V เสมอ

  • GND — กราวด์ร่วม

Nano 33 BLE Sense สามารถรับพลังงานได้จากสองทาง:

  • Micro USB — จ่าย 5 V ให้ตัวควบคุมแรงดันบนบอร์ด

  • พิน VIN — ป้อนแหล่งจ่ายแรงดันที่ปรับแล้ว 4.5 – 21 V

Note

จัมเปอร์บัดกรีที่ด้านล่างของบอร์ดที่ระบุว่า VUSB เชื่อมต่อ +5V กับสาย USB 5 V ปิดจัมเปอร์นี้เพื่อให้พิน header +5V พกพา 5 V จริงๆ

Note

จัมเปอร์บัดกรีแบบปกติปิดที่ด้านเอาต์พุตของตัวควบคุมแรงดันสวิตชิ่ง 4.5–21 V บนบอร์ดสามารถตัดเพื่อปิดใช้งานตัวควบคุม ทำให้บอร์ดรับพลังงานจากแหล่งจ่าย 3.3 V ภายนอกที่ +3V3 ได้โดยตรง

พินการกู้คืนและการดีบัก

  • RESET — ทั้งแพดที่เปิดเผยและปุ่ม RESET แบบชั่วขณะด้านบนบอร์ด ต่อกับสายรีเซ็ตของ nRF52840 ดึงลง GND หรือกดปุ่มเพื่อรีเซ็ต

Nano 33 BLE Sense ใช้ การกดรีเซ็ตสองครั้งอย่างรวดเร็ว มาตรฐานของ Arduino เพื่อเข้าสู่ bootloader ของ Arduino กดปุ่ม RESET สองครั้งอย่างรวดเร็ว — บอร์ดจะเข้าสู่โหมด bootloader และ OpenMV IDE สามารถแฟลชเฟิร์มแวร์ใหม่ได้

สัญญาณ SWD ของ nRF52840 ถูกเปิดเผยบนแพดชุบนิกเกิลด้านหลังบอร์ด สัญญาณดีบักทั้งหมดเป็น 3.3 V referenced

อุปกรณ์ต่อพ่วงบนบอร์ด

LED

Nano 33 BLE Sense มี RGB LED สำหรับผู้ใช้ — ขับเคลื่อนผ่านช่อง LED_RED, LED_GREEN และ LED_BLUE ตามที่ระบุบน silkscreen — รวมถึง LED_BUILTIN สีส้มแยกต่างหากบน D13 ทั้งสี่ตัวสามารถควบคุมผ่านซอฟต์แวร์ด้วย machine.LED

from machine import LED

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

LED สีเขียว พลังงาน แยกต่างหากบนบอร์ดจะสว่างเสมอเมื่อสาย +3.3 V ทำงาน และไม่สามารถควบคุมจากผู้ใช้ได้

เซนเซอร์กล้อง

เฟิร์มแวร์ OpenMV บน Nano 33 BLE Sense รองรับเซนเซอร์ CMOS แบบ parallel รุ่น OmniVision OV7670 บอร์ดไม่มี image sensor ในตัว — ต่อโมดูล OV7670 เข้ากับพิน header ที่ระบุบน silkscreen ด้านล่างแล้วควบคุมผ่านโมดูล csi --- เซ็นเซอร์กล้อง

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

Note

OV7670 ใช้พิน 14 พิน เฟิร์มแวร์ต่อสายดังนี้:

สัญญาณเซนเซอร์

พิน 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)

บัส I²C ควบคุมของ OV7670 คือ I²C 0 ภายนอกตัวเดียวกันที่เปิดเผยบน A5/A4 เซนเซอร์อยู่ที่แอดเดรส 7 บิต 0x21 — อุปกรณ์ผู้ใช้บนบัสนั้นต้องหลีกเลี่ยงแอดเดรสนี้เมื่อต่อกล้องไว้

IMU

IMU 9 แกนถูกเปิดเผยผ่านโมดูล imu แบบ frozen ซึ่งตรวจสอบโดยอัตโนมัติว่าบอร์ดมี LSM9DS1 (Rev 1) หรือ BMI270 + BMM150 (Rev 2) และนำเสนอคลาส imu.IMU แบบรวม เซนเซอร์อยู่บนบัส 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)

สำหรับการเข้าถึงโดยตรงสู่ฟีเจอร์อย่างเช่น tap detection หรือ FIFO ให้ import ไดรเวอร์ frozen ที่ตรงกัน (lsm9ds1, bmi270 หรือ bmm150) แล้วสร้าง instance บนบัสเดิม

เซนเซอร์สิ่งแวดล้อม

บาโรมิเตอร์ (LPS22HB) และเซนเซอร์อุณหภูมิ/ความชื้น (HTS221 บน Rev 1, HS3003 บน Rev 2) ใช้บัส I²C 1 ภายในร่วมกับ 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)

แสง/สี/ระยะใกล้/ท่าทาง

Broadcom APDS9960 อยู่บนบัส I²C 1 ภายในเดียวกันและให้ข้อมูลแสงแวดล้อม สี RGB ระยะใกล้ และการตรวจจับท่าทาง:

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)

ไมโครโฟน

ไมโครโฟน PDM รุ่น MP34DT05 บนบอร์ดถูกรับสัญญาณผ่าน audio --- โมดูล Audio แต่ละบัฟเฟอร์มาถึงเป็น PCM 16 บิตแบบมีเครื่องหมาย bytearray พร้อมส่งเข้า ulab/numpy สำหรับการประมวลผลสัญญาณ:

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 ของ nRF52840 ทำงานบน Nordic SoftDevice s140 และถูกเปิดเผยผ่านโมดูล ubluepy แบบเดิม — API สมัยใหม่อย่าง bluetooth / aioble --- Async BLE ไม่ได้เปิดใช้งานในบิลด์นี้ ทั้งบทบาท peripheral (GATT server, advertise) และ central (GAP observer/scanner + connect) พร้อมใช้งาน

โฆษณาในบทบาท peripheral พร้อม Environmental Sensing service เดียวและ temperature characteristic แบบแจ้งเตือนได้ — คอลแบ็ก event_handler จะทำงานเมื่อมีการเชื่อมต่อ ตัดการเชื่อมต่อ และการเขียน 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])

สแกนหาอุปกรณ์โฆษณาใกล้เคียงในบทบาท central:

from ubluepy import Scanner

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

ดูเอกสารอ้างอิง ubluepy สำหรับ API ฉบับสมบูรณ์ — UUID, Service, Characteristic, Peripheral, Scanner, ScanEntry และ namespace constants

ตารางอ้างอิงบัส

GPIO

ใช้ machine.Pin เพื่ออ่านหรือขับพิน silkscreen ใดๆ เอาต์พุตเป็น 3.3 V CMOS — 15 mA ต่อพิน รวม 25 mA สำหรับ 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())

พินอินพุตใดๆ ก็สามารถเรียกอินเทอร์รัปต์บนการเปลี่ยนแปลงขอบได้:

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

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

UART

บัส

TX

RX

UART1

TX

RX

ใช้ชื่อ silkscreen TX/RX กับ machine.UART

from machine import UART

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

I²C

บัส

SDA

SCL

I2C0

I2C_SDA / A4

I2C_SCL / A5

I2C1

P14

P15

ทั้งสองบัสต้องส่งพินอย่างชัดเจนให้ 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()

Note

บัส 1 คือบัสเซนเซอร์ภายในบน P14/P15 (ไม่อยู่บน user headers) — ให้บริการ IMU บาโรมิเตอร์ เซนเซอร์สิ่งแวดล้อม และ APDS9960 ไดรเวอร์เซนเซอร์แบบ frozen ใช้โดยตรง แต่โค้ดผู้ใช้ก็สแกนได้เช่นกัน แม้ว่าแอดเดรสจะถูกใช้โดยเซนเซอร์บนบอร์ดอยู่แล้ว

SPI

บัส

MOSI

MISO

SCK

CS

SPI0

D11

D12

D13

D10

สาย CS ไม่ได้ถูกขับโดยอุปกรณ์ต่อพ่วง SPI — กำหนดค่า D10 เป็นเอาต์พุตแล้วสลับด้วยตนเองรอบการถ่ายโอน:

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)

Note

D13 ยังทำหน้าที่เป็น LED_BUILTIN สีส้ม — การขับ SPI บนบัสนี้จะทำให้ LED กะพริบตามจังหวะ clock ของบัส

ADC

nRF52840 มีช่อง ADC 12 บิตแปดช่อง (SAADC) ที่เปิดเผยบน A0–A7 ทั้งหมด อ้างอิง 3.3 Vread_u16 คืนค่า 0–65535 ตามช่วง 0–3.3 V ที่พิน พิน AREF ของบอร์ดไม่ได้ต่อไว้ ดังนั้นการอ้างอิงจึงเป็น 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 เปิดเผย PWM peripherals สี่ตัว (PWM0PWM3) แต่ละตัวขับ สี่ช่อง รวมเป็น 16 slot PWM hardware ทั้งหมด ต่างจากพอร์ตฟังก์ชันตายตัว อุปกรณ์ต่อพ่วงเหล่านี้เชื่อมต่อผ่าน GPIOTE matrix — GPIO ใดๆ ก็เป็นเอาต์พุต PWM ได้ ดังนั้นจึงไม่มีการแมป pin-to-slice ความยืดหยุ่นนั้นมีค่าใช้จ่ายสองข้อจำกัดที่ฝังอยู่ในซิลิกอน:

  • ทั้งสี่ช่องภายในโมดูลแชร์ period/frequency เดียว

  • แต่ละช่องมี duty cycle และ polarity ของตัวเอง

16 slot ตามแนวคิดมีลักษณะดังนี้:

โมดูล

Ch 0

Ch 1

Ch 2

Ch 3

PWM0

duty

duty

duty

duty

PWM1

duty

duty

duty

duty

PWM2

duty

duty

duty

duty

PWM3

duty

duty

duty

duty

แต่ละแถวทำงานที่ความถี่หนึ่ง สี่เซลล์ในแถวแต่ละแถวขับพินที่เลือกอย่างอิสระด้วย duty cycle ของตนเอง แถวต่างๆ สามารถทำงานที่ความถี่ต่างกันได้อย่างสมบูรณ์

ขับพิน silkscreen ใดๆ (หรือ LED บนบอร์ด) ผ่าน machine.PWM

from machine import Pin, PWM

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

Warning

การจัดสรรอัตโนมัติใช้โมดูลทั้งหมดต่อการเรียก เมื่อสร้าง PWM โดยไม่มี kwargs device=/channel= ไดรเวอร์จะใช้โมดูลว่างตัวแรกและผูกพินของคุณกับ channel 0 เท่านั้น สามช่องที่เหลือของโมดูลนั้นจะไม่ทำงานและเข้าถึงได้ผ่าน device=/channel= อย่างชัดเจนเท่านั้น ซึ่งจำกัดการเรียก PWM(Pin(...)) โดยไม่ระบุ kwargs ไว้ที่ สี่ครั้ง ก่อนที่ไดรเวอร์จะ raise ValueError: all PWM devices in use — แม้ว่าจะยังมี slot ว่างอีก 12 slot จริงๆ

หากต้องการใช้ PWM มากกว่าสี่ตัว หรือต้องการแชร์ความถี่ระหว่างพินโดยตั้งใจ ให้ส่ง device (0–3) และ 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)

Duty cycle รับ duty (0–100%), duty_u16 (0–65535) หรือ duty_ns เพิ่ม invert=1 เพื่อพลิก polarity ของเอาต์พุต (มีประโยชน์สำหรับ RGB LED แบบ active‑low)

Note

เนื่องจากความถี่เป็นคุณสมบัติระดับโมดูล การเรียก pwm.freq(new_freq) บน ช่องใดๆ ของโมดูลจะรัน nrfx_pwm_init ใหม่สำหรับโมดูลทั้งหมดและเปลี่ยนความถี่ที่ช่องอื่นๆ ที่แชร์โมดูลนั้นเห็นด้วย

Note

ความถี่ที่อนุญาตอยู่ในช่วงประมาณ 4 Hz ถึง 5.3 MHz ได้จาก clock 16 MHz พร้อม prescaler 1/2/4/8/16/32/64/128 และ period counter 15 บิต ไดรเวอร์เลือก divisor ที่ใกล้เคียงที่สุดโดยอัตโนมัติ — freq() รายงานค่าที่ร้องขอ ไม่ใช่ค่าที่ทำได้จริง

บัสแบบ Software bit-bang

machine.SoftI2C และ machine.SoftSPI ทำงานบน GPIO ใดๆ หากต้องการบัสเพิ่มเติม

เซนเซอร์ความร้อน (ภายนอกบอร์ด)

เฟิร์มแวร์รวมไดรเวอร์ fir --- ไดรเวอร์เซนเซอร์ความร้อน (fir == far infrared) สำหรับ thermal imager ที่ต่อสายภายนอก:

  • MLX90621 — อาร์เรย์ IR ขนาด 16 × 4

  • MLX90640 — อาร์เรย์ IR ขนาด 32 × 24

  • MLX90641 — อาร์เรย์ IR ขนาด 16 × 12

  • AMG8833 — อาร์เรย์ IR ขนาด 8 × 8

ต่อโมดูลเข้ากับบัส I²C ของบอร์ดแล้วอ่านเฟรมด้วย 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 คุยกับเซนเซอร์ผ่าน I²C 0 เท่านั้น — ต่อโมดูลกับแพด I2C_SCL / I2C_SDA (A5 / A4)

การจับเวลา

time

โมดูล time ครอบคลุมการหน่วงเวลาแบบบล็อก tick แบบ monotonic และการวัดเวลาที่ผ่านไป:

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)

ตัวจับเวลาเสมือน

machine.Timer กำหนดเวลาคอลแบ็กแบบ periodic หรือ one-shot โดยไม่ใช้ slot ของ hardware timer ส่งผ่าน -1 เป็น id เพื่อใช้ตัวจับเวลาเสมือน (ซอฟต์แวร์):

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

ค่าระยะเวลาเป็นมิลลิวินาที เรียก deinit() เพื่อหยุดและปล่อย slot

นาฬิกาเวลาจริง

machine.RTC รักษาเวลานาฬิกาผนังข้ามการรีเซ็ต RTC ของ nRF52840 ผูกกับออสซิลเลเตอร์บนชิปและไม่รอดจากการสูญเสียพลังงานอย่างสมบูรณ์ — ตั้งเวลาทุกครั้งที่ cold boot หากสำคัญสำหรับแอปพลิเคชันของคุณ:

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 รีเซ็ตบอร์ดหากแอปพลิเคชันค้าง เมื่อเริ่มต้นแล้วไม่สามารถหยุดหรือกำหนดค่าใหม่ได้ — ป้อนค่าเป็นระยะภายใน main loop ของคุณ:

from machine import WDT

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

ข้อมูลการบูตและ runtime

การอัปเดตเฟิร์มแวร์

Nano 33 BLE Sense ใช้ การกดรีเซ็ตสองครั้งอย่างรวดเร็ว มาตรฐานของ Arduino เพื่อเข้าสู่ bootloader ของ Arduino กดปุ่ม RESET สองครั้งอย่างรวดเร็ว — บอร์ดจะเข้าสู่โหมด bootloader และ OpenMV IDE สามารถแฟลชเฟิร์มแวร์ใหม่ได้

สคริปต์ที่กำลังทำงานสามารถเข้าสู่ bootloader ได้ตามต้องการโดยเรียก machine.bootloader()

import machine

machine.bootloader()

ระบบไฟล์และลำดับการบูต

เฟิร์มแวร์ Nano 33 BLE Sense เมาต์ระบบไฟล์เดียวเมื่อบูต:

  • แฟลชภายใน — เมาต์ที่ /flash เสมอและใช้เป็น working directory เก็บ main.py และ README.txt โดยค่าเริ่มต้น สร้างขึ้นเมื่อบูตครั้งแรก

หลังจากเมาต์แล้ว interpreter จะรันสคริปต์จาก /flash:

  • boot.py ถูกรันทุกครั้งที่ soft reset

  • main.py ถูกรันเฉพาะเมื่อ cold boot เท่านั้น ทันทีหลังจาก boot.py

main.py ค่าเริ่มต้นที่จัดส่งบนบอร์ดที่แฟลชใหม่แค่กะพริบช่อง blue ของ RGB LED ผู้ใช้เป็น heartbeat (พัลส์สั้นสองครั้ง หยุดสั้น) เพื่อให้รู้ว่าเฟิร์มแวร์บูตสำเร็จโดยไม่ต้องต่อกับ host

/flash ไม่ ถูกเปิดเผยเป็นไดรฟ์ USB mass-storage บนบอร์ดนี้

ขนาดที่จัดเก็บ

Nano 33 BLE Sense จัดส่งพร้อมกับ:

  • /flash — ระบบไฟล์ FAT 64 KB อ่าน/เขียน

Nano 33 BLE Sense build ไม่รวม ROMFS — จัดส่ง Python modules บน /flash โดยตรง

ไลบรารีซอฟต์แวร์

ดู ดัชนีไลบรารี สำหรับรายการโมดูลฉบับสมบูรณ์ — รวมถึงโมดูลที่มีเฉพาะใน Nano 33 BLE Sense build