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.
Основные характеристики¶
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,D2–D13(цифровые),A0–A7(аналоговые).
Распиновка¶
Справочник по выводам¶
Имя вывода |
Опорное напряжение |
Функция |
|---|---|---|
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 |
— |
Оранжевый пользовательский светодиод на |
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 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
Шина управления 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 |
|
|
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— IMU LSM6DSOX0x60— 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 — см. в индексе библиотек.