Arduino Nano RP2040 Connect

Предупреждение

Эта плата больше не поддерживается. Последняя версия прошивки OpenMV для Arduino Nano RP2040 Connect — 4.7.0. Дальнейшие обновления прошивки, исправления ошибок и новые функции для этого устройства выпускаться не будут. Приведённая ниже информация сохранена для пользователей, работающих с версией 4.7.0 или более ранней.

Arduino Nano RP2040 Connect — это плата размером 45 × 18 мм в форм‑факторе Arduino Nano, построенная на базе Raspberry Pi RP2040 — двухъядерного ARM Cortex‑M0+, работающего на частоте 133 МГц с 264 КБ внутренней SRAM. WiFi и BLE обеспечивает модуль U‑blox NINA‑W102, а на плате установлены 6‑осевой IMU LSM6DSOX и PDM‑микрофон MP34DT06. Прошивка OpenMV управляет всеми этими компонентами из MicroPython.

Arduino Nano RP2040 Connect

Полную техническую документацию, фотографии и размеры см. на странице продукта Arduino Nano RP2040 Connect.

Основные характеристики

  • Raspberry Pi RP2040 — двухъядерный ARM Cortex‑M0+ на частоте 133 МГц с 264 КБ внутренней SRAM.

  • 16 МБ внешней QSPI флеш‑памяти.

  • Модуль U‑blox NINA‑W102, обеспечивающий 2,4 ГГц Wi‑Fi b/g/n и Bluetooth 4.2 (BR/EDR + LE).

  • 6‑осевой IMU LSM6DSOX и PDM‑микрофон MP34DT06.

  • Разъём Micro USB для питания, программирования и CDC REPL.

  • 22 пользовательских вывода ввода/вывода на стандартных разъёмах Nano — TX/RX, D2D13 (цифровые), A0A7 (аналоговые).

Распиновка

Распиновка Arduino Nano RP2040 Connect

Справочник по выводам

Имя вывода

Опорное напряжение

Функция

TX

3,3 В

UART0 TX / SPI0 RX / I2C0 SDA / PWM0 A

RX

3,3 В

UART0 RX / SPI0 CS / I2C0 SCL / PWM0 B

D2

3,3 В

SPI1 CS / UART1 RX / I2C0 SCL / PWM4 B

D3

3,3 В

SPI1 TX / UART0 RTS / I2C1 SCL / PWM7 B

D4

3,3 В

SPI0 RX / UART0 TX / I2C0 SDA / PWM0 A

D5

3,3 В

SPI0 CS / UART0 RX / I2C0 SCL / PWM0 B

D6

3,3 В

SPI0 SCK / UART0 CTS / I2C1 SDA / PWM1 A

D7

3,3 В

SPI0 TX / UART0 RTS / I2C1 SCL / PWM1 B

D8

3,3 В

SPI0 RX / UART1 TX / I2C0 SDA / PWM2 A

D9

3,3 В

SPI0 CS / UART1 RX / I2C0 SCL / PWM2 B

D10

3,3 В

SPI0 CS / UART1 RX / I2C0 SCL / PWM2 B

D11

3,3 В

SPI0 TX / UART1 RTS / I2C1 SCL / PWM3 B

D12

3,3 В

SPI0 RX / UART1 TX / I2C0 SDA / PWM2 A

D13

3,3 В

SPI0 SCK / UART1 CTS / I2C1 SDA / PWM3 A

D14 / A0

3,3 В

ADC / SPI1 SCK / UART1 CTS / I2C1 SDA / PWM5 A

D15 / A1

3,3 В

ADC / SPI1 TX / UART1 RTS / I2C1 SCL / PWM5 B

D16 / A2

3,3 В

ADC / SPI1 RX / UART0 TX / I2C0 SDA / PWM6 A

D17 / A3

3,3 В

ADC / SPI1 CS / UART0 RX / I2C0 SCL / PWM6 B

D18 / A4 / SDA

3,3 В

