Geek الکترونیک

آشنایی با میکروپایتون – بخش دوم: میکروپایتون!

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

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

از اونجایی که هیچ متنی(خصوصا تکنیکال) بی خطا نیست، خوشحال میشم اگه خطایی توی این متن پیدا کردین بهم اطلاع بدین تا اصلاحش کنم.

ادامه مقاله قبلی: آشنایی با میکروپایتون – بخش اول: مقدمه ای بر زبان های اسکریپتی!

یکم راجع به پایتون

پایتون یه زبان برنامه نویسی غنی با تعداد کتابخونه های بی شمار تو حوزه های مختلفه که از زبون قابل فهم و جذابی بهره میبره. برنامه نویسی با پایتون لذت بخشه، بخاطر وجود REPL که یه محیط برای اجرای دستوراته، شما میتونین کدهاتون رو قبل اینکه برنامه کاملتون رو بنویسین، خط به خط بنویسین و اجرا کنین و نتیجه کارتون رو ببینین و با آزمون و خطا (خصوصا برای کار با تکنولوژی ها جدید و ناآشنا) کد نویسی کنین. اینطوری دیگه نیاز به هربار نوشتن کد ندارین و دردسرهای کامپایل و آپلود هم از سرتون کم میشه! دیباگر خیلی خوبی داره، جامعه بزرگی پشتشه و این یعنی خیلی مطلب راجع بهش چه بصورت متنی و چه بصورت ویدیویی پیدا میکنین. کم حجمه، کل پکیج استاندارد پایتون زیر 200 مگابایته و میتونین خیلی سریع نصبش کنین و کار باهاش رو شروع کنین. یه مدیر بسته بندی (package manager) خیلی عالی به اسم pip داره با دستورات ساده میتونین هر پکیجی رو روی سیستمتون نصب کنین و کتابخونه ها و پکیج های مختلف رو مدیریت کنین، برای طراح های وب فریم ورک (framework) های خیلی خوبی داره، برای هوش مصنوعی کارها هم همینطور، و برای کسایی که توی حوزه ریاضیات فعال هستن یا محاسبات پیچیده زیادی دارن (مهندسان مکانیک، هوافضا، مکانیک کوانتوم و …) هم پکیج های خیلی قدرتمند و شناخته شده ای مثل numpy داره … که حالا همه قدرتش توسط عده ای عاشق به میکرو ها و دنیای دستگاه های نهفته (embedded) منتقل شده! قسمت جالب ماجرا اینجاست که از خود python چیزی کسر نشده و کامپایلر python3 بطور کامل روی میکرو اجرا میشه! تنها قسمت هایی که حذف شدن از کتابخونه های استاندارد پایتون بودن، و اینکه بعضی کتابخونه هاش بازنویسی و بعضی قسمت هاش حذف شدن و چاره دیگه ای هم نبوده، طبیعتا برای جا دادن یه دنیا توی یه ظرف شما باید فقط ملزومات رو حفظ کنین! البته نگران نباشین، از اونجایی که کامپایلر و ماشین مجازی پایتون 3 بطور کامل در دسترس هست، میتونین قسمت هایی از زبان پایتون که مورد نیازتونه رو به میکرو منتقل کنین.

نصب پایتون

برای نصب پایتون ابتدا باید وارد سایتش بشین و دانلودش کنین، نگران نباشین با اینکه کلی کتابخونه تو خودش داره ولی حجمی نداره! حداقل نه تا وقتی بصورت جداگانه نصبشون نکردین. نسخه ای که از سایت python.org دانلود میکنین صرفا شامل خود پایتون (فایل های اجرایی سیستم عامل شامل کامپایلر و VM و …) و کتابخونه های استانداردش میشه. برای اینکه از کتابخونه های کاربردیش استفاده بکنین باید نصبشون کنین که توسط ابزاری به اسم pip انجام میشه، تو ویدئویی که آماده کردم توضیح دادم که چطور میتونین ازش استفاده بکنین.

