Arduino Nano RP2040 Connect

Cảnh báo

Board này không còn được hỗ trợ. Phiên bản firmware OpenMV cuối cùng cho Arduino Nano RP2040 Connect là 4.7.0. Sẽ không có thêm bản cập nhật firmware, sửa lỗi, hay tính năng mới nào cho thiết bị này. Thông tin bên dưới được giữ lại cho người dùng đang chạy phiên bản 4.7.0 hoặc cũ hơn.

Arduino Nano RP2040 Connect là bo mạch theo chuẩn Arduino Nano có kích thước 45 × 18 mm, được xây dựng xung quanh Raspberry Pi RP2040 — vi xử lý lõi kép ARM Cortex‑M0+ chạy ở 133 MHz với 264 KB SRAM nội bộ. Wi-Fi và BLE được cung cấp bởi module U‑blox NINA‑W102, và bo mạch tích hợp IMU 6 trục LSM6DSOX cùng microphone PDM MP34DT06. Firmware OpenMV điều khiển tất cả các thành phần này thông qua MicroPython.

Arduino Nano RP2040 Connect

Để xem datasheet đầy đủ, ảnh chụp và kích thước, hãy truy cập trang sản phẩm Arduino Nano RP2040 Connect.

Điểm nổi bật

  • Raspberry Pi RP2040 lõi kép ARM Cortex‑M0+ ở 133 MHz với 264 KB SRAM nội bộ.

  • Flash QSPI ngoài 16 MB.

  • Module U‑blox NINA‑W102 cung cấp Wi‑Fi 2.4 GHz b/g/nBluetooth 4.2 (BR/EDR + LE).

  • IMU 6 trục LSM6DSOX và microphone PDM MP34DT06.

  • Cổng Micro USB để cấp nguồn, lập trình và REPL qua CDC.

  • 22 chân I/O người dùng trên header Nano chuẩn — TX/RX, D2D13 (số), A0A7 (analog).

Sơ đồ chân

Arduino Nano RP2040 Connect Pinout

Tham chiếu chân

Tên chân (pin)

Tham chiếu

Chức năng

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

nhấn nút RESET trên bo mạch hoặc kéo xuống GND để đặt lại

REC

3.3 V

BOOTSEL — kéo lên cao khi cấp nguồn để vào bootloader ROM RP2040

LED_BUILTIN

Đèn LED người dùng màu cam trên D13

LED_RED

Kênh đỏ của RGB LED

LED_GREEN

Kênh xanh lá của RGB LED

LED_BLUE

Kênh xanh dương của RGB LED

Cảnh báo

Các chân I/O của Nano RP2040 Connect chỉ hoạt động ở 3.3 V — chúng không chịu được 5 V. Đưa 5 V vào sẽ làm hỏng RP2040.

Các chân nguồn

  • VIN — ngõ vào 4 – 20 V. Cấp nguồn cho bo mạch thông qua bộ điều áp chuyển mạch tích hợp. Cũng được kết nối qua diode từ đường 5 V USB, vì vậy USB và VIN có thể cùng lúc hiện diện mà không gây phản dòng.

  • +5V — mặc định để hở (không kết nối).

  • +3V3 — ngõ ra bộ điều áp 3.3 V.

  • AREF — chân tham chiếu analog. Không kết nối với RP2040 trên bo mạch này — ADC luôn được tham chiếu ở 3.3 V.

  • GND — đất chung.

Nano RP2040 Connect có thể được cấp nguồn qua một trong hai đường:

  • Micro USB — cung cấp 5 V cho bộ điều áp tích hợp.

  • Chân VIN — cấp nguồn điện áp ổn định từ 4 – 20 V.

Ghi chú

Một cầu hàn trên mặt dưới bo mạch nối +5V với đường 5 V USB. Hàn cầu này để chân header +5V thực sự mang điện áp 5 V.

Ghi chú

Một cầu hàn thường đóng ở ngõ ra bộ điều áp chuyển mạch 4–20 V tích hợp có thể được cắt để vô hiệu hóa bộ điều áp, cho phép cấp nguồn trực tiếp từ nguồn 3.3 V bên ngoài vào +3V3.

