Arduino Nano RP2040 Connect

Uyarı

Bu kart artık desteklenmiyor. Arduino Nano RP2040 Connect için son OpenMV aygıt yazılımı sürümü 4.7.0‘dır. Bu hedef için başka aygıt yazılımı güncellemesi, hata düzeltmesi veya yeni özellik yayımlanmayacaktır. Aşağıdaki bilgiler, 4.7.0 veya öncesini çalıştıran kullanıcılar için korunmaktadır.

Arduino Nano RP2040 Connect, Raspberry Pi RP2040 üzerine kurulu 45 × 18 mm Arduino-Nano biçim faktöründe bir karttır — 133 MHz’de çalışan, 264 KB dahili SRAM’e sahip çift çekirdekli ARM Cortex-M0+. WiFi ve BLE, bir U-blox NINA-W102 modülünden gelir; ayrıca kartta bir LSM6DSOX 6 eksenli IMU ve bir MP34DT06 PDM mikrofonu bulunur. OpenMV aygıt yazılımı bunların tümünü MicroPython üzerinden çalıştırır.

Arduino Nano RP2040 Connect

Tam veri sayfası, fotoğraflar ve boyutlar için Arduino Nano RP2040 Connect ürün sayfasına bakın.

Öne çıkanlar

  • 133 MHz’de çift çekirdekli ARM Cortex-M0+ ve 264 KB dahili SRAM içeren Raspberry Pi RP2040.

  • 16 MB harici QSPI flash bellek.

  • 2.4 GHz Wi-Fi b/g/n ve Bluetooth 4.2 (BR/EDR + LE) sağlayan U-blox NINA-W102 modülü.

  • LSM6DSOX 6 eksenli IMU ve MP34DT06 PDM mikrofonu.

  • Güç, programlama ve bir CDC REPL için Micro USB konektörü.

  • Standart Nano başlıklarında 22 kullanıcı G/Ç piniTX/RX, D2D13 (dijital), A0A7 (analog).

Pin Dağılımı

Arduino Nano RP2040 Connect Pin Dağılımı

Pin referansı

Pin adı

Referans

İşlev

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

kartı sıfırlamak için kart üzerindeki RESET düğmesine basın veya GND’ye çekin

REC

3.3 V

BOOTSEL — RP2040 ROM önyükleyicisine (bootloader) girmek için güç verirken yüksek seviyeye çekin

LED_BUILTIN

D13 üzerindeki turuncu kullanıcı LED’i

LED_RED

RGB LED kırmızı kanalı

LED_GREEN

RGB LED yeşil kanalı

LED_BLUE

RGB LED mavi kanalı

Uyarı

Nano RP2040 Connect’in G/Ç pinleri yalnızca 3.3 V‘tur — 5 V toleranslı değildir. Bunlara 5 V uygulamak RP2040’a zarar verir.

Güç pinleri

  • VIN — 4 – 20 V giriş. Kartı, kart üzerindeki anahtarlamalı regülatör aracılığıyla besler. Ayrıca USB 5 V hattından bir diyot üzerinden de beslenir; böylece USB ve VIN birbirini geri beslemeden aynı anda mevcut olabilir.

  • +5V — varsayılan olarak bağlı değildir.

  • +3V3 — 3.3 V regülatör çıkışı.

  • AREF — analog referans pini. Bu kartta RP2040’a bağlı değildir — ADC her zaman 3.3 V‘a referanslanır.

  • GND — ortak toprak.

Nano RP2040 Connect iki yoldan biriyle beslenebilir:

  • Micro USB — kart üzerindeki regülatöre 5 V sağlar.

  • VIN pini — regüle edilmiş 4 – 20 V’luk bir kaynak uygulayın.

Not

Kartın altındaki bir lehim köprüsü +5V‘i USB 5 V hattına bağlar. +5V başlık pininin gerçekten 5 V taşıması için bunu kapatın.

Not

Kart üzerindeki 4–20 V anahtarlamalı regülatörün çıkışındaki normalde kapalı bir lehim köprüsü, regülatörü devre dışı bırakmak için kesilebilir; böylece kart, +3V3 üzerindeki harici bir 3.3 V kaynaktan doğrudan beslenebilir.