میکروپایتون: فیل توی فنجون!

میکروپایتون (micropython) خیلی سفت افزار (وقتی software نرم افزار باشه، hardware هم سخت افزار، firmware باید که سفت افزار باشه دیگه؟! ولی من خودم با این اصطلاح زیاد ارتباط نگرفتم 😐) کاملیه و روی بسیاری از پلتفرم ها (ویندوز و یونیکس) و سیستم-روی-چیپ (SoC) ها و میکروکنترلرها (از STM32F4x تا این اواخر RP2040 معروف بنیاد رزبری! البته لیست بلند بالاییه!) همه رو شامل شده! از حق نگذریم پایتون زبان برنامه نویسی خیلی جذابیه، خیلی روون و راحته و اگه کدتون رو اصولی بنویسین، خیلی سریع کار میکنه. البته اصول رو هر قشر تکنیکالی برای خودش تعریف میکنه، مثلا اصول کدنویسی تو هوش مصنوعی با اصول کد نویسی تو محیط های نهفته از حیث منابع و ریسورس های سیستمی زمین تا آسمون فرق میکنه و میشه گفت محدودیت ها هستن که خیلی جاها اصول رو تعیین می کنن.

اجازه بدین یه نگاه به میکروپایتون بندازیم. اگه وارد سایتشون (البته برای ایرانی ها تحریم هست متاسفانه!) بشین، در ابتدای سایت توضیحاتی راجع به خود میکروپایتون بهتون میده که خب تقریبا همش توی ویکی پدیا هم هست. میکروپایتون برای میکروکنترلرها و SoC ها یه فرم ویر (سفت افزار) هستش و بهینه شده که بتونه روی محیط های embedded کار بکنه که میتونین رو فلششون پروگرامش کنین و با ارتباط سریال بهش وصل بشین و از طریق محیط REPL باهاش کار بکنین. میکروپایتون علاوه بر یکسری کتابخونه های استاندارد خود پایتون، یکسری کتابخونه های مخصوص هم میده که به شما تو ارتباط با سخت افزار و نوشتن مستقیم کد برای سخت افزار کمک میکنه. مثل کتابخونه Pin که برای دسترسی به GPIO هست و میتونین باهاش پین هارو کانفیگ بکنین. و همچنین به شما یه filesystem هم میده که میتونین فایل های .py که همون اسکریپت ها یا کدهای پایتون تون هست رو بریزین و اجرا کنین! اگه اسم فایلتون main.py باشه هم بعد از هربار روشن شدن ماژول اسکریپتتون اجرا میشه. همین که به شما filesystem روی فلش میکرو میده، یعنی اینکه از حافظه های فلش خارجی هم میتونه پشتیبانی کنه، توی جدول زیر فرمت هایی که پشتیبانی میکنه اومده(این برای نسخه 1.6 هست):

سه تا فرمت فایل سیستم رو پشتیبانی میکنه، FAT که فرمت مرسوم هست که همه سیستم های ویندوزی و یونکسی (یا حداقل اکثرشون) پشتیبانیش میکنن، و دو تا littlefs یکی نسخه 1 و دیگری 2! littlefs یه فایل سیستمه که برای دیوایس های بر پایه فلش طراحی شده، و خیلی از فایل سیستم FAT در برابر خطا و خرابی و از دست رفتن اطلاعات مقاوم تره.

اگه بخواین سرعت اجرای کدتون (خیلی کم) زیادتر بشه و البته فضایی که توی حافظه اشغال میکنه کمتر باشه، میتونین کد پایتونتون رو کامپایل کنین و به bytecode تبدیل کنین که در حقیقت باینری هست و پسوندش .mpy و اون رو توی فایل سیستم برای اجرا کپی کنین.

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