Các chân khôi phục và gỡ lỗi

  • RESET — vừa là pad hàn lộ ra ngoài vừa là nút nhấn RESET tạm thời trên mặt trên bo mạch, kết nối với đường NRST của RP2040. Kéo xuống GND hoặc nhấn nút để đặt lại.

  • REC — pad hàn lộ ra ngoài. Giữ REC lên cao khi cấp nguồn (hoặc trong khi nhấn RESET) đưa RP2040 vào bootloader ROM; bo mạch sẽ liệt kê lại qua USB dưới dạng ổ lưu trữ USB có tên RPI-RP2 và chấp nhận file firmware định dạng .uf2.

Nano RP2040 Connect sử dụng cơ chế nhấn RESET hai lần liên tiếp của Arduino để vào bootloader của Arduino. Nhấn nhanh nút RESET hai lần — bo mạch sẽ liệt kê lại qua USB dưới dạng thiết bị UF2 và OpenMV IDE có thể nạp firmware mới.

Các tín hiệu SWD của RP2040 được lộ ra trên các pad phủ thiếc ở mặt sau bo mạch, ngay bên dưới module NINA. Tất cả tín hiệu gỡ lỗi đều tham chiếu 3.3 V.

Ngoại vi tích hợp

Đèn LED

Nano RP2040 Connect có một RGB LED người dùng — được điều khiển qua các kênh in lụa LED_RED, LED_GREEN, và LED_BLUE — cùng một LED_BUILTIN màu cam riêng trên D13. Cả bốn đèn đều có thể điều khiển bằng phần mềm thông qua machine.LED

from machine import LED

LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
LED("LED_BUILTIN").on()

Một đèn LED nguồn màu xanh lá riêng biệt trên bo mạch sẽ sáng khi đường +3.3 V đang hoạt động và không thể điều khiển bằng người dùng.

Cảm biến camera

Firmware OpenMV trên Nano RP2040 Connect hỗ trợ cảm biến CMOS song song OmniVision OV7670. Bo mạch không có cảm biến hình ảnh tích hợp — kết nối module OV7670 với các chân header in lụa liệt kê bên dưới và điều khiển nó thông qua module csi --- cảm biến camera

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()

Ghi chú

OV7670 cần 14 chân. Firmware kết nối chúng như sau:

Tín hiệu cảm biến

Chân 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)

Bus điều khiển I²C của OV7670 được chia sẻ với IMU tích hợp và ATECC608A trên I²C 0. Cảm biến chiếm địa chỉ 7-bit 0x21 — các thiết bị người dùng trên bus 0 cũng phải tránh địa chỉ này khi camera đã kết nối.

IMU

Gia tốc kế + con quay hồi chuyển 6 trục LSM6DSOX tích hợp nằm trên I2C0. Cổng rp2 mặc định machine.I2C(0) sử dụng bộ chân khác, vì vậy cần truyền rõ ràng các pad in lụa SDA/SCL. Sử dụng driver đóng gói sẵn 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)

Microphone

Microphone PDM MP34DT06 tích hợp được thu thập qua audio --- Mô-đun Âm thanh sử dụng một trong các khối PIO của 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

Module NINA‑W102 tích hợp được hiển thị qua network --- cấu hình mạng dưới dạng giao diện 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

Cùng module NINA cũng hỗ trợ Bluetooth 4.2 LE. Sử dụng aioble --- Async BLE để dùng BLE theo phong cách asyncio — ví dụ, quảng bá dưới dạng thiết bị ngoại vi và chờ trung tâm kết nối:

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())

Tham chiếu bus

GPIO

Dùng machine.Pin để đọc hoặc điều khiển bất kỳ chân in lụa nào. Ngõ ra là CMOS 3.3 V, tổng dòng sink 50 mA trên tất cả 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())

Bất kỳ chân ngõ vào nào cũng có thể kích hoạt ngắt theo sườn chuyển đổi:

def handler(pin):
    print("triggered:", pin)

