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 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 รุ่น MP34DT05Micro USB สำหรับการจ่ายไฟ การโปรแกรม และ CDC REPL
พิน I/O สำหรับผู้ใช้ 22 พิน บน Nano headers มาตรฐาน —
TX/RX,D2–D13(ดิจิทัล),A0–A7(อนาล็อก)
ผังพิน#
ตารางอ้างอิงพิน#
ชื่อพิน | อ้างอิง | ฟังก์ชัน |
|---|---|---|
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 สีส้มสำหรับผู้ใช้บน |
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 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
บัส 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 |
|
|
I2C1 |
|
|
ทั้งสองบัสต้องส่งพินอย่างชัดเจนให้ 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 V — read_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 สี่ตัว (PWM0–PWM3) แต่ละตัวขับ สี่ช่อง รวมเป็น 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 resetmain.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