Arduino Nano RP2040 Connect

경고

이 보드는 더 이상 지원되지 않습니다. Arduino Nano RP2040 Connect용 마지막 OpenMV 펌웨어 릴리스는 4.7.0입니다. 이 타깃에 대해서는 더 이상 펌웨어 업데이트, 버그 수정, 새로운 기능이 제공되지 않습니다. 아래 정보는 4.7.0 이하 버전을 사용하는 사용자를 위해 보존되어 있습니다.

Arduino Nano RP2040 Connect는 Raspberry Pi RP2040을 중심으로 구성된 45 × 18 mm 크기의 Arduino-Nano 폼팩터 보드입니다. RP2040은 133 MHz로 동작하는 듀얼 ARM Cortex-M0+이며 264 KB의 내부 SRAM을 갖추고 있습니다. WiFi와 BLE는 U-blox NINA-W102 모듈에서 제공되며, 보드에는 LSM6DSOX 6축 IMU와 MP34DT06 PDM 마이크가 탑재되어 있습니다. OpenMV 펌웨어는 이 모든 장치를 MicroPython에서 제어합니다.

Arduino Nano RP2040 Connect

전체 데이터시트, 사진, 치수는 Arduino Nano RP2040 Connect 제품 페이지를 참조하세요.

주요 특징

  • Raspberry Pi RP2040 133 MHz 듀얼 ARM Cortex-M0+, 264 KB 내부 SRAM.

  • 16 MB 외부 QSPI 플래시.

  • 2.4 GHz Wi‑Fi b/g/nBluetooth 4.2 (BR/EDR + LE)를 제공하는 U‑blox NINA‑W102 모듈.

  • LSM6DSOX 6축 IMU와 MP34DT06 PDM 마이크.

  • 전원 공급, 프로그래밍, CDC REPL을 위한 Micro USB 커넥터.

  • 표준 Nano 헤더의 22개 사용자 I/O 핀TX/RX, D2D13 (디지털), 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 — 전원 인가 시 high로 당기면 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 스위칭 레귤레이터 출력에 있는 상시 닫힘(normally-closed) 솔더 점퍼를 끊으면 레귤레이터를 비활성화할 수 있어, +3V3에 외부 3.3 V 전원을 직접 연결하여 보드에 전원을 공급할 수 있습니다.

복구 및 디버그 핀

  • RESET — 보드 상단에 노출된 패드와 순간 동작 RESET 버튼이 모두 있으며, RP2040의 NRST 라인에 연결되어 있습니다. GND로 당기거나 버튼을 눌러 리셋합니다.

  • REC — 노출된 패드. 전원 인가 시(또는 RESET을 누르는 동안) REChigh로 유지하면 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에는 실크스크린으로 표시된 LED_RED, LED_GREEN, LED_BLUE 채널로 구동되는 사용자 RGB LED와, D13에 있는 별도의 주황색 LED_BUILTIN이 있습니다. 네 개 모두 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 제어 버스는 I²C 0에서 온보드 IMU 및 ATECC608A와 공유됩니다. 센서는 7비트 주소 0x21에 위치하므로, 카메라가 연결된 경우 버스 0의 사용자 장치도 이 주소를 피해야 합니다.

IMU

온보드 LSM6DSOX 6축 가속도계 + 자이로스코프는 I2C0에 연결되어 있습니다. rp2 포트의 machine.I2C(0)은 기본적으로 다른 핀 세트를 사용하므로, 실크스크린으로 표시된 SDA/SCL 패드를 명시적으로 전달하세요. 프로즌(frozen) 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 마이크는 RP2040의 PIO 블록 중 하나를 사용하여 audio — 오디오 모듈를 통해 캡처됩니다:

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도 노출합니다. asyncio 친화적인 BLE를 위해 aioble — 비동기 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/RXmachine.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에는 A0–A3에 노출된 12비트 ADC 채널 4개가 있으며, 모두 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 ATX D4에 있습니다.

  • PWM0 BRX D5에 있습니다.

  • PWM2 AD8 D12에 있습니다.

  • PWM2 BD9 D10에 있습니다.

  • PWM6 AD16/A2 D18/A4/SDA에 있습니다.

  • PWM6 BD17/A3 D19/A5/SCL에 있습니다.

슬라이스 채널당 하나의 소비처만 선택하세요. 동일한 슬라이스 내의 채널 A와 B는 주기(주파수)를 공유하지만 각각 고유한 듀티 사이클을 가집니다.

소프트웨어 비트뱅(bit-banged) 버스

추가 버스가 필요하면 machine.SoftI2Cmachine.SoftSPI가 모든 GPIO에서 동작합니다.

열 센서 (외장형)

펌웨어에는 외부 배선된 AMG8833 8×8 열화상 센서용 fir — 열 센서 드라이버 (fir == far infrared, 원적외선) 드라이버가 포함되어 있습니다. 아래에 나열된 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는 하드웨어 타이머 슬롯을 소비하지 않고 주기적 또는 일회성 콜백을 예약합니다. 가상(소프트웨어) 타이머를 사용하려면 id로 -1을 전달하세요:

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.pyboot.py 직후 콜드 부트 시에만 실행됩니다.

갓 플래시된 보드에 기본 제공되는 main.py는 사용자 RGB LED의 파란색 채널을 하트비트로 깜박일 뿐입니다(짧은 펄스 두 번, 짧은 간격). 따라서 호스트를 연결하지 않고도 펌웨어가 정상적으로 부팅되었는지 확인할 수 있습니다.

USB로 연결되면 /flash는 호스트에서 USB 대용량 저장 장치 드라이브로 열거되어 boot.py, main.py 및 기타 파일을 직접 편집할 수 있습니다. 보드를 리셋하기 전에 드라이브를 꺼내세요(eject) — 그래야 호스트가 캐시된 쓰기를 플러시합니다.

참고

OS는 이 드라이브를 수동 블록 장치로 취급하므로, 카메라에서 실행되는 코드가 생성하거나 수정한 파일은 호스트가 드라이브를 다시 마운트할 때까지 나타나지 않습니다. OS와 카메라가 동시에 동일한 파일시스템에 쓰면 OS가 우선하여 카메라가 변경한 내용을 덮어씁니다. 스크립트가 다시 기록하는 데이터에는 SD 카드를 사용하고, 호스트에서 해당 파일을 읽기 전에 다시 마운트하세요.

참고

호스트가 USB 대용량 저장 장치 드라이브에서 읽거나 쓰는 동안 사용자 RGB LED의 빨간색 채널이 잠깐 켜질 수 있습니다 — 이는 펌웨어가 구동하는 활동 표시기이며 오류가 아닙니다.

저장 용량

Nano RP2040 Connect는 다음을 기본 제공합니다:

  • /flash14 MB FAT 파일시스템, 읽기/쓰기.

Nano RP2040 빌드에는 ROMFS가 포함되어 있지 않으므로, Python 모듈과 ML 모델을 /flash에 직접 배치하세요.

소프트웨어 라이브러리

전체 모듈 목록 — Nano RP2040 Connect 빌드에만 고유한 모듈 포함 — 은 라이브러리 인덱스를 참조하세요.