Arduino Nano RP2040 Connect¶
警告
此开发板不再受支持。 适用于 Arduino Nano RP2040 Connect 的最后一个 OpenMV 固件版本为 4.7.0。该目标平台不会再发布任何固件更新、错误修复或新功能。以下信息为运行 4.7.0 或更早版本的用户保留。
Arduino Nano RP2040 Connect 是一款 45 × 18 mm 的 Arduino‑Nano 规格开发板,围绕 Raspberry Pi RP2040 构建——这是一颗双核 ARM Cortex‑M0+,运行频率为 133 MHz,内置 264 KB SRAM。WiFi 和 BLE 由 U‑blox NINA‑W102 模块提供,开发板还搭载了 LSM6DSOX 六轴 IMU 和 MP34DT06 PDM 麦克风。OpenMV 固件通过 MicroPython 驱动所有这些器件。
完整的数据手册、照片和尺寸信息,请参阅 Arduino Nano RP2040 Connect 产品页面。
亮点¶
Raspberry Pi RP2040 双核 ARM Cortex‑M0+,主频 133 MHz,内置 264 KB SRAM。
16 MB 外部 QSPI 闪存。
U‑blox NINA‑W102 模块,提供 2.4 GHz Wi‑Fi b/g/n 和 Bluetooth 4.2(BR/EDR + LE)。
LSM6DSOX 六轴 IMU 和 MP34DT06 PDM 麦克风。
Micro USB 接口,用于供电、编程以及 CDC REPL。
标准 Nano 排针上的 22 个用户 I/O 引脚——
TX/RX、D2–D13(数字)、A0–A7(模拟)。
引脚分布¶
引脚参考¶
引脚名称 |
参考 |
功能 |
|---|---|---|
TX |
3.3 V |
UART0 TX / SPI0 RX / I2C0 SDA / PWM0 A |
RX |
3.3 V |
UART0 RX / SPI0 CS / I2C0 SCL / PWM0 B |
D2 |
3.3 V |
SPI1 CS / UART1 RX / I2C0 SCL / PWM4 B |
D3 |
3.3 V |
SPI1 TX / UART0 RTS / I2C1 SCL / PWM7 B |
D4 |
3.3 V |
SPI0 RX / UART0 TX / I2C0 SDA / PWM0 A |
D5 |
3.3 V |
SPI0 CS / UART0 RX / I2C0 SCL / PWM0 B |
D6 |
3.3 V |
SPI0 SCK / UART0 CTS / I2C1 SDA / PWM1 A |
D7 |
3.3 V |
SPI0 TX / UART0 RTS / I2C1 SCL / PWM1 B |
D8 |
3.3 V |
SPI0 RX / UART1 TX / I2C0 SDA / PWM2 A |
D9 |
3.3 V |
SPI0 CS / UART1 RX / I2C0 SCL / PWM2 B |
D10 |
3.3 V |
SPI0 CS / UART1 RX / I2C0 SCL / PWM2 B |
D11 |
3.3 V |
SPI0 TX / UART1 RTS / I2C1 SCL / PWM3 B |
D12 |
3.3 V |
SPI0 RX / UART1 TX / I2C0 SDA / PWM2 A |
D13 |
3.3 V |
SPI0 SCK / UART1 CTS / I2C1 SDA / PWM3 A |
D14 / A0 |
3.3 V |
ADC / SPI1 SCK / UART1 CTS / I2C1 SDA / PWM5 A |
D15 / A1 |
3.3 V |
ADC / SPI1 TX / UART1 RTS / I2C1 SCL / PWM5 B |
D16 / A2 |
3.3 V |
ADC / SPI1 RX / UART0 TX / I2C0 SDA / PWM6 A |
D17 / A3 |
3.3 V |
ADC / SPI1 CS / UART0 RX / I2C0 SCL / PWM6 B |
D18 / A4 / SDA |
3.3 V |
ADC / I2C0 SDA / SPI1 RX / UART0 TX / PWM6 A |
D19 / A5 / SCL |
3.3 V |
ADC / I2C0 SCL / SPI1 CS / UART0 RX / PWM6 B |
D20 / A6 |
3.3 V |
ADC / GPIO |
D21 / A7 |
3.3 V |
ADC / GPIO |
RESET |
3.3 V |
按下板载 RESET 按钮或拉至 GND 以复位 |
REC |
3.3 V |
BOOTSEL——在上电时拉高以进入 RP2040 ROM 引导加载程序 |
LED_BUILTIN |
— |
|
LED_RED |
— |
RGB LED 红色通道 |
LED_GREEN |
— |
RGB LED 绿色通道 |
LED_BLUE |
— |
RGB LED 蓝色通道 |
警告
Nano RP2040 Connect 的 I/O 引脚 仅支持 3.3 V——它们 不耐受 5 V。向其灌入 5 V 会损坏 RP2040。
电源引脚¶
VIN——4 – 20 V 输入。通过板载开关稳压器为开发板供电。也经由二极管从 USB 5 V 电源轨馈电,因此 USB 和
VIN可以同时存在而不会相互倒灌。+5V——默认未连接。
+3V3——3.3 V 稳压器输出。
AREF——模拟参考引脚。在此开发板上未连接到 RP2040——ADC 始终以 3.3 V 为参考。
GND——公共地。
Nano RP2040 Connect 可通过以下任一路径供电:
Micro USB——向板载稳压器提供 5 V。
VIN 引脚——接入经稳压的 4 – 20 V 电源。
备注
开发板底部有一个焊接跳线,将 +5V 桥接到 USB 5 V 电源轨。闭合它可使 +5V 排针引脚真正输出 5 V。
备注
板载 4–20 V 开关稳压器输出端有一个常闭焊接跳线,可将其切断以禁用稳压器,从而使开发板可由 +3V3 上的外部 3.3 V 电源直接供电。
恢复和调试引脚¶
RESET——既有一个裸露焊盘,也有开发板顶部的一个瞬动 RESET 按钮,二者均连接到 RP2040 的 NRST 线。拉至 GND 或按下按钮即可复位。
REC——裸露焊盘。在上电时(或在按下 RESET 时)将
REC保持 高电平,会使 RP2040 进入其 ROM 引导加载程序;开发板会重新枚举为一个名为RPI-RP2的 USB 大容量存储驱动器,并接受.uf2固件镜像。
Nano RP2040 Connect 使用 Arduino 标准的 双击复位 来进入 Arduino 引导加载程序。快速按下 RESET 按钮两次——开发板会通过 USB 重新枚举为 UF2 设备,OpenMV IDE 即可刷写新的固件镜像。
RP2040 的 SWD 信号引出到开发板背面、NINA 模块正下方的镀金焊盘上。所有调试信号均以 3.3 V 为参考。
板载外设¶
LED¶
Nano RP2040 Connect 有一个用户 RGB LED——通过丝印的 LED_RED、LED_GREEN 和 LED_BLUE 通道驱动——另外还有一个独立的橙色 LED_BUILTIN 位于 D13 上。这四个 LED 都可通过 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 电源轨上电它就会点亮,且不可由用户控制。
摄像头传感器¶
Nano RP2040 Connect 上的 OpenMV 固件支持 OmniVision OV7670 并行 CMOS 传感器。开发板没有板载图像传感器——将 OV7670 模块接到下面列出的丝印排针引脚上,并通过 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()
备注
OV7670 需要 14 个引脚。固件按如下方式连接它们:
传感器信号 |
Nano RP2040 引脚 |
|---|---|
D0 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
OV7670 的 I²C 控制总线与板载 IMU 和 ATECC608A 共享 I²C 0。该传感器位于 7 位地址 0x21——当摄像头接线时,总线 0 上的用户设备也必须避开这个地址。
IMU¶
板载 LSM6DSOX 六轴加速度计 + 陀螺仪位于 I2C0 上。rp2 端口的 machine.I2C(0) 默认使用一组不同的引脚,因此请显式传入丝印的 SDA/SCL 焊盘。使用固化的 lsm6dsox.LSM6DSOX 驱动:
import time
from machine import I2C, Pin
from lsm6dsox import LSM6DSOX
bus = I2C(0, scl=Pin("SCL"), sda=Pin("SDA"))
imu = LSM6DSOX(bus)
while True:
print(imu.accel()) # (x, y, z) in g
print(imu.gyro()) # (x, y, z) in deg/s
time.sleep_ms(100)
麦克风¶
板载 MP34DT06 PDM 麦克风通过 audio --- 音频模块 使用 RP2040 的某个 PIO 块进行采集:
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
Wi‑Fi¶
板载 NINA‑W102 模块通过 network --- 网络配置 作为 station 接口暴露出来:
import network, time
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Bluetooth¶
同一颗 NINA 模块也暴露了 Bluetooth 4.2 LE。使用 aioble --- 异步 BLE 进行适合 asyncio 的 BLE 操作——例如,作为外设进行广播并等待中心设备连接:
import asyncio
import aioble
async def run():
while True:
conn = await aioble.advertise(250_000, name="Nano-RP2040")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
总线参考¶
GPIO¶
使用 machine.Pin 读取或驱动任意丝印引脚。输出为 3.3 V CMOS,所有 GPIO 合计灌电流为 50 mA。
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 |
|---|---|---|
UART0 |
TX |
RX |
使用丝印名称 TX/RX 配合 machine.UART:
from machine import UART
uart = UART(0, baudrate=115200)
uart.write("hello")
uart.read(5)
备注
machine.UART(1) 存在,但保留给板载 NINA‑W102 模块(BLE 链路)使用;请勿直接使用它。
I²C¶
总线 |
SDA |
SCL |
|---|---|---|
I2C0 |
|
|
I2C1 |
|
|
两条总线都需要将其引脚显式传入 machine.I2C:
from machine import I2C, Pin
bus0 = I2C(0, scl=Pin("SCL"), sda=Pin("SDA"), freq=400_000)
bus0.scan()
bus1 = I2C(1, scl=Pin("A1"), sda=Pin("A0"), freq=400_000)
bus1.scan()
备注
两颗板载芯片共享 总线 0——此总线上的用户设备必须避开它们的地址:
0x6A——LSM6DSOX IMU0x60——ATECC608A‑MAHDA‑T
将 A0/A1 用作 I²C 会将它们占用给该总线,因此它们无法同时作为 ADC 输入。
备注
SDA / SCL 焊盘(总线 0)带有连接到 3.3 V 的板载上拉电阻,因此该总线上的设备无需外部上拉。A0 / A1(总线 1)则没有——使用总线 1 时请添加外部上拉。
同一硬件还可以通过 machine.I2CTarget 用于目标(从机)模式,向另一个 I²C 控制器暴露一段内存区域:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(0, addr=0x42, mem=buf)
SPI¶
总线 |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI0 |
D11 |
D12 |
D13 |
D10 |
rp2 端口在此开发板上不会预先配置 SPI0 的引脚,因此创建总线时请显式传入丝印焊盘:
from machine import SPI, Pin
spi = SPI(0, baudrate=10_000_000,
sck=Pin("D13"), mosi=Pin("D11"), miso=Pin("D12"))
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)
备注
D13 同时兼作橙色 LED_BUILTIN——在此总线上驱动 SPI 会使该 LED 随总线时钟一同闪烁。
备注
machine.SPI(1) 存在,但保留给板载 NINA‑W102 模块(Wi-Fi/BLE SPI 链路)使用;请勿直接使用它。
ADC¶
RP2040 有四个 12 位 ADC 通道,引出到 A0–A3,全部以 3.3 V 为参考——read_u16 在引脚 0–3.3 V 范围内返回 0–65535。开发板的 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¶
引脚 |
切片 / 通道 |
|---|---|
TX |
PWM0 A |
RX |
PWM0 B |
D2 |
PWM4 B |
D3 |
PWM7 B |
D4 |
PWM0 A |
D5 |
PWM0 B |
D6 |
PWM1 A |
D7 |
PWM1 B |
D8 |
PWM2 A |
D9 |
PWM2 B |
D10 |
PWM2 B |
D11 |
PWM3 B |
D12 |
PWM2 A |
D13 |
PWM3 A |
D14 / A0 |
PWM5 A |
D15 / A1 |
PWM5 B |
D16 / A2 |
PWM6 A |
D17 / A3 |
PWM6 B |
D18 / A4 / SDA |
PWM6 A |
D19 / A5 / SCL |
PWM6 B |
通过 machine.PWM 驱动其中任意一个:
from machine import Pin, PWM
pwm = PWM(Pin("D3"), freq=1_000, duty_u16=32768)
备注
有几个引脚共享 PWM 切片通道:
PWM0 A 位于
TX和D4上。PWM0 B 位于
RX和D5上。PWM2 A 位于
D8和D12上。PWM2 B 位于
D9和D10上。PWM6 A 位于
D16/A2和D18/A4/SDA上。PWM6 B 位于
D17/A3和D19/A5/SCL上。
每个切片通道只选一个使用者。同一切片内的通道 A 和 B 共享周期(频率),但各自拥有独立的占空比。
软件位拨总线¶
machine.SoftI2C 和 machine.SoftSPI 可在任意 GPIO 上工作,以便在你需要额外总线时使用。
热成像传感器(板外)¶
固件包含 fir --- 热成像传感器驱动(fir == 远红外) 驱动,用于外接的 AMG8833 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 与传感器通信——请将模块接到丝印的 SCL / SDA 焊盘上。该传感器的 7 位地址(0x69)不得被该总线上的任何其他设备使用。
定时¶
time¶
time 模块涵盖阻塞延时、单调计时以及经过时间测量:
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 可调度周期性或单次回调,而无需占用硬件定时器槽位。将 -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() 以停止并释放该槽位。
实时时钟¶
machine.RTC 可在复位之间保持挂钟时间。RP2040 的 RTC 绑定到片上振荡器,无法在完全断电后保留——如果这对你的应用很重要,请在每次冷启动时设置时间:
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())
看门狗¶
machine.WDT 会在应用挂起时复位开发板。一旦启动它就无法停止或重新配置——请在主循环内周期性地喂狗:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
启动与运行时信息¶
固件更新(UF2)¶
Nano RP2040 Connect 使用 Arduino 标准的 双击复位 来进入 Arduino 引导加载程序。快速按下复位按钮两次——开发板会通过 USB 重新枚举为 UF2 设备,OpenMV IDE 即可刷写新的固件镜像。
正在运行的脚本可以通过调用 machine.bootloader() 按需重新进入引导加载程序:
import machine
machine.bootloader()
文件系统与启动顺序¶
Nano RP2040 Connect 固件在启动时挂载单个文件系统:
内部闪存——始终挂载在
/flash,并用作工作目录。默认存放main.py和README.txt;在首次启动时创建。
挂载之后,解释器随即从 /flash 运行脚本:
boot.py在 每次 软复位时执行。main.py仅在冷启动时 执行,紧随boot.py之后。
刚刷写好的开发板上随附的默认 main.py 只是将用户 RGB LED 的 蓝色 通道作为心跳闪烁(两次短脉冲,短间隔),这样你无需连接任何主机即可判断固件是否正常启动。
通过 USB 连接时,/flash 会在主机上枚举为一个 USB 大容量存储驱动器,让你可以直接编辑 boot.py、main.py 以及任何其他文件。在复位开发板之前请弹出该驱动器,以便主机刷新其缓存的写入。
备注
由于操作系统将该驱动器视为被动块设备,由摄像头上运行的代码所创建或修改的文件,在主机重新挂载该驱动器之前不会显示出来。如果操作系统和摄像头同时写入同一文件系统,操作系统会胜出并覆盖摄像头所做的更改。对于脚本写回的任何数据请使用 SD 卡,并在主机读取这些文件之前重新挂载。
备注
在主机从 USB 大容量存储驱动器读取或向其写入时,用户 RGB LED 的 红色 通道可能会短暂点亮——这是固件驱动的活动指示,而非故障。
存储容量¶
Nano RP2040 Connect 出厂随附:
/flash——14 MB FAT 文件系统,可读写。
Nano RP2040 版本不包含 ROMFS;请将 Python 模块和 ML 模型直接随放在 /flash 上。
软件库¶
完整的模块列表请参阅 库索引——其中包括哪些模块是 Nano RP2040 Connect 版本独有的。