Pin("D3", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Bus

TX

RX

UART0

TX

RX

Dùng tên in lụa TX/RX với machine.UART

from machine import UART

uart = UART(0, baudrate=115200)
uart.write("hello")
uart.read(5)

Ghi chú

machine.UART(1) tồn tại nhưng được dành riêng cho module NINA‑W102 tích hợp (liên kết BLE); đừng sử dụng trực tiếp.

I²C

Bus

SDA

SCL

I2C0

SDA / A4

SCL / A5

I2C1

A0

A1

Cả hai bus đều cần truyền rõ ràng các chân khi khởi tạo 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()

Ghi chú

Hai chip trên bo mạch chia sẻ bus 0 — thiết bị người dùng trên bus này phải tránh các địa chỉ của chúng:

  • 0x6A — IMU LSM6DSOX

  • 0x60 — ATECC608A‑MAHDA‑T

Sử dụng A0/A1 cho I²C sẽ chiếm chúng cho bus đó, nên không thể đồng thời dùng chúng làm ngõ vào ADC.

Ghi chú

Các pad SDA / SCL (bus 0) có điện trở kéo lên tích hợp về 3.3 V, nên không cần điện trở kéo ngoài cho các thiết bị trên bus đó. A0 / A1 (bus 1) thì không — hãy thêm điện trở kéo ngoài khi sử dụng bus 1.

Phần cứng tương tự cũng có thể được dùng ở chế độ target (slave) thông qua machine.I2CTarget để hiển thị một vùng bộ nhớ cho bộ điều khiển I²C khác:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(0, addr=0x42, mem=buf)

SPI

Bus

MOSI

MISO

SCK

CS

SPI0

D11

D12

D13

D10

Cổng rp2 không cấu hình sẵn các chân của SPI0 trên bo mạch này, vì vậy cần truyền rõ ràng các pad in lụa khi tạo bus:

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)

Ghi chú

D13 cũng là LED_BUILTIN màu cam — khi điều khiển SPI trên bus này, đèn LED sẽ nhấp nháy theo nhịp đồng hồ bus.

Ghi chú

machine.SPI(1) tồn tại nhưng được dành riêng cho module NINA‑W102 tích hợp (liên kết SPI Wi-Fi/BLE); đừng sử dụng trực tiếp.

ADC

RP2040 có bốn kênh ADC 12‑bit được hiển thị trên A0–A3, tất cả tham chiếu 3.3 Vread_u16 trả về 0–65535 tương ứng với 0–3.3 V tại chân. Chân AREF của bo mạch không được kết nối, nên tham chiếu luôn là 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

Chân (pin)

Slice / channel

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

Điều khiển bất kỳ chân nào trong số đó qua machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("D3"), freq=1_000, duty_u16=32768)

Ghi chú

Một số chân chia sẻ kênh slice PWM:

  • PWM0 A nằm trên TX D4.

  • PWM0 B nằm trên RX D5.

  • PWM2 A nằm trên D8 D12.

  • PWM2 B nằm trên D9 D10.

  • PWM6 A nằm trên D16/A2 D18/A4/SDA.

  • PWM6 B nằm trên D17/A3 D19/A5/SCL.

Chỉ chọn một thiết bị dùng cho mỗi kênh slice. Kênh A và B trong cùng một slice chia sẻ chu kỳ (tần số) nhưng mỗi kênh có chu kỳ nhiệm vụ riêng.

Bus phần mềm mô phỏng bit‑banged

machine.SoftI2Cmachine.SoftSPI hoạt động trên bất kỳ GPIO nào nếu bạn cần thêm bus.

Cảm biến nhiệt (kết nối ngoài)

Firmware bao gồm driver fir --- trình điều khiển cảm biến nhiệt (fir == hồng ngoại xa) cho bộ ảnh nhiệt AMG8833 8×8 kết nối ngoài. Kết nối module với bus I²C liệt kê bên dưới, rồi đọc khung hình bằng 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())

Driver fir chỉ giao tiếp với cảm biến qua I²C 0 — kết nối module với các pad in lụa SCL / SDA. Địa chỉ 7-bit của cảm biến (0x69) không được dùng bởi bất kỳ thiết bị nào khác trên bus đó.

Thời gian

time

