Geek الکترونیک

شناخت رزبری پای پیکو و میکروکنترلر RP2040

نوشته شده توسط احسان وارسته

رزبری پای ها به کامپیوتر های تک بوردی(SBC) معروف هستند که عموما سیستم عامل لینوکس روی اونها نصب و راه اندازی میشه ولی نسخه جدید رزبری پای پیکو متفاوته! با اینکه هنوزم یه رزبری حساب میشه، نسخه پیکو وارد دنیایی شده که آردوینو، بوردهای آماده STM32 مثل بورد STM32 BluePill و ESP32 توش استانداردهارو از لحاظ قیمت، اکوسیستم نرم افزار یا قابلیت های اتصال تعریف میکنن و سر دم دار این حوزه بودن. رزبری پای پیکو یک پل بین کامپیوتر های تک بوردی پرقدرت لینوکسی و میکروکنترلر های نهفته (embedded) هست.

البته رزبری پای پیکو قرار نیست جای هیچ رزبری پای رو بگیره بلکه میتونه بعنوان یک افزونه برای رزبری پای دیگه کار کنه. توی این ویدئو مشخصات کلی پیکو رو میتونین ببینین:

هرچند اسمش رزبری پای هست، این یکی کلا چیز متفاوتی از بقیه است. رزبری پای پیکو از یک پردازنده ARM دو هسته ای قدرت میگیره و از کمترین مدارات جانبی استفاده میکنه تا بتونه یه بورد کوچیک و بدون هزینه اضافه باشه. تو نگاه اول شاید تصور کنید که همون رزبری پای زیرو (Zero) هست ولی اینطور نیست. پیکو از پردازنده Broadcom که تو نسخه های قبلی رزبری استفاده میشده استفاده نمیکنه. این یکی از یک چیپ با کد RP2040 استفاده میکنه که توسط خود بنیاد رزبری پای ساخته شده!

RP2040 یک میکروکنترلر آرم کورتکس M0+ هست (برای آشنایی با نحوه نامگذاری آرم ها خصوصا کورتکس ها این مقاله رو مطالعه کنین). متاسفانه این میکرو قابلیت پشتیبانی از لینوکس رو نداره. رزبری پای پیکو وارد دنیای میکروکنترلر ها شده، جایی که کامپیوترهای تک بوردی با معماری RISC-V (مثل GD32VF103) دارن به شدت مورد توجه قرار میگیرن و محبوب شدن. این یکی نسبت به بقیه خانوده اش خیلی ارزونه، حدودا 5 یورو که پیکو رو تو رنج قیمتی آردوینو نانو (Arduino Nano) قرار میده و خیلی از یک کیت ESP32 Pico ارزونتره. توی این مقاله میخوایم مشخصات و امکانات رزبری پای پیکو و RP2040 رو بررسی کنیم.

اول از همه، RP2040 از کجا اومده؟ خب RP مخفف Raspberry Pi هست، 2 برای تعداد هسته ها، 0 بعد از 2 نسخه کورتکس هست (M0)، 4 و 0 هم به ترتیب برای نمایش حافظه RAM و حافظه فلش استفاده شدن که 0 یعنی حافظه فلش داخلی نداره.

اولین نگاه به رزبری پای پیکو

همونطور که پیشتر اشاره شد، پیکو از یه میکروکنترلر با هسته ARM Cortex-M0+ بهره میبره که میتونه تا فرکانس کاری 133 مگاهرتز کار بکنه. میکروکنترلر های دوهسته ای Cortex-M زیاد غیرمعمول نیستن، ولی معمولا داخلشون دو تا Cortex-M0 ندارن، عوضش از یه هسته خیلی قدرتمندتری مثل M4 یا M7 یا تو نسخه های جدیدتر M33 بهره میبرند.

اطلاعات فنی درباره پیکو تو جدول زیر هست:

