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 を中心に構成されています。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 フラッシュ

  • U‑blox NINA‑W102 モジュールにより、2.4 GHz Wi‑Fi b/g/nBluetooth 4.2(BR/EDR + LE)を提供。

  • LSM6DSOX 6 軸 IMU と MP34DT06 PDM マイク。

  • 電源供給、プログラミング、CDC REPL のための Micro USB コネクタ。

  • 標準 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 — 電源投入時に 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 スイッチングレギュレータの出力にある通常クローズのはんだジャンパを切断すると、レギュレータを無効にできます。これにより、+3V3 上の外部 3.3 V 電源から直接ボードに電源を供給できます。

リカバリーおよびデバッグピン

  • RESET — 露出したパッドと、ボード上面のモーメンタリ RESET ボタンの両方があり、RP2040 の NRST ラインに接続されています。GND に引き下げるかボタンを押してリセットします。

  • REC — 露出したパッド。電源投入時(または RESET を押している間)に RECHigh に保持すると、RP2040 が ROM ブートローダーに入ります。ボードは RPI-RP2 という名前の USB マスストレージドライブとして再列挙され、.uf2 ファームウェアイメージを受け入れます。

Nano RP2040 Connect は、Arduino 標準の ダブルタップリセット を使用して Arduino のブートローダーに入ります。RESET ボタンを素早く 2 回押すと、ボードが UF2 デバイスとして USB 経由で再列挙され、OpenMV IDE が新しいファームウェアイメージをフラッシュできるようになります。

RP2040 の SWD 信号は、NINA モジュールのすぐ下、ボード裏面のメッキパッドに露出しています。すべてのデバッグ信号は 3.3 V 基準 です。

オンボードペリフェラル

LED

Nano RP2040 Connect には、シルクスクリーン印刷された LED_REDLED_GREENLED_BLUE の各チャンネルで駆動されるユーザー RGB LED と、D13 上の独立したオレンジの LED_BUILTIN があります。これら 4 つすべては 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 パッドを明示的に渡してください。フリーズされた 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 ブロックの 1 つを使用して 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()

注釈

オンボードの 2 つのチップが バス 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 上に公開された 4 つの 12 ビット ADC チャンネルがあり、すべて 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 上にあります。

スライスチャンネルごとに 1 つのコンシューマを選択してください。同じスライス内のチャンネル A と B は周期(周波数)を共有しますが、それぞれ独自のデューティサイクルを持ちます。

ソフトウェアビットバンギングバス

追加のバスが必要な場合は、machine.SoftI2Cmachine.SoftSPI が任意の GPIO で動作します。

サーマルセンサー(外付け)

ファームウェアには、外部配線された AMG8833 8×8 サーマルイメージャ用の fir --- 熱センサードライバー(fir == 遠赤外線) ドライバが含まれています。以下に示す 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 のブートローダーに入ります。リセットボタンを素早く 2 回押すと、ボードが UF2 デバイスとして USB 経由で再列挙され、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 の チャンネルを点滅させるだけです(2 回の短いパルス、短い間隔)。これにより、ホストを接続しなくてもファームウェアが正常にブートしたことを確認できます。

USB 経由で接続すると、/flash がホスト上で USB マスストレージドライブとして列挙され、boot.pymain.py、その他のファイルを直接編集できます。ボードをリセットする前にドライブを取り出してください — そうすることでホストがキャッシュされた書き込みをフラッシュします。

注釈

OS はこのドライブを受動的なブロックデバイスとして扱うため、カメラ上で実行されるコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS とカメラが同じファイルシステムに同時に書き込むと、OS が優先され、カメラによる変更が上書きされます。スクリプトが書き戻すデータには SD カードを使用し、それらのファイルをホストから読み取る前に再マウントしてください。

注釈

ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED の チャンネルが一時的に点灯することがあります — これはファームウェア駆動のアクティビティインジケータであり、故障ではありません。

ストレージサイズ

Nano RP2040 Connect には以下が同梱されています:

  • /flash14 MB の FAT ファイルシステム、読み書き可能。

Nano RP2040 ビルドには ROMFS は含まれていません。Python モジュールと ML モデルは /flash に直接配置してください。

ソフトウェアライブラリ

モジュールの完全なリスト(Nano RP2040 Connect ビルド固有のものを含む)については、ライブラリインデックス を参照してください。