⚙️ برنامهنویسی رزبری پای پیکو با زبان آردوینو (C++ و هستهی arduino-pico)
رزبری پای پیکو معمولاً با میکروپایتون معرفی میشود، ولی اگر آردوینو را بلدی، لازم نیست زبان تازه یاد بگیری. با یک «هسته» (Core) در Arduino IDE میتوانی رزبری پای پیکو را با زبان آردوینو، یعنی همان C++ با setup و loop و digitalWrite، برنامهنویسی کنی و از سرعت ۱۳۳ مگاهرتزی و ۲۶۴ کیلوبایت RAM آن استفاده کنی. در این آموزش هستهی محبوب arduino-pico را نصب میکنیم، شمارهگذاری پایهها را یاد میگیریم و یک دیمر LED با چشمکزن غیرمسدود مینویسیم. کد را هم بدون برد در شبیهساز امتحان میکنیم.
چرا پیکو با C++؟
- سرعت: کد کامپایلشدهی C++ در حلقههای تنگ چند ده برابر سریعتر از میکروپایتون است؛ برای تولید سیگنال، خواندن سریع سنسور یا کنترل موتور مهم است.
- کتابخانهها: بخش بزرگی از کتابخانههای آردوینو (Servo، Adafruit_NeoPixel، کتابخانههای نمایشگر و سنسور) روی این هسته کامپایل میشوند.
- کد آشنا: پروژهای که روی آردوینو Uno نوشتهای، با عوض کردن شمارهی پایهها معمولاً روی پیکو هم اجرا میشود.
مقایسهی کامل دو زبان را در میکروپایتون یا C++ آردوینو؟ نوشتهایم.
نصب هستهی arduino-pico در Arduino IDE
- Arduino IDE نسخهی ۲ را باز کن و از File و Preferences به قسمت Additional boards manager URLs برو.
- این نشانی را اضافه کن (اگر نشانی ESP32 هم آنجاست، با ویرگول جدا کن):
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json - از Tools، Board و Boards Manager عبارت pico را جستوجو کن و بستهی Raspberry Pi Pico/RP2040/RP2350 (نوشتهی Earle F. Philhower) را Install کن.
- از Tools و Board، برد Raspberry Pi Pico را انتخاب کن (یا Pico W و Pico 2 اگر برد تو آن است).
این مراحل خیلی شبیه نصب ESP32 است؛ اگر آن را انجام دادهای، در نصب ESP32 در آردوینو IDE همین منطق را دیدهای. نشانی Boards Manager از سرورهای GitHub دانلود میشود و روی بعضی اینترنتها کند است؛ اگر نصب نیمهکاره ماند، دوباره تلاش کن.
اولین آپلود: یک بار با BOOTSEL
پیکوی نو (یا پیکویی که میکروپایتون رویش است) هنوز برنامهی آردوینو را نمیشناسد. برای اولین آپلود، دکمهی BOOTSEL را نگه دار، کابل USB را وصل کن و بعد رها کن. در Arduino IDE قسمت Port را روی UF2 Board بگذار و Upload را بزن. از دفعهی بعد یک پورت سریال معمولی (مثلاً COM6) ظاهر میشود و IDE خودش برد را ریست و برنامهریزی میکند. یادت باشد آپلود برنامهی آردوینو، میکروپایتون را پاک میکند؛ برای برگشت، فایل UF2 میکروپایتون را دوباره با BOOTSEL بریز (روشش در نصب میکروپایتون و Thonny آمده).
شمارهگذاری پایهها
| در کد | یعنی |
|---|---|
15 | GP15 (پایهی فیزیکی ۲۰)؛ همیشه شمارهی GP را بنویس، نه شمارهی فیزیکی |
A0، A1، A2 | GP26، GP27، GP28؛ تنها پایههای آنالوگ در دسترس |
LED_BUILTIN | GP25 روی پیکوی معمولی |
Serial | سریال USB برای سریال مانیتور |
Serial1 | UART0 روی GP0 (TX) و GP1 (RX) |
همهی پایهها ۳٫۳ ولتیاند و analogWrite روی همهی GPها PWM میدهد، نه فقط چند پایهی خاص مثل Uno. نقشهی کامل در پین اوت رزبری پای پیکو است.
قطعهها و سیمکشی
- رزبری پای پیکو
- یک پتانسیومتر ۱۰ کیلواهم
- یک LED با مقاومت ۲۲۰ اهم
| قطعه | پایهی پیکو |
|---|---|
| پایهی وسط پتانسیومتر | GP26 (A0)، پایهی فیزیکی ۳۱ |
| دو پایهی کناری پتانسیومتر | 3V3(OUT) و GND |
| آند LED از راه مقاومت | GP15 |
| کاتد LED | GND |
کد کامل
// Raspberry Pi Pico + Arduino core (arduino-pico):
// the knob on GP26 (A0) dims the LED on GP15,
// and the on-board LED blinks without delay().
const int LED_PIN = 15; // GP15
const int POT_PIN = A0; // GP26
unsigned long lastBlink = 0;
bool boardLed = false;
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT); // GP25 on the plain Pico
}
void loop() {
int raw = analogRead(POT_PIN); // 0..1023 by default
analogWrite(LED_PIN, raw / 4); // 0..255
if (millis() - lastBlink >= 500) {
lastBlink = millis();
boardLed = !boardLed;
digitalWrite(LED_BUILTIN, boardLed ? HIGH : LOW);
Serial.print("pot: ");
Serial.println(raw);
}
delay(20);
}
توضیح خط به خط
const int LED_PIN = 15: یعنی GP15. همان عددی که کنار پایه روی برد با GP نوشته شده.A0: روی پیکو برابر GP26 است. میتوانی26هم بنویسی، ولیA0خواناتر است.Serial.begin(115200): روی پیکو سریال از خود USB میگذرد و عدد baud عملاً اهمیتی ندارد، ولی نوشتنش عادت خوبی است و کد را با بردهای دیگر سازگار نگه میدارد.analogRead(POT_PIN): بهطور پیشفرض عدد ۰ تا ۱۰۲۳ میدهد، مثل Uno. اگر دقت کامل ADC ۱۲ بیتی را میخواهی، درsetupبنویسanalogReadResolution(12)تا بازه ۰ تا ۴۰۹۵ شود.analogWrite(LED_PIN, raw / 4): PWM با بازهی پیشفرض ۰ تا ۲۵۵. تقسیم بر ۴ بازهی ۱۰ بیتی را به ۸ بیتی تبدیل میکند.millis() - lastBlink >= 500: الگوی معروف «بدون delay». LED داخلی هر نیم ثانیه عوض میشود، ولی چون منتظر نمیمانیم، دیمر همیشه بلافاصله به چرخاندن پتانسیومتر جواب میدهد.delay(20): یک مکث کوتاه تا سریال مانیتور شلوغ نشود؛ آنقدر کوتاه است که حس نمیشود.
setup1() و loop1() را هم بنویسی، روی هستهی دوم همزمان اجرا میشوند. این قابلیت را روی برد واقعی امتحان کن؛ شبیهساز فقط یک setup و loop را اجرا میکند.اجرا در شبیهساز
در تینکرکد فارسی پروژهی آمادهی دیمر LED با رزبری پای پیکو همین مدار را با کد C++ دارد. شبیهساز پیکو را به سبک arduino-pico اجرا میکند: GP0 تا GP28، A0 تا A2 روی GP26 تا GP28، LED_BUILTIN روی GP25، analogReadResolution و سریال مانیتور. پتانسیومتر را در صحنه بچرخان و نور LED و عددهای سریال را ببین. اگر همین دیمر را با میکروپایتون میخواهی، دیمر LED با MicroPython را باز کن و دو کد را کنار هم بگذار. برد پیکو جزو اشتراک پلاس است: مثالها برای خواندن رایگان باز میشوند و برای اجرا پلاس لازم داری. اگر با آردوینو تازهکاری، درسهای پایه روی Uno برای همیشه رایگاناند.
اشکالهای رایج
- پورت در Arduino IDE دیده نمیشود: اولین آپلود باید در حالت BOOTSEL و با پورت UF2 Board انجام شود. کابل فقط-شارژ هم مقصر همیشگی است.
- LED روی پایهی اشتباه روشن میشود: شمارهی فیزیکی پایه را نوشتهای. GP15 پایهی فیزیکی ۲۰ است؛ در کد بنویس 15.
- analogRead روی پایهی دیگر عدد بیمعنی میدهد: فقط GP26 تا GP28 آنالوگاند. روی پیکو A3 و A4 و A5 مثل Uno وجود ندارند.
- LED_BUILTIN روی Pico W چشمک نمیزند: برد را در Tools روی Raspberry Pi Pico W گذاشتهای؟ LED آن مدل به تراشهی وایفای وصل است و هسته فقط با انتخاب برد درست آن را میشناسد.
- ماژول ۵ ولتی رفتار عجیب دارد: پایههای پیکو ۳٫۳ ولتیاند؛ خروجی ۵ ولت ماژول را مستقیم به آنها نده.
اگر هنوز بین پیکو و بردهای دیگر مرددی، پیکو، ESP32 یا آردوینو؟ را بخوان. برای امکانات شبیهسازی این برد صفحهی رزبری پای پیکو را ببین.
دیمر C++ پیکو را در شبیهساز باز کن ⚙️سؤالهای رایج
در کد آردوینوی پیکو پایه را با چه عددی صدا بزنم؟
با شمارهی GP، نه شمارهی فیزیکی. یعنی برای GP15 مینویسی 15. پایههای آنالوگ هم A0 تا A2 هستند که همان GP26 تا GP28 است و LED_BUILTIN روی پیکوی معمولی GP25 است.
هستهی arduino-pico بهتر است یا Arduino Mbed OS RP2040؟
هر دو کار میکنند، ولی هستهی arduino-pico (از Earle Philhower) امکانات بیشتری مثل پشتیبانی کامل از Pico W و Pico 2 و استفادهی ساده از هستهی دوم دارد و بیشتر آموزشها بر پایهی آناند.
analogRead روی پیکو چه عددی میدهد؟
بهطور پیشفرض، برای سازگاری با آردوینو، عددی بین 0 تا 1023. ADC پیکو ۱۲ بیتی است و با analogReadResolution(12) بازهی 0 تا 4095 را میگیری.
مقالههای مرتبط
میکروپایتون یا C++ آردوینو؟ مقایسهی کامل برای انتخاب زبان میکروکنترلر
اولین برنامهی میکروپایتون روی رزبری پای پیکو: چشمکزن با machine.Pin
دکمه و وقفه (IRQ) با میکروپایتون روی رزبری پای پیکو
ماژول ساعت DS3231 با آردوینو: ساعت و تاریخی که با قطع برق هم گم نمیشود
همهی آموزشهای رزبری پای پیکو و میکروپایتون ← · همهی مقالهها