شاید یکی از مسائل اولیه آزار دهنده در مورد یه میکروکنترلر این باشه که حافظه فلش نداشته باشه! توی بورد پیکو یه آی سی NOR Flash دو مگابایتی با کد W25Q16 قرار داره که این کمبود RP2040 رو جبران کنه. RP2040 تا حداکثر 16 مگابایت حافظه رو پشتیبانی میکنه، پس افزایش حافظه فقط یه لحیم کاری ساده میخواد! بقیه امکانات پیکو شامل یک درگاه USB 1.1 میشه که میتونه هم بعنوان Slave و هم بعنوان Host استفاده بشه که نهایتا 12 مگابیت نرخ انتقال داده داره که اجازه میده دستگاه های USB بهش متصل بشن (بعنوان میزبان یا Host) یا خودش بعنوان یک دستگاه USB به یک میزبان (مثل کامپیوتر یا رزبری پای دیگه) متصل بشه.

طبق بلوک دیاگرام داخلی این میکروکنترلر یک حافظه ROM برای بوت (boot) داره که اجازه میده کاربر بتونه حافظه فلش متصل شده به بورد رو از طریق کامپیوتر بنویسه.برای اینکه نیاز به پروگرمر خاصی نباشه، بوت لودر بصورت یک حافظه فلش و یک درایو توی کامپیوتر دیده میشه و RP2040 خیلی راحت فقط با کپی کردن فایل های firmware به این درایو پروگرم میشه که راه خیلی راحت و بدون دردسریه.

مدار بالا بخش تغذیه رزبری پیکو رو نشون میده. خط تغذیه VBUS مستقیم به +5 ولت USB متصل شده و با یه دیود شاتکی D1 از VSYS جدا شده که کمک میکنه بتونیم ولتاژ های متفاوتی (از 1.8 ولت تا 5.5 ولت) رو به پین VSYS متصل کنیم. R1 و R10 یه تقسیم مقاومتی رو شکل دادن که ولتاژ پین GPIO24 رو برابر 0.358 ولتاژ ورودی یعنی 1.8 ولت میکنه و فقط برای شناسایی اتصال به USB کاربرد داره وگرنه خط تغذیه اصلی VSYS هست. آی سی RT6150B و مدارات جانبیش یک تغذیه سوئیچینگ باک-بوست رو تشکیل دادن که برای تغذیه بورد و فراهم کردن ولتاژ 3.3 ولت استفاده میشه. در مدارات زیر دو روش مختلف و امن که توسط خود دیتاشیت بورد پیشنهاد شدن رو مشاهده می بینید:

که در مدار سمت راست از یه ماسفت P-channel استفاده شده که (در صورتی که VBUS وجود داشت که یعنی با پورت USB به کامپیوتر یا یه Host دیگه متصل شده) ورودی منبع رو قطع بکنه و کار سوئیچ بین منبع ما و منبع VBUS رو انجام بده. در مدار سمت چپ هم از یک دیود شاتکی استفاده شده که در اینجا هم اگه VBUS وجود داشت و ولتاژش بیشتر از V ما بود (طبق قانون دیودها و کلا نیمه هادی های دوقطبی و تک اتصالی) دیود قطع میشه.

همونطور که میبینین تغذیه این بورد هم خیلی راحته، میتونین از یه آداپتور یا شارژر موبایل و کابل micro-USB برای تغذیه اش استفاده کنین. همچنین ولتاژهای از 1.8 تا 5.5 ولت رو از پین VSYS قبول میکنه که روی خود بورد یک مبدل سوئیچینگ DC/DC باک-بوست داره که وظیفه رگوله کردن ولتاژ رو بر عهده داره. این به کاربر اجازه میده که از یه باطری لینتیومی قابل شارژ یا دو تا سه تا باطری قابل شارژ NiMH هم استفاده کنه.

40 پین پیکو اطرافش قرار دارن که 26 تاش GPIO هست و 3 تا ورودی ADC هم در دسترس هست (تصویر بالا). بقیه پین ها فقط برای تغذیه و زمین هستن. حداکثر ولتاژ منطقی روی پین های IO میتونه 3.3 باشه. قسمت زیر PCB همه پینها لیبل دارن. سه تا پین اضافه روی این بورد برای دیباگ سریال وجود داره (SWCLK، SWIO و GND) که بصورت جدا از بقیه پین ها هستند که میشه ازشون برای پروگرم کردن هم استفاده کرد.