پیش تر راجع به REPL مطالبی گفتم؛ پایتون یه حالت ارتباطی و Interactive داره که شما خط به خط کدهاتون رو مینویسن و همونجا به شما جواب رو میده. عموما زبان های اسکریپتی همچین ویژگی هایی دارن (اگه php کار کردین، میتونین خیلی راحت پارامتر -a رو بهش پاس بدین و بعد وارد محیط interactiveش بشین!). در مورد پایتون و میکروپایتون هم این موضوع صادقه و بهش REPL (Read, Evaluate, Print, Loop) میگن. میکروپایتون یکم پارو فراتر گذاشته و WebREPL هم داره که بر پایه websocket کار میکنه. ابزارهایی هم برای کار باهاش وجود داره که تو خود وبسایت میکروپایتون بهش اشاره شده. خودش گفته که این ویژگی experimental ه و یعنی هنوز به مرحله ای نرسیده که بشه خیلی روش حساب کرد ولی من ایرادی توش ندیدم، یه ابزار توی گیت هاب براش ارائه داده به اسم webrepl که یه صفحه وب بهتون میده و میتونین از طریقش فایل هاتون رو براش ارسال کنین! تو این ویدئو میخوام نحوه برنامه ریزی و پروگرام کردن یه esp8266 رو آموزش بدم، به پایتون و ابزار esptool برای پروگرام کردن esp ها احتیاج دارین، به یه کابل USB و یه nodemcu یا یه ماژولی که بتونین بهش از طریق پورت سریال RS232 یا UART وصل بشین!

البته من خودم به شخصه از rshell خیلی بیشتر خوشم اومد، یه آدم خوش ذوق این برنامه رو آماده کرده که یه محیط CLI (Command-Line Interface) یا رابط دستوری به شما میده و از دستورات ساده ای مثل mkdir برای ایجاد پوشه، rm برای حذف فایل و پوشه، mv برای جابجایی فایل ها و پوشه ها و همچنین تغییر نام فایلها/پوشه ها ازش میتونین استفاده کنین. انگار که به ترمینال یونیکس وصل شده باشین!

چطوری rshell رو نصب کنین؟ باید python رو روی کامپیوترتون داشته باشین. همه اینهارو، یعنی نصب پایتون، نصب rshell، نوشتن یه کد سمپل و ارسالش به esp8266 و اجراش رو توی یه ویدئو توضیح میدم. بعضی مطالب اگه بصورت سمعی-بصری توضیح داده بشن بیشتر تاثیر دارن، موافق نیستین؟

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

a = 12
a = “Ehsan”
a = [1,2,3] a = [1,’2’,3,[4]] b = {‘a’:a, ‘name’:”it’s a damn multi-defined variable!”}
del a, b

من توی خط 1، متغیر a رو تعریف کردم و مقدارش رو عددی (int) و 12 گذاشتم. توی خط دوم همون متغیر رو نوعش رو عوض کردم و رشته (string) ش کردم. توی خط سوم آرایه ای از اعداد کردم، توی خط چهارم آرایه ای از عدد، کاراکتر (که البته اون هم رشته اس) و یک آرایه یک عضوی کردم! و تو خط پنجم هم یه دیکشنری تعریف کردم! دیکشنری ها متغیرهایی هستن شبیه آرایه منتهی دسترسی به عضو هاشون با key یا کلید ها هستش. کلید ها محدود به رشته نیستن، میتونن عدد هم باشن. مثلا توی خط آخر، دیکشنری b دو تا عضو داره، یکی ‘a’ و دیگری ‘name’ قابل دسترسی هستن.

تو خط آخر هم، از del برای حذف دو متغیر از حافظه استفاده کردم. این خصوصا توی شرایطی که حافظه کم دارین (خصوصا توی میکروکنترلرها) خیلی به کارتون میاد.