Module time cung cấp các hàm trì hoãn blocking, đếm ticks đơn điệu và đo thời gian đã trôi qua:

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)

Bộ định thời ảo

machine.Timer lên lịch các hàm gọi lại định kỳ hoặc một lần mà không tiêu tốn slot bộ định thời phần cứng. Truyền -1 làm id để sử dụng bộ định thời ảo (phần mềm):

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"))

Giá trị chu kỳ tính bằng mili giây. Gọi deinit() để dừng và giải phóng slot.

Đồng hồ thời gian thực

machine.RTC giữ thời gian thực qua các lần đặt lại. RTC của RP2040 gắn với bộ dao động trên chip và không tồn tại qua mất điện hoàn toàn — hãy đặt thời gian ở mỗi lần khởi động lạnh nếu điều này quan trọng với ứng dụng của bạn:

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 đặt lại bo mạch nếu ứng dụng bị treo. Một khi đã khởi động thì không thể dừng hoặc cấu hình lại — hãy nuôi nó định kỳ bên trong vòng lặp chính của bạn:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Thông tin khởi động và runtime

Cập nhật firmware (UF2)

Nano RP2040 Connect sử dụng cơ chế nhấn RESET hai lần liên tiếp của Arduino để vào bootloader của Arduino. Nhấn nhanh nút reset hai lần — bo mạch sẽ liệt kê lại qua USB dưới dạng thiết bị UF2 và OpenMV IDE có thể nạp firmware mới.

Một tập lệnh đang chạy có thể quay lại bootloader theo yêu cầu bằng cách gọi machine.bootloader()

import machine

machine.bootloader()

Hệ thống tệp và thứ tự khởi động

Firmware Nano RP2040 Connect gắn kết một hệ thống tệp duy nhất khi khởi động:

  • Flash nội bộ — luôn được gắn kết tại /flash và dùng làm thư mục làm việc. Chứa main.pyREADME.txt theo mặc định; được tạo ra ở lần khởi động đầu tiên.

Sau khi gắn kết, trình thông dịch sẽ chạy các tập lệnh từ /flash:

  • boot.py được thực thi ở mỗi lần soft reset.

  • main.py được thực thi chỉ khi khởi động lạnh, ngay sau boot.py.

File main.py mặc định được cài sẵn trên bo mạch vừa nạp firmware chỉ nhấp nháy kênh xanh dương của RGB LED người dùng như nhịp tim (hai xung ngắn, khoảng ngừng ngắn), để bạn biết firmware đã khởi động thành công mà không cần kết nối host.

Khi kết nối qua USB, /flash sẽ liệt kê dưới dạng ổ lưu trữ USB trên host, cho phép bạn chỉnh sửa boot.py, main.py và bất kỳ tệp nào khác trực tiếp. Hãy eject ổ đĩa trước khi đặt lại bo mạch để host đẩy hết các bản ghi đã cache.

Ghi chú

Vì hệ điều hành coi ổ đĩa là thiết bị khối thụ động, các tệp được tạo hoặc sửa đổi bởi code chạy trên camera sẽ không hiển thị cho đến khi host gắn lại ổ đĩa. Nếu cả hệ điều hành lẫn camera cùng ghi vào hệ thống tệp đồng thời, hệ điều hành sẽ thắng và ghi đè thay đổi của camera. Dùng thẻ SD cho bất kỳ dữ liệu nào mà tập lệnh ghi lại, và gắn lại trước khi đọc các tệp đó từ host.

Ghi chú

Kênh đỏ của RGB LED người dùng có thể sáng ngắn trong khi host đang đọc hoặc ghi vào ổ lưu trữ USB — đây là chỉ báo hoạt động do firmware điều khiển, không phải lỗi.

Dung lượng lưu trữ

Nano RP2040 Connect xuất xưởng với:

  • /flash — hệ thống tệp FAT 14 MB, đọc/ghi.

Build Nano RP2040 không bao gồm ROMFS; đặt các module Python và mô hình (ML) trực tiếp trên /flash.

Thư viện phần mềm

Xem danh sách thư viện để biết danh sách đầy đủ các module — bao gồm những module dành riêng cho build Nano RP2040 Connect.