Kurtarma ve hata ayıklama pinleri

  • RESET — hem açıkta bir lehim padi hem de kartın üst tarafında, RP2040’ın NRST hattına bağlı anlık bir RESET düğmesi. Sıfırlamak için GND’ye çekin veya düğmeye basın.

  • REC — açıkta bir lehim padi. Güç verirken (veya RESET’e basarken) REC‘i yüksek seviyede tutmak RP2040’ı ROM önyükleyicisine (bootloader) sokar; kart, RPI-RP2 adlı bir USB yığın depolama sürücüsü olarak yeniden numaralandırılır ve bir .uf2 aygıt yazılımı imajını kabul eder.

Nano RP2040 Connect, Arduino’nun önyükleyicisine (bootloader) girmek için Arduino’nun standart çift dokunuşlu sıfırlama yöntemini kullanır. RESET düğmesine hızlıca iki kez basın — kart, USB üzerinden bir UF2 cihazı olarak yeniden numaralandırılır ve OpenMV IDE yeni bir aygıt yazılımı imajını flash belleğe yazabilir.

RP2040’ın SWD sinyalleri, NINA modülünün hemen altında, kartın arkasındaki kaplamalı padlerde açıktadır. Tüm hata ayıklama sinyalleri 3.3 V referanslıdır.

Kart üzerindeki çevre birimleri

LED’ler

Nano RP2040 Connect’in, baskı yazıyla belirtilen LED_RED, LED_GREEN ve LED_BLUE kanalları üzerinden sürülen bir kullanıcı RGB LED’i — ayrıca D13 üzerinde ayrı bir turuncu LED_BUILTIN bulunur. Dördü de machine.LED üzerinden yazılımla denetlenebilir:

from machine import LED

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

Kart üzerindeki ayrı bir yeşil güç LED’i, +3.3 V hattı çalıştığında yanar ve kullanıcı tarafından denetlenemez.

Kamera sensörü

Nano RP2040 Connect üzerindeki OpenMV aygıt yazılımı, OmniVision OV7670 paralel CMOS sensörünü destekler. Kartta kart üzerinde görüntü sensörü yoktur — aşağıda listelenen baskı yazılı başlık pinlerine bir OV7670 modülü bağlayın ve onu csi — kamera sensörleri modülü üzerinden sürün:

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, 14 pin kullanır. Aygıt yazılımı bunları aşağıdaki gibi bağlar:

Sensör sinyali

Nano RP2040 pini

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’in I²C kontrol veriyolu, I²C 0 üzerindeki kart üzerindeki IMU ve ATECC608A ile paylaşılır. Sensör, 7 bitlik 0x21 adresinde bulunur — veriyolu 0 üzerindeki kullanıcı cihazları, kamera bağlıyken bu adresten de kaçınmalıdır.

IMU

Kart üzerindeki LSM6DSOX 6 eksenli ivmeölçer + jiroskop, I2C0 üzerinde bulunur. rp2 portunun machine.I2C(0) çağrısı varsayılan olarak farklı bir pin kümesi kullanır; bu nedenle baskı yazılı SDA/SCL padlerini açıkça geçirin. Donmuş (frozen) lsm6dsox.LSM6DSOX sürücüsünü kullanın:

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)

Mikrofon

Kart üzerindeki MP34DT06 PDM mikrofonu, RP2040’ın PIO bloklarından biri kullanılarak audio — Audio Modülü üzerinden yakalanır:

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

Kart üzerindeki NINA-W102 modülü, network — ağ yapılandırması üzerinden bir istasyon arabirimi olarak sunulur:

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

Aynı NINA modülü Bluetooth 4.2 LE’yi de sunar. asyncio dostu BLE için aioble — Asenkron BLE kullanın — örneğin, bir çevre birimi olarak yayın yapın ve bir merkezin bağlanmasını bekleyin:

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

Veriyolu referansı

GPIO

Baskı yazılı pinlerden herhangi birini okumak veya sürmek için machine.Pin kullanın. Çıkışlar 3.3 V CMOS’tur; tüm GPIO’lar arasında toplam 50 mA çekiş kapasitesi vardır.

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

Herhangi bir giriş pini, kenar geçişlerinde bir kesme de tetikleyebilir:

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

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

UART

Veriyolu

TX

RX

UART0

TX

RX

Baskı yazılı TX/RX adlarını machine.UART ile kullanın:

from machine import UART

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

Not

machine.UART(1) mevcuttur ancak kart üzerindeki NINA-W102 modülü (BLE bağlantısı) için ayrılmıştır; doğrudan kullanmayın.