ADC / I2C0 SDA / SPI1 RX / UART0 TX / PWM6 A

D19 / A5 / SCL

3,3 В

ADC / I2C0 SCL / SPI1 CS / UART0 RX / PWM6 B

D20 / A6

3,3 В

ADC / GPIO

D21 / A7

3,3 В

ADC / GPIO

RESET

3,3 В

нажмите кнопку RESET на плате или подтяните к GND для сброса

REC

3,3 В

BOOTSEL — подтяните к высокому уровню при включении питания для входа в ROM‑загрузчик RP2040

LED_BUILTIN

Оранжевый пользовательский светодиод на D13

LED_RED

Красный канал RGB‑светодиода

LED_GREEN

Зелёный канал RGB‑светодиода

LED_BLUE

Синий канал RGB‑светодиода

Предупреждение

Выводы ввода/вывода Nano RP2040 Connect рассчитаны только на 3,3 В — они не толерантны к 5 В. Подача 5 В на них приведёт к повреждению RP2040.

Выводы питания

  • VIN — вход 4 – 20 В. Питает плату через встроенный импульсный стабилизатор. Также подаётся через диод от шины 5 В USB, поэтому USB и VIN могут присутствовать одновременно, не воздействуя друг на друга обратным током.

  • +5V — по умолчанию не подключён.

  • +3V3 — выход стабилизатора 3,3 В.

  • AREF — вывод аналогового опорного напряжения. На этой плате не подключён к RP2040 — ADC всегда привязан к 3,3 В.

  • GND — общая земля.

Nano RP2040 Connect можно запитать любым из путей:

  • Micro USB — подаёт 5 В на встроенный стабилизатор.

  • Вывод VIN — подайте стабилизированное напряжение 4 – 20 В.

Примечание

Паяная перемычка на нижней стороне платы соединяет +5V с шиной 5 В USB. Замкните её, чтобы вывод разъёма +5V действительно подавал 5 В.

Примечание

Нормально замкнутую паяную перемычку на выходе встроенного импульсного стабилизатора 4–20 В можно перерезать, чтобы отключить стабилизатор, после чего плату можно питать напрямую от внешнего источника 3,3 В через +3V3.

Выводы восстановления и отладки

  • RESET — представлен как открытым контактом, так и мгновенной кнопкой RESET на верхней стороне платы, подключённой к линии NRST RP2040. Подтяните к GND или нажмите кнопку для сброса.

  • REC — открытый контакт. Удержание REC на высоком уровне при включении питания (или при нажатии RESET) переводит RP2040 в ROM‑загрузчик; плата повторно опознаётся как USB‑накопитель с именем RPI-RP2 и принимает образ прошивки .uf2.

Nano RP2040 Connect использует стандартный для Arduino двойной сброс для входа в загрузчик Arduino. Быстро нажмите кнопку RESET дважды — плата повторно опознаётся через USB как устройство UF2, и OpenMV IDE может прошить новый образ прошивки.

Сигналы SWD RP2040 выведены на лужёные контакты на обратной стороне платы, прямо под модулем NINA. Все сигналы отладки привязаны к 3,3 В.

Встроенные периферийные устройства

Светодиоды

Nano RP2040 Connect имеет пользовательский RGB‑светодиод — управляемый через подписанные на плате каналы LED_RED, LED_GREEN и LED_BLUE — плюс отдельный оранжевый 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()

Отдельный зелёный светодиод питания на плате загорается всякий раз, когда подаётся напряжение +3,3 В, и не управляется пользователем.

Датчик камеры

Прошивка OpenMV на Nano RP2040 Connect поддерживает параллельный CMOS‑датчик OmniVision OV7670. На плате нет встроенного датчика изображения — подключите модуль 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)

Шина управления I²C датчика OV7670 разделяется с встроенными IMU и ATECC608A на I²C 0. Датчик находится по 7‑битному адресу 0x21 — пользовательские устройства на шине 0 также должны избегать этого адреса при подключённой камере.

