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

完整的数据手册、照片和尺寸信息,请参阅 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/nBluetooth 4.2(BR/EDR + LE)。

  • LSM6DSOX 六轴 IMU 和 MP34DT06 PDM 麦克风。

  • Micro USB 接口,用于供电、编程以及 CDC REPL。

  • 标准 Nano 排针上的 22 个用户 I/O 引脚——TX/RXD2D13(数字)、A0A7(模拟)。

引脚分布

Arduino Nano RP2040 Connect 引脚分布

引脚参考

引脚名称

参考

功能

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

D13 上的橙色用户 LED

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_REDLED_GREENLED_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

D3

D1

D4

D2

D5

D3

D6

D4

D7

D5

D8

D6

D9

D7

D2

HSYNC

A1

VSYNC

A0

PXCLK

A3

MXCLK

A2

POWER

TX

RESET

RX

SCL

SDA(I²C 0)

SDA

SCL(I²C 0)

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

SDA / A4

SCL / A5

I2C1

A0

A1

两条总线都需要将其引脚显式传入 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 IMU

  • 0x60——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.SoftI2Cmachine.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.pyREADME.txt;在首次启动时创建。

挂载之后,解释器随即从 /flash 运行脚本:

  • boot.py每次 软复位时执行。

  • main.py 仅在冷启动时 执行,紧随 boot.py 之后。

刚刷写好的开发板上随附的默认 main.py 只是将用户 RGB LED 的 蓝色 通道作为心跳闪烁(两次短脉冲,短间隔),这样你无需连接任何主机即可判断固件是否正常启动。

通过 USB 连接时,/flash 会在主机上枚举为一个 USB 大容量存储驱动器,让你可以直接编辑 boot.pymain.py 以及任何其他文件。在复位开发板之前请弹出该驱动器,以便主机刷新其缓存的写入。

备注

由于操作系统将该驱动器视为被动块设备,由摄像头上运行的代码所创建或修改的文件,在主机重新挂载该驱动器之前不会显示出来。如果操作系统和摄像头同时写入同一文件系统,操作系统会胜出并覆盖摄像头所做的更改。对于脚本写回的任何数据请使用 SD 卡,并在主机读取这些文件之前重新挂载。

备注

在主机从 USB 大容量存储驱动器读取或向其写入时,用户 RGB LED 的 红色 通道可能会短暂点亮——这是固件驱动的活动指示,而非故障。

存储容量

Nano RP2040 Connect 出厂随附:

  • /flash——14 MB FAT 文件系统,可读写。

Nano RP2040 版本不包含 ROMFS;请将 Python 模块和 ML 模型直接随放在 /flash 上。

软件库

完整的模块列表请参阅 库索引——其中包括哪些模块是 Nano RP2040 Connect 版本独有的。