GC یا Garbage Collector یه کتابخونه توی پایتون هست که توی میکروپایتون هم هست! (کتابخونه ها عموما شامل کلاس ها هستن، ولی میتونن فقط متد داشته باشن یا یکسری constant یا مقادیر ثابت مثل عددهای ثابت ریاضی Pi و E  باشن) یه متد خیلی خوب به اسم collect داره، وظیفه اش جمع کردن آشغاله! آشغال در اینجا به معنی بخش هایی از حافظه اس که دیگه استفاده نمیشه. یعنی بصورت موقت گرفته شده تا یکسری دستورات اجرا بشه ولی خب آزاد نشده، شبیه دستورات malloc و free توی C، collect دستور free هستش! این برای جاهایی به درد میخوره که خیلی کد اجرا کردین و حافظه  کم آوردین، میتونین با اجرای این دستور مقدار قابل توجهی از حافظه رو آزاد کنین.

import machine, uos, …
from machine import Pin

توی خط اول کتابخونه هارو میخونم، مثل دستور include توی c هستش. توی خط دوم فقط Pin رو از توی کتابخونه machine خوندم. فرقش اینه که مثلا اگه زیاد از Pin استفاده کنین لازم نیست توی کدتون همش بنویسین machine.Pin و بجاش فقط مینویسین Pin، و در اینجا هم میتونین چندین بخش یه کتابخونه رو وارد برنامه تون بکنین.

ما توی پایتون بجای مقدار NULL که توی C هست، مقدار None داریم. مقادیر بولین(Boolean) True و False داریم. توی پایتون اگه کدتون به خطا بخوره به شما Stack trace نشون میده، یعنی مثلا میگه تابع a1 تابع a2 رو فراخونی کرده توی خط مثلا 10 برنامه، بعد تابع a2 تابع a3 رو فراخونی کرده توی خط مثلا 120 برنامه، که این تابع مثلا توی خط 128 به خطای زیر خورده : … و خطا رو به شما نمایش میده! این خصوصا تو برنامه های پیچیده خیلی کمک میکنه که بفهمیم چه روندی طی شده که به خطا رسیدیدم، مثلا ممکنه تابع a3 توی 10 جای دیگه برنامه هم صدا زده شده باشه ولی فقط وقتی تابع a2 صداش میزنه به خطا میخوره!

فعلا این مطلب رو همینجا تموم میکنم چون حس میکنم زیاد شدن مطلب خواننده رو (و گاهی هم نویسنده رو) خسته میکنه!

فقط بدونین هنوز وارد میکروپایتون و محیط REPL نشدیم، راجع به تغییر فرکانس کاری پردازنده صحبت نکردیم، با کتابخونه gc کار نکردیم، با فایل سیستم میکروپایتون کار نکردیم، به شبکه وایرلس وصل نشدیم و از peripheral های پردازنده مثل تایمرها، PWM، I2C (که البته با bitbanging پیاده میشه) و UART و ADC و … به نحوی که شایسته اس صحبت نکردیم. ولی این کارهارو خواهیم کرد. کدهامون رو تو محیط REPL میکروپایتون خط به خط مینویسیم و تست میکنیم، بعد همه رو یکجا به فایل main.py منتقل میکنیم و rshell رو نصب میکنیم و به کمکش اسکریپتمون رو روی esp مون کپی و بعدم اجراش میکنیم! اگه همه چی خوب پیش بره، احتمالا میتونیم یه سرور کوچولو برای کانفیگ چند تا خروجی که به رله و LED وصلن راه بندازیم، یه IoT کوچولو! همش همینه دیگه، نه؟ کنترل از راه دور، کنترل توسط سنسور ها و تعریف آستانه ها و نحوه برخورد باهاشون. البته بحثش میتونه خیلی مفصل تر باشه، از صدها سنسور IoT که روی توربین های عظیم الجثه برای مانیتورنیگ وضعیتشون نصب میشن تا سنسورهای ارتعاش روی پل های بزرگ، بحث Big Data و تحلیل داده ها و تبدیلشون به دانش و تصمیم گیری و … خوشبختانه علم اونقدر وسیعه که میشه تا ابد (عمر بشری) توش شنا کرد و به تهش نرسید و اگه تو مسیری به خاکی رسیدین به این معنی نیست که آخر مسیره! شاید شما باید اون مسیرو آسفالت کنین!

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

احسان وارسته

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

4 نظر

نظر بگذارید