IMU

Встроенный 6‑осевой акселерометр + гироскоп LSM6DSOX находится на I2C0. По умолчанию machine.I2C(0) порта rp2 использует другой набор выводов, поэтому явно передайте подписанные на плате контакты 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)

Микрофон

Встроенный PDM‑микрофон MP34DT06 захватывается через audio — Модуль Audio с использованием одного из блоков PIO RP2040:

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 — настройка сети как интерфейс станции:

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 для удобной работы с BLE через asyncio — например, рекламируйте себя как периферийное устройство и ожидайте подключения центрального:

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 В CMOS, суммарный ток стока 50 мА на все 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

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 — IMU LSM6DSOX

  • 0x60 — ATECC608A‑MAHDA‑T

Использование A0/A1 в качестве I²C занимает их для шины, поэтому они не могут одновременно быть входами ADC.

Примечание

Контакты SDA / SCL (шина 0) имеют встроенные подтягивающие резисторы к 3,3 В, поэтому внешние подтяжки для устройств на этой шине не нужны. A0 / A1 (шина 1) их не имеют — добавьте внешние подтягивающие резисторы при использовании шины 1.

То же оборудование можно использовать и в режиме целевого устройства (slave) через 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 на этой шине будет заставлять светодиод мигать в такт тактовому сигналу шины.

Примечание

machine.SPI(1) существует, но зарезервирован для встроенного модуля NINA‑W102 (SPI‑канал Wi‑Fi/BLE); не используйте его напрямую.

ADC

RP2040 имеет четыре 12‑битных канала ADC, выведенных на A0–A3, все привязаны к 3,3 Вread_u16 возвращает 0–65535 в диапазоне 0–3,3 В на выводе. Вывод AREF платы не подключён, поэтому опорное напряжение всегда 3,3 В:

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 внутри одного среза разделяют период (частоту), но каждый имеет собственный коэффициент заполнения.

Программно эмулируемые шины (bit‑bang)

machine.SoftI2C и machine.SoftSPI работают на любом GPIO, если вам нужна дополнительная шина.

Тепловой датчик (внешний)

Прошивка включает драйвер fir — драйвер теплового датчика (fir == far infrared, дальний инфракрасный) для внешне подключённого теплового тепловизора 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 ведёт отсчёт астрономического времени между сбросами. RTC RP2040 привязан к встроенному осциллятору и не сохраняется при полной потере питания — устанавливайте время при каждом холодном запуске, если это важно для вашего приложения:

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‑светодиода в качестве индикатора работы (два коротких импульса, короткая пауза), поэтому вы можете определить, что прошивка загрузилась корректно, без подключения какого‑либо хоста.

При подключении по USB /flash опознаётся хостом как USB‑накопитель, позволяя редактировать boot.py, main.py и любые другие файлы напрямую. Извлеките накопитель перед сбросом платы, чтобы хост сбросил кэшированные записи.

Примечание

Поскольку ОС рассматривает накопитель как пассивное блочное устройство, файлы, созданные или изменённые кодом, выполняющимся на камере, не появятся, пока хост не перемонтирует накопитель. Если и ОС, и камера записывают в одну и ту же файловую систему одновременно, победит ОС и перезапишет изменения, сделанные камерой. Используйте SD‑карту для любых данных, которые записывает скрипт, и перемонтируйте перед чтением этих файлов с хоста.

Примечание

Красный канал пользовательского RGB‑светодиода может ненадолго загораться, пока хост читает или записывает данные на USB‑накопитель — это управляемый прошивкой индикатор активности, а не неисправность.

Объёмы хранилища

Nano RP2040 Connect поставляется с:

  • /flash — файловая система FAT 14 МБ, чтение/запись.

Сборка Nano RP2040 не включает ROMFS; размещайте модули Python и ML‑модели прямо на /flash.

Программные библиотеки

Полный список модулей — включая те, что уникальны для сборки Nano RP2040 Connect — см. в индексе библиотек.