امکانات و بلوک ورودی/خروجی قابل برنامه ریزی

رزبری پای پیکو با چیپ RP2040ش یک ست از امکانات مشترک بین همه میکروکنترلرهارو که احتمالا انتظارشو هم دارین بهتون میده: دو تا UART، دو تا کنترلر I2C، دو تا کنترلر SPI، 16 تا کانال PWM، یک ADC 12 بیتی با نرخ نمونه گیری 500ksps (هزار نمونه در ثانیه)، سنسور دمای داخلی (خیلی برای جاهایی که به عدد تصادفی یا random نیاز هست کمک میکنه)، یک ساعت RTC، تایمر و قابلیت های GPIO پایه ای که البته سطح ولتاژ منطقی 1 اون 3.3 ولت هستش که باعث میشه برای اتصال به بورد های دیجیتال 5 ولتی (مثلا آردوینو) دچار چالش باشین که خب البته استفاده از مبدل های سطح منطقی همیشه یه گزینه اس! توی بعضی طراحی ها هم میتونین از کم خرج ترین مبدل یعنی تقسیم مقاومتی هم استفاده بکنین. بعلاوه رابط USB که هم بعنوان میزبان و هم دستگاه قابل استفاده اس و 8 ورودی/خروجی قابل برنامه ریزی یا State Machine PIO (ماشین وضعیت).

ماشین های وضعیت (state machines) رو میشه برای ایجاد رابط های گوناگون استفاده کرد (اضافه) از جمله UART، I2C، I2S،  و SPI و همچنین SD-Card و VGA و DPI و خیلی رابط های دیگه. یک بخش دیتاشیت میکروکنترلر RP2040 (به نام PIO) کلا راجع به همین ماشین های وضعیت صحبت کرده.

در دیتاشیت به این موضوع اشاره شده که حالت های DPI و VGA باید از طریق تقسیم مقاومتی که در خروجی قرار میگیره استفاده بشه. یا مثلا استفاده از DAC یا مبدل های دیجیتال به آنالوگ چون کلا سیگنال های VGA و DPI آنالوگ هستند و برای انتقال دیتای رنگ از سطح ولتاژ استفاده میکنن (مشابه سیستم تلویزیون های قدیمی).

تصویر بالا یک بلوک چهارتایی از ماشین های وضعیت رو نشون میده. این ماشین های وضعیت میتونن 9 دستور اسمبلی رو اجرا بکنن: JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ و SET. از اونجایی که این ماشین های وضعیت میتونن مستقل از پردازنده کارشون رو انجام بدن، اجازه میدن رابط هایی رو که توسط سخت افزار میکرو پشتیبانی نمیشه رو داشته باشن ضمن اینکه CPU هم درگیر پردازش رابط یا لایه ارتباطی نباشه (مثل کاری که تو Bit-banging اتفاق میوفته که رابط رو با کد و نرم افزاری مینویسیم) و اینطوری خیلی سیستم بهینه کار میکنه.