I²C

Veriyolu

SDA

SCL

I2C0

SDA / A4

SCL / A5

I2C1

A0

A1

Her iki veriyolunun da pinlerinin machine.I2C‘ye açıkça geçirilmesi gerekir:

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

Kart üzerindeki iki yonga veriyolu 0‘ı paylaşır — bu veriyolundaki kullanıcı cihazları onların adreslerinden kaçınmalıdır:

  • 0x6A — LSM6DSOX IMU

  • 0x60 — ATECC608A-MAHDA-T

A0/A1‘i I²C olarak kullanmak onları veriyolu için tüketir, bu nedenle aynı anda ADC girişi olamazlar.

Not

SDA / SCL padlerinin (veriyolu 0) kart üzerinde 3.3 V’a çekme dirençleri vardır; bu nedenle o veriyolundaki cihazlar için harici çekme direnci gerekmez. A0 / A1 (veriyolu 1) bunlara sahip değildir — veriyolu 1’i kullanırken harici çekme dirençleri ekleyin.

Aynı donanım, başka bir I²C denetleyicisine bir bellek bölgesi sunmak için machine.I2CTarget aracılığıyla hedef (slave) modunda da kullanılabilir:

from machine import I2CTarget

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

SPI

Veriyolu

MOSI

MISO

SCK

CS

SPI0

D11

D12

D13

D10

rp2 portu bu kartta SPI0’ın pinlerini önceden yapılandırmaz, bu nedenle veriyolunu oluştururken baskı yazılı padleri açıkça geçirin:

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 aynı zamanda turuncu LED_BUILTIN görevi görür — bu veriyolunda SPI sürmek LED’i veriyolu saatiyle senkronize olarak yanıp söndürür.

Not

machine.SPI(1) mevcuttur ancak kart üzerindeki NINA-W102 modülü (Wi-Fi/BLE SPI bağlantısı) için ayrılmıştır; doğrudan kullanmayın.

ADC

RP2040, A0–A3 üzerinde açıkta dört adet 12 bitlik ADC kanalına sahiptir; hepsi 3.3 V referanslıdırread_u16, pin üzerinde 0–3.3 V arasında 0–65535 değerini döndürür. Kartın AREF pini bağlı değildir, bu nedenle referans her zaman 3.3 V’tur:

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

Dilim / kanal

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

Bunlardan herhangi birini machine.PWM üzerinden sürün:

from machine import Pin, PWM

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

Not

Birkaç pin PWM dilim kanallarını paylaşır:

  • PWM0 A TX ve D4 üzerindedir.

  • PWM0 B RX ve D5 üzerindedir.

  • PWM2 A D8 ve D12 üzerindedir.

  • PWM2 B D9 ve D10 üzerindedir.

  • PWM6 A D16/A2 ve D18/A4/SDA üzerindedir.

  • PWM6 B D17/A3 ve D19/A5/SCL üzerindedir.

Her dilim kanalı için bir tüketici seçin. Aynı dilim içindeki A ve B kanalları periyotlarını (frekanslarını) paylaşır ancak her birinin kendi görev döngüsü (duty cycle) vardır.

Yazılımla bit-banging yapılan veriyolları

Ekstra bir veriyoluna ihtiyacınız olursa machine.SoftI2C ve machine.SoftSPI herhangi bir GPIO üzerinde çalışır.

Termal sensör (kart dışı)

Aygıt yazılımı, harici olarak bağlanan bir AMG8833 8×8 termal görüntüleyici için fir — termal sensör sürücüsü (fir == far infrared) sürücüsünü içerir. Modülü aşağıda listelenen I²C veriyoluna bağlayın, ardından fir.init() + fir.snapshot() ile çerçeveleri okuyun:

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 sürücüsü sensörle yalnızca I²C 0 üzerinden konuşur — modülü baskı yazılı SCL / SDA padlerine bağlayın. Sensörün 7 bitlik adresi (0x69), o veriyolundaki başka hiçbir cihaz tarafından kullanılmamalıdır.

Zamanlama

time

time modülü, bloklayıcı gecikmeleri, monoton tikleri ve geçen süre ölçümünü kapsar:

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)

Sanal zamanlayıcılar

machine.Timer, bir donanım zamanlayıcı yuvasını tüketmeden periyodik veya tek seferlik geri çağırmalar (callback) zamanlar. Sanal (yazılımsal) bir zamanlayıcı kullanmak için id olarak -1 geçirin:

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

