Arduino Nano RP2040 Connect¶
Atenționare
Această placă nu mai este acceptată. Ultima versiune de firmware OpenMV pentru Arduino Nano RP2040 Connect este 4.7.0. Nu vor mai fi lansate actualizări de firmware, corecții de erori sau funcții noi pentru acest target. Informațiile de mai jos sunt păstrate pentru utilizatorii care rulează 4.7.0 sau o versiune anterioară.
Arduino Nano RP2040 Connect este o placă de 45 × 18 mm în formatul Arduino Nano, construită în jurul Raspberry Pi RP2040 — un procesor dual ARM Cortex‑M0+ care rulează la 133 MHz cu 264 KB de SRAM intern. WiFi și BLE provin de la un modul U‑blox NINA‑W102, iar placa include un IMU LSM6DSOX cu 6 axe și un microfon PDM MP34DT06. Firmware-ul OpenMV controlează toate acestea din MicroPython.
Pentru fișa tehnică completă, fotografii și dimensiuni, consultați pagina de produs Arduino Nano RP2040 Connect.
Caracteristici principale¶
Raspberry Pi RP2040 dual ARM Cortex‑M0+ la 133 MHz cu 264 KB SRAM intern.
16 MB memorie flash QSPI externă.
Modul U‑blox NINA‑W102 care oferă Wi‑Fi 2.4 GHz b/g/n și Bluetooth 4.2 (BR/EDR + LE).
IMU cu 6 axe LSM6DSOX și microfon PDM MP34DT06.
Conector Micro USB pentru alimentare, programare și un REPL CDC.
22 de pini I/O de utilizator pe headerele standard Nano —
TX/RX,D2–D13(digitali),A0–A7(analogici).
Pinout¶
Referință pini¶
Nume pin |
Referință |
Funcție |
|---|---|---|
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 |
apăsați butonul RESET de pe placă sau conectați la GND pentru a reseta |
REC |
3.3 V |
BOOTSEL — conectați la nivel logic înalt la pornire pentru a intra în bootloaderul ROM al RP2040 |
LED_BUILTIN |
— |
LED de utilizator portocaliu pe |
LED_RED |
— |
Canalul roșu al LED-ului RGB |
LED_GREEN |
— |
Canalul verde al LED-ului RGB |
LED_BLUE |
— |
Canalul albastru al LED-ului RGB |
Atenționare
Pinii I/O ai plăcii Nano RP2040 Connect sunt doar de 3.3 V — nu tolerează 5 V. Aplicarea a 5 V pe ei va deteriora RP2040.
Pini de alimentare¶
VIN — intrare 4 – 20 V. Alimentează placa prin regulatorul switching de pe placă. Este de asemenea alimentat printr-o diodă de la linia de 5 V a USB, astfel încât USB și
VINpot fi prezente în același timp fără a se alimenta reciproc înapoi.+5V — neconectat în mod implicit.
+3V3 — ieșirea regulatorului de 3.3 V.
AREF — pin de referință analogică. Nu este conectat la RP2040 pe această placă — ADC-ul este întotdeauna raportat la 3.3 V.
GND — masă comună.
Placa Nano RP2040 Connect poate fi alimentată pe oricare dintre căi:
Micro USB — furnizează 5 V regulatorului de pe placă.
Pin VIN — alimentați cu o sursă reglată de 4 – 20 V.
Notă
Un jumper de lipire de pe partea inferioară a plăcii face puntea între +5V și linia de 5 V a USB. Închideți-l pentru ca pinul header +5V să transporte efectiv 5 V.
Notă
Un jumper de lipire normal-închis de pe ieșirea regulatorului switching de 4–20 V de pe placă poate fi tăiat pentru a dezactiva regulatorul, astfel încât placa să poată fi alimentată direct dintr-o sursă externă de 3.3 V pe +3V3.
Pini de recuperare și depanare¶
RESET — atât un pad expus, cât și un buton RESET momentan în partea de sus a plăcii, conectat la linia NRST a RP2040. Conectați la GND sau apăsați butonul pentru a reseta.
REC — pad expus. Menținerea
RECla nivel logic înalt la pornire (sau în timp ce apăsați RESET) pune RP2040 în bootloaderul său ROM; placa se reenumerează ca o unitate de stocare USB numităRPI-RP2și acceptă o imagine de firmware.uf2.
Placa Nano RP2040 Connect utilizează resetarea standard prin dublu apăs a Arduino pentru a intra în bootloaderul Arduino. Apăsați rapid butonul RESET de două ori — placa se reenumerează prin USB ca dispozitiv UF2 și OpenMV IDE poate scrie o nouă imagine de firmware.
Semnalele SWD ale RP2040 sunt expuse pe pad-uri placate cu metal pe spatele plăcii, chiar sub modulul NINA. Toate semnalele de depanare sunt raportate la 3.3 V.
Periferice de pe placă¶
LED-uri¶
Placa Nano RP2040 Connect are un LED RGB de utilizator — controlat prin canalele serigrafiate LED_RED, LED_GREEN și LED_BLUE — plus un LED portocaliu separat LED_BUILTIN pe D13. Toate cele patru pot fi controlate prin software prin machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
LED("LED_BUILTIN").on()
Un LED verde separat de alimentare de pe placă se aprinde ori de câte ori linia de +3.3 V este activă și nu poate fi controlat de utilizator.
Senzor cameră¶
Firmware-ul OpenMV de pe placa Nano RP2040 Connect acceptă senzorul CMOS paralel OmniVision OV7670. Placa nu are senzor de imagine pe placă — conectați un modul OV7670 la pinii header serigrafiați listați mai jos și controlați-l prin modulul csi — senzori de cameră
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()
Notă
OV7670 ocupă 14 pini. Firmware-ul îi conectează astfel:
Semnal senzor |
Pin Nano RP2040 |
|---|---|
D0 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
Magistrala de control I²C a OV7670 este partajată cu IMU-ul de pe placă și cu ATECC608A pe I²C 0. Senzorul se află la adresa pe 7 biți 0x21 — dispozitivele de utilizator de pe magistrala 0 trebuie de asemenea să evite această adresă atunci când camera este conectată.
IMU¶
Accelerometrul + giroscopul cu 6 axe LSM6DSOX de pe placă se află pe I2C0. machine.I2C(0) al portului rp2 folosește în mod implicit un set diferit de pini, așa că transmiteți explicit pad-urile serigrafiate SDA/SCL. Folosiți driverul integrat 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)
Microfon¶
Microfonul PDM MP34DT06 de pe placă este captat prin audio — Modulul Audio folosind unul dintre blocurile PIO ale 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¶
Modulul NINA‑W102 de pe placă este expus prin network — configurarea rețelei ca interfață de tip 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¶
Același modul NINA expune de asemenea Bluetooth 4.2 LE. Folosiți aioble — BLE asincron pentru BLE compatibil cu asyncio — de exemplu, publicați placa ca periferic și așteptați conectarea unui central:
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())
Referință magistrale¶
GPIO¶
Folosiți machine.Pin pentru a citi sau a controla oricare dintre pinii serigrafiați. Ieșirile sunt CMOS de 3.3 V, cu absorbție totală de 50 mA pe toate GPIO-urile.
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())
Orice pin de intrare poate de asemenea declanșa o întrerupere la tranzițiile de muchie:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Magistrală |
TX |
RX |
|---|---|---|
UART0 |
TX |
RX |
Folosiți numele serigrafiate TX/RX cu machine.UART
from machine import UART
uart = UART(0, baudrate=115200)
uart.write("hello")
uart.read(5)
Notă
machine.UART(1) există, dar este rezervat pentru modulul NINA‑W102 de pe placă (legătura BLE); nu îl folosiți direct.
I²C¶
Magistrală |
SDA |
SCL |
|---|---|---|
I2C0 |
|
|
I2C1 |
|
|
Ambele magistrale au nevoie ca pinii lor să fie transmiși explicit către 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()
Notă
Două cipuri de pe placă partajează magistrala 0 — dispozitivele de utilizator de pe această magistrală trebuie să evite adresele lor:
0x6A— IMU LSM6DSOX0x60— ATECC608A‑MAHDA‑T
Folosirea A0/A1 ca I²C le ocupă pentru magistrală, astfel încât nu pot fi în același timp intrări ADC.
Notă
Pad-urile SDA / SCL (magistrala 0) au rezistențe pull-up pe placă către 3.3 V, deci nu sunt necesare pull-up-uri externe pentru dispozitivele de pe acea magistrală. A0 / A1 (magistrala 1) nu le au — adăugați pull-up-uri externe când folosiți magistrala 1.
Același hardware poate fi de asemenea folosit în mod target (slave) prin machine.I2CTarget pentru a expune o regiune de memorie către un alt controler I²C:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(0, addr=0x42, mem=buf)
SPI¶
Magistrală |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI0 |
D11 |
D12 |
D13 |
D10 |
Portul rp2 nu preconfigurează pinii SPI0 pe această placă, așa că transmiteți explicit pad-urile serigrafiate la crearea magistralei:
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)
Notă
D13 servește și ca LED portocaliu LED_BUILTIN — controlul SPI pe această magistrală va face LED-ul să clipească în ritmul ceasului magistralei.
Notă
machine.SPI(1) există, dar este rezervat pentru modulul NINA‑W102 de pe placă (legătura SPI Wi-Fi/BLE); nu îl folosiți direct.
ADC¶
RP2040 are patru canale ADC pe 12 biți expuse pe A0–A3, toate raportate la 3.3 V — read_u16 returnează 0–65535 pe intervalul 0–3.3 V la pin. Pinul AREF al plăcii nu este conectat, deci referința este întotdeauna 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¶
Pin |
Slice / canal |
|---|---|
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 |
Controlați oricare dintre ele prin machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D3"), freq=1_000, duty_u16=32768)
Notă
Mai mulți pini partajează canale de slice PWM:
PWM0 A se află pe
TXșiD4.PWM0 B se află pe
RXșiD5.PWM2 A se află pe
D8șiD12.PWM2 B se află pe
D9șiD10.PWM6 A se află pe
D16/A2șiD18/A4/SDA.PWM6 B se află pe
D17/A3șiD19/A5/SCL.
Alegeți un singur consumator pe canal de slice. Canalele A și B din cadrul aceluiași slice partajează perioada (frecvența), dar fiecare are propriul ciclu de funcționare.
Magistrale emulate software (bit‑banged)¶
machine.SoftI2C și machine.SoftSPI funcționează pe orice GPIO dacă aveți nevoie de o magistrală suplimentară.
Senzor termic (extern)¶
Firmware-ul include driverul fir — driver pentru senzori termici (fir == far infrared) pentru un imager termic AMG8833 8×8 conectat extern. Conectați modulul la magistrala I²C listată mai jos, apoi citiți cadre cu 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())
Driverul fir comunică cu senzorul doar prin I²C 0 — conectați modulul la pad-urile serigrafiate SCL / SDA. Adresa pe 7 biți a senzorului (0x69) nu trebuie folosită de niciun alt dispozitiv de pe acea magistrală.
Sincronizare¶
time¶
Modulul time acoperă întârzierile blocante, ticurile monotone și măsurarea timpului scurs:
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)
Temporizatoare virtuale¶
machine.Timer programează funcții de retroapelare (callback) periodice sau unice fără a consuma un slot de temporizator hardware. Transmiteți -1 ca id pentru a folosi un temporizator virtual (software):
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"))
Valorile perioadei sunt exprimate în milisecunde. Apelați deinit() pentru a opri și a elibera slotul.
Ceas în timp real¶
machine.RTC păstrează ora de perete între resetări. RTC-ul RP2040 este legat de oscilatorul de pe cip și nu supraviețuiește unei pierderi totale de alimentare — setați ora la fiecare pornire la rece dacă acest lucru contează pentru aplicația dvs.:
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 resetează placa dacă aplicația se blochează. Odată pornit, nu poate fi oprit sau reconfigurat — alimentați-l periodic în interiorul buclei principale:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informații despre boot și execuție¶
Actualizare firmware (UF2)¶
Placa Nano RP2040 Connect utilizează resetarea standard prin dublu apăs a Arduino pentru a intra în bootloaderul Arduino. Apăsați rapid butonul de resetare de două ori — placa se reenumerează prin USB ca dispozitiv UF2 și OpenMV IDE poate scrie o nouă imagine de firmware.
Un script în execuție poate reintra în bootloader la cerere apelând machine.bootloader()
import machine
machine.bootloader()
Sistem de fișiere și ordinea de boot¶
Firmware-ul Nano RP2040 Connect montează un singur sistem de fișiere la boot:
Memoria flash internă — întotdeauna montată la
/flashși folosită ca director de lucru. Conține în mod implicitmain.pyșiREADME.txt; creată la prima pornire.
După montare, interpretorul rulează apoi scripturile din /flash:
boot.pyeste executat la fiecare resetare soft.main.pyeste executat doar la pornirea la rece, imediat dupăboot.py.
Fișierul main.py implicit livrat pe o placă proaspăt programată doar face să clipească canalul albastru al LED-ului RGB de utilizator ca un puls de stare (două impulsuri scurte, pauză scurtă), astfel încât să puteți observa că firmware-ul a pornit corect fără niciun host conectat.
Când este conectat prin USB, /flash se enumeră ca o unitate de stocare USB pe host, permițându-vă să editați direct boot.py, main.py și orice alte fișiere. Ejectați unitatea înainte de a reseta placa pentru ca host-ul să golească scrierile sale din cache.
Notă
Deoarece sistemul de operare tratează unitatea ca un dispozitiv bloc pasiv, fișierele create sau modificate de codul care rulează pe cameră nu vor apărea decât după ce host-ul remontează unitatea. Dacă atât sistemul de operare, cât și camera scriu același sistem de fișiere în același timp, sistemul de operare va câștiga și va suprascrie modificările făcute de cameră. Folosiți cardul SD pentru orice date pe care scriptul le scrie înapoi și remontați înainte de a citi acele fișiere de pe host.
Notă
Canalul roșu al LED-ului RGB de utilizator se poate aprinde scurt în timp ce host-ul citește de pe sau scrie pe unitatea de stocare USB — acesta este un indicator de activitate controlat de firmware, nu o defecțiune.
Dimensiuni de stocare¶
Placa Nano RP2040 Connect este livrată cu:
/flash— sistem de fișiere FAT de 14 MB, citire/scriere.
Build-ul Nano RP2040 nu include un ROMFS; livrați modulele Python și modelele ML direct pe /flash.
Biblioteci software¶
Consultați indexul bibliotecii pentru lista completă de module — inclusiv cele care sunt specifice build-ului Nano RP2040 Connect.