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 製品ページ を参照してください。
主な特長¶
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/n と Bluetooth 4.2(BR/EDR + LE)を提供。
LSM6DSOX 6 軸 IMU と MP34DT06 PDM マイク。
電源供給、プログラミング、CDC REPL のための Micro USB コネクタ。
標準 Nano ヘッダー上の 22 本のユーザー I/O ピン —
TX/RX、D2–D13(デジタル)、A0–A7(アナログ)。
ピン配置¶
ピンリファレンス¶
ピン名 |
リファレンス |
機能 |
|---|---|---|
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 |
— |
|
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 を押している間)に
RECを High に保持すると、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_RED、LED_GREEN、LED_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 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
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/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()
注釈
オンボードの 2 つのチップが バス 0 を共有しています — このバス上のユーザーデバイスは、それらのアドレスを避ける必要があります:
0x6A— LSM6DSOX IMU0x60— 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 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上にあります。
スライスチャンネルごとに 1 つのコンシューマを選択してください。同じスライス内のチャンネル A と B は周期(周波数)を共有しますが、それぞれ独自のデューティサイクルを持ちます。
ソフトウェアビットバンギングバス¶
追加のバスが必要な場合は、machine.SoftI2C と machine.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.pyとREADME.txtを保持し、最初のブート時に作成されます。
マウント後、インタプリタは /flash からスクリプトを実行します:
boot.pyは すべての ソフトリセット時に実行されます。main.pyは コールドブート時のみ、boot.pyの直後に実行されます。
新しくフラッシュされたボードに同梱されるデフォルトの main.py は、ハートビートとしてユーザー RGB LED の 青 チャンネルを点滅させるだけです(2 回の短いパルス、短い間隔)。これにより、ホストを接続しなくてもファームウェアが正常にブートしたことを確認できます。
USB 経由で接続すると、/flash がホスト上で USB マスストレージドライブとして列挙され、boot.py、main.py、その他のファイルを直接編集できます。ボードをリセットする前にドライブを取り出してください — そうすることでホストがキャッシュされた書き込みをフラッシュします。
注釈
OS はこのドライブを受動的なブロックデバイスとして扱うため、カメラ上で実行されるコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS とカメラが同じファイルシステムに同時に書き込むと、OS が優先され、カメラによる変更が上書きされます。スクリプトが書き戻すデータには SD カードを使用し、それらのファイルをホストから読み取る前に再マウントしてください。
注釈
ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED の 赤 チャンネルが一時的に点灯することがあります — これはファームウェア駆動のアクティビティインジケータであり、故障ではありません。
ストレージサイズ¶
Nano RP2040 Connect には以下が同梱されています:
/flash— 14 MB の FAT ファイルシステム、読み書き可能。
Nano RP2040 ビルドには ROMFS は含まれていません。Python モジュールと ML モデルは /flash に直接配置してください。
ソフトウェアライブラリ¶
モジュールの完全なリスト(Nano RP2040 Connect ビルド固有のものを含む)については、ライブラリインデックス を参照してください。