UART استفاده شده توی RP2040 بر اساس (ARM Primecell UART (PL011 ساخته شده که روی بوردهای دیگه رزبری پای هم ازش استفاده شده که اجازه میده حداکثر تا 961.6k نرخ انتقال بیت داشته باشه (baud rate). برای دو رابط SPI هم از PL022 استفاده شده که تو رزبری پای های قبلی هم استفاده شده بود. این رابط میتونه تا F_CPU/2 یا نصف فرکانس کلاک پردازنده دیتا رو انتقال بده(در حالت Master). کنترلر I2C هم سه تا حالت استاندارد (100kHz)، سریع (400kHz) و فوق سریع یا سریع+ (1MHz) داره که تو دو حالت 7 و 10 بیتی بعنوان master یا slave کار میکنه. این سه رابط بیشترین اتصال هارو به تجهیزات جانبی دارن.

ADC رزبری پای پیکو یک مدل SAR پایه اس که دقت 12 بیت در هر نمونه میتونه در ثانیه 500 هزار نمونه رو خروجی بده. چهارتا ورودی داره و یک سنسور دما هم داره. اگه با ADC توی میکروکنترلر های دیگه مثل AVR کار کرده باشین حتما میدونین که یه ولتاژ مرجع دارن که برای RP2040 باید این ولتاژ رو به پین ADC_AVDD بدیم ولی توی بورد پیکو این پین با یک مقاومت و یک فیلتر پایین گذر به ولتاژ تغذیه 3.3 خورده.

نکته جذاب دیگه در رابطه با RP2040 و تبعا رزبری پای توی رابط USB اون هست که اجازه میده موس یا کیبورد هم بهش متصل بشه یا اینکه خود پیکو بتونه به کامپیوتر یا یه رزبری دیگه متصل بشه. در حالتی که بعنوان میزبان باشه، از USB Hub هم پشتیبانی میکنه که این یعنی شما به یک پورت USB محدود نیستید!

RP2040 یک تایمر 64 بیتی مخصوص داره که روی پایه زمانی 1 میکروثانیه ای اجرا میشه. این اجازه میده که چهار تا تایمر داشته باشیم یا اینکه ازش برای وقفه هایی با دقت 1 میکروثانیه استفاده کنیم. برای وقفه های تکرارشونده زمانی یا وقفه ها هم میتونید از 8 تا واحد 16 بیتی PWM استفاده کنید که هر کدوم دو کانال دارن. پین های GPIO که برای PWM استفاده شدن همچنین میتونن برای اندازه گیری فرکانس و دوره ی کاری (Duty Cycle) استفاده بشن، یا وقفه ایجاد کنن و درخواست های DMA بدهند و این پین ها مقسم کلاک هم دارن تا بتونن دقت بیشتری توی اندازه گیری فرکانس ارائه کنن.

برای برنامه نویسی پیشرفته RP2040 مجهز به یک واحد DMA هست که اجازه میده انتقال دیتا درون میکرو بدون دخالت (کمترین دخالت) هسته های پردازنده انجام بگیره. برای مثال، انتقال دیتای مبدل های آنالوگ به دیجیتال به بخش خاصی از حافظه (بافر) بدون دخالت پردازنده و یا انتقال دیتا از حافظه به واحد UART برای ارسال نمونه هایی از استفاده واحد DMA توی میکروکنترلر ها و سیستم های دیجیتالی هستن. همچنیند با کمک واحد DMA میشه حافظه های بافر بزرگ رو هم بدون درگیر شدن پردازنده منتقل کرد که حتی از کپی کردن توسط خود پردازنده هم سریع تره. این مورد خصوصا موقعی که میخوایم دیتا رو به یک صفحه نمایش خارجی منتقل کنیم خیلی به کار میاد. از اونجایی که واحد DMA میتونه با PIO یا Programmable IO state machines زنجیر بشه، میتونن یک ترکیب عالی برای انتقال اطلاعات از/به دستگاه های خارجی رو شکل بدهند.

نگاهی به شماتیک ها، راهنما ها و فایل های طراحی

بورد رزبری پای پیکو اولین بوردی هست که توش از میکروکنترلر RP2040 استفاده شده. شماتیک دیاگرام این بورد در تصویر بالا مشخصه. توی این بورد میکروکنترلر با مبدل DC به DC، حافظه جانبی NOR Flash، و مدارات اندازه گیری و شناسایی تغذیه برای وارد کردن مدار مبدل DC به DC (سوئیچینگ) به حالت کم توان (low power mode) و قطعات رابط USB احاطه شده.

بنیاد رزبری پای فایل های طراحی KiCad و Fritzing رو در اختیار عموم گذاشته تا بتونین برای طراحی بورد هاتون ازشون استفاده کنین و نکته جالب اینجاست که شما به مرجع طراحی نه برای پیکو، بلکه برای طراحی مدارات خودتون بر پایه RP2040 دسترسی پیدا میکنین. اگه شما طراح سخت افزار باشین حتما با این موضوع آشنایی دارین که اغلب میکرو ها پایه های نا مرتبی دارن و سازندگانشون به دسته بندی کردن پین های میکروها اهمیتی نمیدن. ولی، با RP2040، طراح های PCB میتونن از بنیاد رزبری پای تشکر کنن! چون پین های مرتبط رو خیلی تمیز کنار هم قرار داده و گروه بندی کرده و راحت میشه این پین هارو به قطعات خارجی مسیریابی (route) کرد. تصویر زیر نقشه پین های میکروکنترلر RP2040 رو نشون میده:

در زمان نوشته شدن این مقاله، هر دوی راهنما ها و نرم افزاری که برای پیکو منتشر شده نسخه های نهایی نبودن، پس تغییرات کوچیکی یا افزودنی هایی برای اونها محتمل هست. بهرحال، شما میتونین به وضوح ببینین که این یک محصول رزبری پای هست، با یک داکیومنت عالی و کامل که از ابتدای در دسترس قرار گرفتن پیکو در دسترس بوده و همچنین سخت افزار اون هم باز (open hardware) هست. در کنار اینها، یک SDK یا کیت طراحی نرم افزار هم از ابتدای انتشار پیکو در دسترس بوده که اجازه میده برای پیکو برنامه بنویسین و برای هر سه سیستم عامل معروف لینوکس، مک و ویندوز ارائه شده. در حال حاضر برای برنامه نویسی روی این میکرو باید بین دو گزینه MicroPython و ++C/C یکی رو انتخاب کنین.

طراحی با میکروپایتون – MicroPython

خیلی از برنامه نویس ها احتمالا ++C/C رو به پایتون ترجیح میدن، حتی حالا که Arduino IDE هم رزبری پای پیکو رو پشتیبانی میکنه دیگه شکی باقی نمی مونه که انتخاب اکثر برنامه نویس ها خواهد بود. بهرحال، MicroPython هم یه گزینه اس که میتونین باهاش این میکروکنترلر رو برنامه نویسی کنین. اگه میخواین خودتون محیط اجرای MicroPython رو کامپایل کنین؛ اول از همه، احتیاج به یه رزبری پای 4 دارین که Raspberry Pi OS یا سیستم عامل رزبری روش نصب باشه یا طبق راهنمای ارائه شده، یه سیستم عامل لینوکس بر پایه دبیان (Debian-based Linux) احتیاج دارین (مثلا خانواده ubuntu مثل lubuntu، kubuntu و … همگی Debian هستن). حالا یا خودتون MicroPython رو کامپایل میکنین (که در این صورت نیاز به سیستم عامل لینوکس دارین) یا باینری و کامپایل شده اش رو دانلود میکنین.

بورد پیکو رو با یک کابل میکرو USB وقتی که دکمه BOOTSEL رو فشار میدین به کامپیوتر وصل کنین که در این حالت توی کامپیوترتون (My Computer برای نسخه های قدیم ویندوز و This PC برای نسخه های جدیدتر) یک درایو جدید میبینین. فایل باینری MicroPython رو روی این درایو جدید کپی کنین (با این کار دارین پروگرامش میکنین!). بعد از این کار، میتونین رزبری پای پیکو رو از طریق USB یا UART به محیط MicroPython Interactive Interpreter Mode (یا REPL) متصل کنین.

بعنوان یه جایگزین، MicroPython ی که برای بورد های بر پایه RP2040 طراحی شده میتونه با IDE های عمومی دیگه مثل Thonny هم کار بکنه. در راهنمای پیکو اومده که چطور این IDE رو نصب و برای کار با RP2040 راه اندازی و تنظیم و کنیم.

اگه به برنامه نویسی پایتون علاقه دارین و دوست دارین این بورد رو با این زبون برنامه نویسی کنین، میتونین زیر همین مطلب برام کامنت بذارین تا من در رابطه با این موضوع مطلب بیشتری بنویسم ولی فعلا تا همین جا به نظرم کفایت میکنه.

برای برنامه نویسی پیکو (فعلا) شما فقط دو/ گزینه C/C++ و MicroPython رو دارید. احتمالا Arduino IDE به همین زودی ها این بورد رو هم پشتیبانی میکنه (قولش داده شده). بهرحال MicroPython هم یکی از گزینه هاست اگه به برنامه نویسی پایتون علاقه دارید.

مصرف انرژی

یه سوالی که بین کاربران پیکو خیلی مهم هستش اینه که مصرف انرژی پیکو چقدره؟ خصوصا برای کسایی که میخوان پیکو رو تو شرایطی استفاده کنن که باید با باطری تو مدت زیادی کار بکنه، مثل کاربردهایی که تو باغبانی برای سنسور دما و رطوبت خاک استفاده میشه، یا توی مصارف مشابه دیگه. بطور معمول، اولین چیزی که شما توی هر میکروکنترلر جدید میبینین مصرف انرژی کمش هست، و عموما توی حالت های خواب (sleep mode) عبور جریانی بین چندصد نانو آمپر تا چند ده میکروآمپر دارن. اگه به دیتاشیت RP2040 نگاهی بندازین، میبینین که توی عمیق ترین حالت خواب (حالت های خواب یا sleep mode ها معمولا چند سطح دارن، معمولا هم یک وقفه داخلی یا خارجی میتونه این حالت های خواب رو بشکونه) بطور میانگین 0.18 میلی آمپر یا 180 میکروآمپر جریان میکشه. البته این جریان به نظر خیلی خوب و کم میاد، ولی خب برای پیکو یه نکته ای وجود داره. چون روی بورد ما فقط RP2040 نداریم! حافظه فلش خارجی و مبدل DC به DC هم وجود دارن. البته چیپ فلش میتونه بحالت خواب بره و کلا 50 میکروآمپر جریان بکشه، یا حتی خاموش بشه و کلا 15 میکروآمپر مصرف کنه؛ در این حالت مبدل DC/DC بار خیلی کمی روش میوفته. طبق دیتاشیت پیکو، در دمای طبیعی اتاق و دمای 25 درجه سانتیگراد، جریان حالت توقف (stand-by) معادل 0.8 میلی آمپر هست. این موضوع برای کسایی که میخوان از یه باطری به مدت طولانی برای منبع انرژی یه پیکو (و تبعا دیوایس های جانبیش) استفاده کنن حائز اهمیته. پس اگه میخواین برای اینجور مصارف کد بنویسین، به بهینه بودن کدتون باید خیلی توجه کنین، به وارد کردن میکرو به حالت های خواب در زمان هایی که نیاز به اجرای کدی نیست (و نه استفاده از delay ها و while های بی نهایت که CPU رو همیشه درگیر میکنن).

سخن آخر در مورد پیکو

تا الان بخاطر کمبود داکیومنت و منابع یا بخاطر گرونی میکروکنترلر ها ازشون فاصله گرفته بودین؟ دیگه بهانه قابل دفاعی ندارین! یه رزبری پای پیکو تهیه کنین و شروع به کد نویسی کنین. با این قیمت و پشتیبانی عالی بنیاد رزبری پای از این بورد ها، سوال خریدن یا نخریدن این بورد ها مطرح نیست، موضوع اینه که چند تا بخرین؟! با توجه به اینکه جامعه رزبری پای و آردوینو دارن روی این بورد ها کار میکنن، طولی نمیکشه که این بورد ها و کلا این میکروکنترلر ها یکی از محبوب ترین ها میشن و کلی کتابخونه های مختلف براش درست و کارهای شگفت انگیز روش انجام میشه. کاری که ما میتونیم بکنیم اینه که فقط تماشاچی باشیم؟ یا اینکه خودمون هم بخشی از این انقلاب بزرگ باشیم؟!

یادتون باشه، هرچی مخاطب علاقه مند یه موضوع بیشتر باشه اون موضوع بولد میشه و زنده میمونه و حتی رشد میکنه. در مورد RP2040 مطمئنم خوره های Arduino و بوردهای آماده و رزبری پای ها توی پوست خودشون نمی گنجن که پروژه ها و ایده های خلاقانه و گاه شیطانی خودشون رو به این میکرو مهاجرت بدن!!

درباره نویسنده

احسان وارسته

یه علاقمند به حوزه علم و فناوری که دوست داره با به اشتراک گذاشتن دانشش قدم کوچکی برای کمک به جامعه فنی برداره :)
حمایت مالی

2 نظر

نظر بگذارید