Periyot değerleri milisaniye cinsindendir. Yuvayı durdurup serbest bırakmak için deinit() çağırın.

Gerçek zamanlı saat

machine.RTC, sıfırlamalar boyunca duvar saati zamanını korur. RP2040’ın RTC’si yonga üzerindeki osilatöre bağlıdır ve tam güç kaybına dayanmaz — uygulamanız için önemliyse her soğuk açılışta zamanı ayarlayı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())

Bekçi köpeği (Watchdog)

machine.WDT, uygulama takılırsa kartı sıfırlar. Bir kez başlatıldıktan sonra durdurulamaz veya yeniden yapılandırılamaz — ana döngünüzün içinde onu periyodik olarak besleyin:

from machine import WDT

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

Önyükleme ve çalışma zamanı bilgileri

Aygıt yazılımı güncellemesi (UF2)

Nano RP2040 Connect, Arduino’nun önyükleyicisine (bootloader) girmek için Arduino’nun standart çift dokunuşlu sıfırlama yöntemini kullanır. Sıfırlama düğmesine hızlıca iki kez basın — kart, USB üzerinden bir UF2 cihazı olarak yeniden numaralandırılır ve OpenMV IDE yeni bir aygıt yazılımı imajını flash belleğe yazabilir.

Çalışan bir betik, machine.bootloader() çağırarak istek üzerine önyükleyiciye (bootloader) yeniden girebilir:

import machine

machine.bootloader()

Dosya sistemi ve önyükleme sırası

Nano RP2040 Connect aygıt yazılımı, önyüklemede tek bir dosya sistemi bağlar:

  • Dahili flash bellek — her zaman /flash konumunda bağlanır ve çalışma dizini olarak kullanılır. Varsayılan olarak main.py ve README.txt dosyalarını tutar; ilk önyüklemede oluşturulur.

Bağlamadan sonra, yorumlayıcı betikleri /flash konumundan çalıştırır:

  • boot.py, her yazılımsal sıfırlamada çalıştırılır.

  • main.py, yalnızca soğuk açılışta, boot.py‘den hemen sonra çalıştırılır.

Yeni flash belleğe yazılmış bir kartla gönderilen varsayılan main.py, yalnızca kullanıcı RGB LED’inin mavi kanalını bir kalp atışı olarak yanıp söndürür (iki kısa darbe, kısa boşluk); böylece herhangi bir ana bilgisayar bağlı olmadan aygıt yazılımının düzgün önyüklendiğini anlayabilirsiniz.

USB üzerinden bağlandığında, /flash ana bilgisayarda bir USB yığın depolama sürücüsü olarak numaralandırılır; bu sayede boot.py, main.py ve diğer dosyaları doğrudan düzenleyebilirsiniz. Ana bilgisayarın önbelleğe alınmış yazmalarını boşaltması için kartı sıfırlamadan önce sürücüyü çıkarın.

Not

İşletim sistemi sürücüyü pasif bir blok cihazı olarak ele aldığından, kamerada çalışan kod tarafından oluşturulan veya değiştirilen dosyalar, ana bilgisayar sürücüyü yeniden bağlayana kadar görünmez. Hem işletim sistemi hem de kamera aynı dosya sistemine aynı anda yazarsa, işletim sistemi kazanır ve kamera tarafından yapılan değişiklikleri üzerine yazar. Betiğin geri yazdığı veriler için SD kartı kullanın ve bu dosyaları ana bilgisayardan okumadan önce yeniden bağlayın.

Not

Ana bilgisayar USB yığın depolama sürücüsünden okurken veya sürücüye yazarken kullanıcı RGB LED’inin kırmızı kanalı kısa süreliğine yanabilir — bu, bir arıza değil, aygıt yazılımı tarafından sürülen bir etkinlik göstergesidir.

Depolama boyutları

Nano RP2040 Connect şunlarla gönderilir:

  • /flash14 MB FAT dosya sistemi, okuma/yazma.

Nano RP2040 derlemesi bir ROMFS içermez; Python modüllerini ve ML modellerini doğrudan /flash üzerinde gönderin.

Yazılım kütüphaneleri

Modüllerin tam listesi için — Nano RP2040 Connect derlemesine özgü olanlar dahil — kütüphane dizinine bakın.