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