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.
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/Ç pini —
TX/RX,D2–D13(dijital),A0–A7(analog).
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 |
— |
|
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
VINbirbirini 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-RP2adlı bir USB yığın depolama sürücüsü olarak yeniden numaralandırılır ve bir.uf2aygı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 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
D6 |
|
D7 |
|
HSYNC |
|
VSYNC |
|
PXCLK |
|
MXCLK |
|
POWER |
|
RESET |
|
SCL |
|
SDA |
|
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 |
|
|
I2C1 |
|
|
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 IMU0x60— 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ır — read_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
TXveD4üzerindedir.PWM0 B
RXveD5üzerindedir.PWM2 A
D8veD12üzerindedir.PWM2 B
D9veD10üzerindedir.PWM6 A
D16/A2veD18/A4/SDAüzerindedir.PWM6 B
D17/A3veD19/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
/flashkonumunda bağlanır ve çalışma dizini olarak kullanılır. Varsayılan olarakmain.pyveREADME.txtdosyaları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:
/flash— 14 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.