دنیای سیستمهای جاسازیشده را با پایتون کاوش کنید. این راهنمای جامع شامل MicroPython، CircuitPython، یکپارچهسازی سختافزار و پروژههای عملی برای مخاطبان جهانی است.
پایتون روی سختافزار: غواصی عمیق در برنامهنویسی جاسازیشده و یکپارچهسازی میکروکنترلر
برای دههها، دنیای سیستمهای جاسازیشده — کامپیوترهای کوچکی که همه چیز از ساعتهای هوشمند گرفته تا ماشینآلات صنعتی را نیرو میدهند — حوزه انحصاری زبانهای سطح پایین مانند C، C++ و Assembly بود. این زبانها کنترل و عملکرد بینظیری را ارائه میدهند، اما با منحنی یادگیری شیبدار و چرخههای توسعه طولانی همراه هستند. اکنون پایتون وارد صحنه میشود، زبانی که به خاطر سادگی، خوانایی و اکوسیستم وسیع خود شهرت دارد. پایتون که زمانی به سرورهای وب و علم داده محدود میشد، اکنون با قدرت به سمت قلب سختافزار حرکت میکند و الکترونیک را برای نسل جدیدی از توسعهدهندگان، علاقهمندان و نوآوران در سراسر جهان دموکراتیزه میکند.
این راهنما مقدمهای جامع برای دنیای هیجانانگیز برنامهنویسی جاسازیشده با پایتون است. ما بررسی خواهیم کرد که چگونه یک زبان سطح بالا مانند پایتون میتواند سختافزار را مستقیماً کنترل کند، پلتفرمهای کلیدی را که این امر را ممکن میسازند، مورد تحقیق قرار میدهیم و از طریق مثالهای عملی شما را در مسیرتان از نرمافزار به سیلیکون همراهی میکنیم.
اکوسیستم جاسازیشده پایتون: فراتر از CPython
شما نمیتوانید پایتون استانداردی که روی لپتاپ خود استفاده میکنید (معروف به CPython) را به سادگی روی یک میکروکنترلر معمولی نصب کنید. این دستگاهها منابع بسیار محدودی دارند — ما در مورد کیلوبایت رم و مگاهرتز قدرت پردازش صحبت میکنیم، که در تضاد شدید با گیگابایتها و گیگاهرتزهای یک کامپیوتر مدرن است. برای پر کردن این شکاف، پیادهسازیهای تخصصی و سبکوزن پایتون ایجاد شدند.
MicroPython: پایتون برای میکروکنترلرها
MicroPython بازنویسی کاملی از زبان برنامهنویسی پایتون 3 است که برای اجرا روی سختافزارهای محدود بهینه شده است. این زبان که توسط دیمین جورج ایجاد شده، با هدف سازگاری هرچه بیشتر با پایتون استاندارد، در عین حال دسترسی مستقیم و سطح پایین به سختافزار را فراهم میکند.
- ویژگیهای کلیدی: شامل یک حلقه تعاملی Read-Eval-Print Loop (REPL) است که به شما امکان میدهد بدون مرحله کامپایل به برد متصل شوید و کد را خط به خط اجرا کنید. بسیار کارآمد است، ردپای حافظه کوچکی دارد و ماژولهای قدرتمندی مانند
machineرا برای کنترل مستقیم سختافزار (GPIO، I2C، SPI و غیره) فراهم میکند. - بهترین برای: توسعهدهندگانی که حداکثر عملکرد، کنترل دقیق بر سختافزار و سازگاری با طیف وسیعی از میکروکنترلرها را میخواهند. این زبان به "سختافزار" نزدیکتر است و اغلب برای برنامههای کاربردی با اهمیت بیشتر در عملکرد ترجیح داده میشود.
CircuitPython: غول قدرتمند و کاربرپسند برای مبتدیان
CircuitPython یک انشعاب از MicroPython است که توسط Adafruit، شرکتی پیشرو در زمینه الکترونیک DIY (خودت انجام بده)، ایجاد و نگهداری میشود. در حالی که هسته مشترکی با MicroPython دارد، فلسفه آن بر سهولت استفاده و آموزش متمرکز است.
- ویژگیهای کلیدی: برجستهترین ویژگی آن نحوه نمایش میکروکنترلر به کامپیوتر شماست. وقتی یک برد CircuitPython را وصل میکنید، به صورت یک درایو USB کوچک ظاهر میشود. شما به سادگی فایل
code.pyخود را روی این درایو ویرایش و ذخیره میکنید؛ برد به طور خودکار کد جدید شما را بارگذاری و اجرا میکند. همچنین دارای یک API یکپارچه در تمام بردهای پشتیبانیشده است، به این معنی که کدی که برای خواندن یک حسگر روی یک برد نوشته شده، با حداقل تغییرات روی برد دیگری نیز کار خواهد کرد. - بهترین برای: مبتدیان، مربیان، و هر کسی که بر نمونهسازی سریع تمرکز دارد. منحنی یادگیری ملایمتر است، و اکوسیستم کتابخانه گسترده ارائه شده توسط Adafruit، یکپارچهسازی حسگرها، نمایشگرها و سایر اجزا را فوقالعاده ساده میکند.
MicroPython در مقابل CircuitPython: مقایسه سریع
انتخاب بین آنها اغلب به اهداف پروژه و سطح تجربه شما بستگی دارد.
- فلسفه: MicroPython ویژگیهای خاص سختافزار و عملکرد را در اولویت قرار میدهد. CircuitPython سادگی، یکپارچگی و سهولت یادگیری را در اولویت قرار میدهد.
- گردش کار: با MicroPython، معمولاً از ابزاری مانند Thonny برای اتصال به REPL دستگاه و آپلود فایلها استفاده میکنید. با CircuitPython، فایل
code.pyرا روی درایو USB میکشید و رها میکنید. - پشتیبانی سختافزاری: MicroPython طیف وسیعی از بردها را از بسیاری از تولیدکنندگان پشتیبانی میکند. CircuitPython در درجه اول از بردهای Adafruit و شرکای منتخب شخص ثالث پشتیبانی میکند، اما پشتیبانی آن عمیق و به خوبی مستند شده است.
- کتابخانهها: CircuitPython دارای مجموعه عظیمی از کتابخانههای منتخب است که نصب آنها آسان است. کتابخانههای MicroPython نیز در دسترس هستند اما ممکن است پراکندهتر باشند.
برای این راهنما، مفاهیم و بسیاری از مثالهای کد برای هر دو قابل استفاده خواهند بود، با تغییرات جزئی. ما تفاوتهای مهم را در جایی که قابل توجه باشند، مشخص خواهیم کرد.
انتخاب سختافزار شما: میدان نبرد میکروکنترلرها
تعداد میکروکنترلرها (MCU) که میتوانند پایتون را اجرا کنند، در سالهای اخیر به شدت افزایش یافته است. در اینجا برخی از محبوبترین و قابل دسترسترین گزینهها برای مخاطبان جهانی آورده شده است.
Raspberry Pi Pico و RP2040
Pico که نباید با کامپیوتر کامل Raspberry Pi اشتباه گرفته شود، یک برد میکروکنترلر کمهزینه و با کارایی بالا است که حول تراشه سفارشی RP2040 ساخته شده است. این برد به یکی از محبوبترین گزینهها برای پایتون روی سختافزار در جهان تبدیل شده است.
- ویژگیهای کلیدی: یک پردازنده قدرتمند دو هستهای ARM Cortex-M0+، ۲۶۴ کیلوبایت رم سخاوتمندانه، و یک ویژگی منحصربهفرد به نام ورودی/خروجی قابل برنامهریزی (PIO) که امکان ایجاد رابطهای سختافزاری سفارشی را فراهم میکند. مدل جدیدتر Pico W وایفای داخلی نیز دارد.
- چرا برای پایتون عالی است: از MicroPython پشتیبانی رسمی و درجه یک دارد و همچنین توسط CircuitPython به خوبی پشتیبانی میشود. قیمت پایین آن (اغلب زیر ۱۰ دلار آمریکا) و عملکرد قوی آن، ارزش فوقالعادهای به آن میبخشد.
Espressif ESP32 و ESP8266
تراشههای خانواده ESP که توسط شرکت شانگهای Espressif Systems ساخته شدهاند، قهرمانان بلامنازع IoT (اینترنت اشیا) هستند. آنها به خاطر قابلیتهای وایفای و بلوتوث یکپارچهشان شناخته شدهاند و این امر آنها را به انتخاب پیشفرض برای پروژههای متصل تبدیل کرده است.
- ویژگیهای کلیدی: پردازندههای قدرتمند تک هستهای یا دو هستهای، وایفای داخلی و (در ESP32) بلوتوث. آنها بر روی هزاران برد توسعه مختلف از تولیدکنندگان سراسر جهان موجود هستند.
- چرا برای پایتون عالی هستند: پشتیبانی عالی MicroPython به شما امکان میدهد دستگاههای متصل را تنها با چند خط کد پایتون بسازید. قدرت پردازش آنها برای وظایف پیچیده مانند اجرای سرورهای وب یا مدیریت دادهها از چندین حسگر بیش از اندازه کافی است.
اکوسیستمهای Adafruit Feather, ItsyBitsy و Trinket
Adafruit طیف وسیعی از بردها را در فاکتورهای شکل استاندارد ارائه میدهد. اینها تراشههای خاصی نیستند، بلکه خانوادههای محصولی هستند که برای کار بیدرز در اکوسیستم CircuitPython طراحی شدهاند.
- ویژگیهای کلیدی: بردهای خانواده Feather دارای یک پیناوت مشترک هستند که آنها را قابل تعویض میکند. بسیاری از آنها شامل مدارهای شارژ باتری و کانکتورهای داخلی هستند. آنها با انواع میکروکنترلرها، از جمله RP2040، ESP32 و سایرین، در دسترس هستند.
- چرا برای پایتون عالی هستند: آنها از ابتدا برای CircuitPython طراحی شدهاند. این یکپارچگی محکم به معنای تجربهای روان و plug-and-play با دسترسی به صدها کتابخانه و آموزش است.
شروع کار: اولین "سلام، دنیا" شما روی سختافزار
بیایید از تئوری به عمل برویم. "سلام، دنیای" سنتی برنامهنویسی جاسازیشده، چشمک زدن یک LED است. این عمل ساده تأیید میکند که تمام ابزارهای شما — از ویرایشگر کد گرفته تا فریمور روی برد — به درستی کار میکنند.
پیشنیازها
- یک برد میکروکنترلر پشتیبانیشده (مانند Raspberry Pi Pico، ESP32، یا یک برد Adafruit).
- یک کابل USB که از انتقال داده پشتیبانی میکند (نه فقط شارژ).
- یک کامپیوتر (ویندوز، macOS یا لینوکس).
گام ۱: نصب فریمور
برد شما نیاز به نصب مفسر MicroPython یا CircuitPython روی خود دارد. به این کار "فلش کردن فریمور" گفته میشود.
- برای CircuitPython: به circuitpython.org مراجعه کنید، برد خود را پیدا کنید و فایل
.uf2را دانلود کنید. برد خود را در حالت بوتلودر قرار دهید (این کار معمولاً شامل نگه داشتن دکمه "BOOT" یا "RESET" هنگام اتصال آن است). برد به عنوان یک درایو USB ظاهر خواهد شد. فایل.uf2دانلود شده را روی آن بکشید و رها کنید. درایو خارج شده و دوباره ظاهر خواهد شد، اکنون با نام CIRCUITPY. - برای MicroPython: به micropython.org مراجعه کنید، برد خود را پیدا کنید و فایل فریمور (اغلب فایل
.uf2یا.bin) را دانلود کنید. فرآیند مشابه است: برد را در حالت بوتلودر قرار داده و فایل را کپی کنید.
گام ۲: تنظیم ویرایشگر خود
در حالی که میتوانید از هر ویرایشگر متنی استفاده کنید، یک IDE اختصاصی توسعه را بسیار آسانتر میکند. Thonny IDE برای مبتدیان بسیار توصیه میشود. این نرمافزار رایگان، چند پلتفرمی است و با پشتیبانی داخلی از MicroPython و CircuitPython ارائه میشود. به طور خودکار برد شما را شناسایی میکند، دسترسی به REPL دستگاه را فراهم میکند و آپلود فایلها را آسان میسازد.
گام ۳: کد چشمکزن LED
اکنون نوبت کد است. یک فایل جدید با نام main.py برای MicroPython ایجاد کنید یا فایل موجود code.py را برای CircuitPython ویرایش کنید.
مثال برای MicroPython روی Raspberry Pi Pico W:
import machine
import utime
# LED داخلی روی Pico W از طریق یک نام خاص قابل دسترسی است
led = machine.Pin("LED", machine.Pin.OUT)
while True:
led.toggle()
print("LED toggled!")
utime.sleep(0.5) # نیم ثانیه صبر کنید
مثال برای CircuitPython روی اکثر بردهای Adafruit:
import board
import digitalio
import time
# LED داخلی معمولا به پینی به نام 'LED' متصل است
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = not led.value
print("LED toggled!")
time.sleep(0.5)
توضیح کد:
import: ما کتابخانهها را برای کنترل سختافزار (machine،digitalio،board) و مدیریت زمان (utime،time) وارد میکنیم.- تنظیم پین: ما تعریف میکنیم که کدام پین فیزیکی را میخواهیم کنترل کنیم (LED داخلی) و آن را به عنوان خروجی پیکربندی میکنیم.
- حلقه: حلقه
while True:برای همیشه اجرا میشود. داخل حلقه، وضعیت LED را تغییر میدهیم (روشن به خاموش، یا خاموش به روشن)، پیامی را در کنسول سریال (قابل مشاهده در Thonny) چاپ میکنیم، و سپس برای نیم ثانیه مکث میکنیم.
این فایل را روی دستگاه خود ذخیره کنید. LED داخلی باید بلافاصله شروع به چشمک زدن کند. تبریک میگوییم، شما همین الان پایتون را مستقیماً روی یک میکروکنترلر اجرا کردید!
کاوش عمیقتر: مفاهیم اصلی پایتون در میکروکنترلرها
چشمک زدن یک LED تنها آغاز کار است. بیایید مفاهیم اساسی را که برای ساخت پروژههای پیچیدهتر استفاده خواهید کرد، بررسی کنیم.
ورودی/خروجی عمومی (GPIO)
پینهای GPIO اتصالات فیزیکی هستند که به میکروکنترلر شما اجازه میدهند با جهان تعامل داشته باشد. آنها میتوانند به عنوان ورودی (برای خواندن داده از دکمهها یا حسگرها) یا خروجی (برای کنترل LEDها، موتورها یا رلهها) پیکربندی شوند.
خواندن فشردن دکمه (MicroPython):
import machine
import utime
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("Button is pressed!")
utime.sleep(0.1)
در اینجا، پین ۱۴ را به عنوان ورودی با یک مقاومت پولداون داخلی پیکربندی میکنیم. حلقه به طور مداوم بررسی میکند که آیا مقدار دکمه ۱ (بالا) است یا خیر، که نشاندهنده فشرده شدن آن است.
کار با حسگرها
بیشتر پروژههای جالب شامل حسگرها هستند. پایتون خواندن دادهها از حسگرهای آنالوگ و دیجیتال را آسان میکند.
- حسگرهای آنالوگ: این حسگرها، مانند فتورزیستورها (اندازهگیری نور) یا پتانسیومترها، یک ولتاژ متغیر را ارائه میدهند. مبدل آنالوگ به دیجیتال (ADC) میکروکنترلر این ولتاژ را میخواند و آن را به یک عدد تبدیل میکند.
- حسگرهای دیجیتال: این حسگرهای پیشرفتهتر (مانند حسگرهای دما/رطوبت، شتابسنجها) با استفاده از پروتکلهای خاص ارتباط برقرار میکنند. دو پروتکل رایجترین آنها I2C (مدار بینیکپارچه) و SPI (رابط سریال محیطی) هستند. این پروتکلها به چندین دستگاه اجازه میدهند تا با استفاده از تنها چند پین با میکروکنترلر ارتباط برقرار کنند. خوشبختانه، به ندرت نیاز به دانستن جزئیات سطح پایین دارید، زیرا کتابخانهها ارتباطات را برای شما مدیریت میکنند.
خواندن دما با حسگر BMP280 (CircuitPython):
import board
import adafruit_bmp280
# یک شیء باس I2C ایجاد کنید
i2c = board.I2C() # از پینهای پیشفرض SCL و SDA استفاده میکند
# یک شیء حسگر ایجاد کنید
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
# دما را بخوانید
temperature = bmp280.temperature
print(f"Temperature: {temperature:.2f} C")
مدولاسیون پهنای پالس (PWM)
PWM یک تکنیک است که برای شبیهسازی خروجی آنالوگ روی یک پین دیجیتال استفاده میشود. با روشن و خاموش کردن سریع یک پین، میتوانید ولتاژ متوسط را کنترل کنید، که برای کمنور کردن یک LED، کنترل سرعت یک موتور DC یا موقعیتدهی یک سروو موتور مفید است.
قابلیت اتصال و اینترنت اشیا (IoT)
اینجاست که بردهایی مانند ESP32 و Pico W واقعاً میدرخشند. با وایفای داخلی، پایتون ساخت دستگاههای IoT را به طرز شگفتانگیزی ساده میکند.
اتصال به وایفای
اتصال دستگاه شما به یک شبکه، اولین گام است. شما باید یک فایل (که اغلب در CircuitPython secrets.py نامیده میشود) برای ذخیره امن اطلاعات کاربری شبکه خود ایجاد کنید.
اتصال ESP32 به وایفای (MicroPython):
import network
SSID = "YourNetworkName"
PASSWORD = "YourNetworkPassword"
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(SSID, PASSWORD)
while not station.isconnected():
pass
print("Connection successful")
print(station.ifconfig())
ارسال درخواستهای وب
پس از اتصال، میتوانید با اینترنت تعامل داشته باشید. میتوانید دادهها را از واسطهای برنامهنویسی کاربردی (API) دریافت کنید، دادههای حسگر را به یک سرویس وب ارسال کنید یا اقدامات آنلاین را راهاندازی کنید.
دریافت دادههای JSON از یک API (با استفاده از کتابخانه `urequests`):
import urequests
response = urequests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
data = response.json()
print(f"The current UTC time is: {data['datetime']}")
response.close()
MQTT: زبان اینترنت اشیا (IoT)
در حالی که HTTP مفید است، استاندارد طلایی برای ارتباطات IoT، پروتکل MQTT (Message Queuing Telemetry Transport) است. این یک پروتکل انتشار-اشتراک سبکوزن است که برای شبکههای با پهنای باند کم و تاخیر بالا طراحی شده است. یک دستگاه میتواند دادههای حسگر را به یک "موضوع" "منتشر" کند، و هر دستگاه (یا سرور) دیگری که در آن موضوع "مشترک" شده باشد، دادهها را بلافاصله دریافت خواهد کرد. این روش بسیار کارآمدتر از بررسی مداوم یک وب سرور است.
مباحث پیشرفته و بهترین شیوهها
همانطور که پروژههای شما رشد میکنند، با محدودیتهای یک میکروکنترلر مواجه خواهید شد. در اینجا برخی از بهترین شیوهها برای نوشتن کد پایتون جاسازیشده قوی آورده شده است.
- مدیریت حافظه: RAM ارزشمندترین منبع شماست. از ایجاد اشیاء بزرگ مانند لیستها یا رشتههای طولانی در داخل حلقهها خودداری کنید. از ماژول
gc(import gc; gc.collect()) برای راهاندازی دستی جمعآوری زباله (garbage collection) و آزاد کردن حافظه استفاده کنید. - مدیریت توان: برای دستگاههای با باتری، کارایی توان حیاتی است. اکثر میکروکنترلرها دارای حالت "deepsleep" هستند که بیشتر تراشه را خاموش میکند و انرژی بسیار کمی مصرف میکند، و میتواند پس از یک زمان مشخص یا با یک محرک خارجی بیدار شود.
- سیستم فایل: میتوانید فایلها را در حافظه فلش داخلی بخوانید و بنویسید، درست مانند یک کامپیوتر معمولی. این برای ثبت دادهها یا ذخیره تنظیمات پیکربندی عالی است.
- وقفهها (Interrupts): به جای بررسی مداوم وضعیت یک دکمه در یک حلقه (فرآیندی که نظرسنجی یا polling نامیده میشود)، میتوانید از وقفه استفاده کنید. درخواست وقفه (IRQ) یک سیگنال سختافزاری است که کد اصلی را برای اجرای یک تابع خاص متوقف میکند و سپس از سر میگیرد. این روش بسیار کارآمدتر و پاسخگوتر است.
نمایش ایدههای پروژه واقعی
آماده ساختن هستید؟ در اینجا چند ایده آورده شده است که مفاهیم مورد بحث ما را ترکیب میکنند:
- ایستگاه هواشناسی هوشمند: از یک ESP32 با حسگر BME280 برای اندازهگیری دما، رطوبت و فشار استفاده کنید. دادهها را روی یک صفحه نمایش OLED کوچک نشان دهید و از طریق MQTT به یک داشبورد مانند Adafruit IO یا Home Assistant منتشر کنید.
- سیستم آبیاری خودکار گیاهان: یک حسگر رطوبت خاک را به یک Raspberry Pi Pico وصل کنید. هنگامی که خاک خشک است، از یک پین GPIO برای فعال کردن یک رله استفاده کنید که یک پمپ آب کوچک را برای چند ثانیه روشن میکند.
- پد ماکرو USB سفارشی: از یک برد CircuitPython که از USB HID (دستگاه رابط انسانی) پشتیبانی میکند، مانند Pico یا بسیاری از بردهای Adafruit استفاده کنید. دکمهها را برای ارسال میانبرهای پیچیده صفحهکلید یا تایپ متن از پیش تعریف شده برنامهریزی کنید تا بهرهوری شما افزایش یابد.
نتیجهگیری: آینده در پایتون جاسازی شده است
پایتون به طور بنیادی چشمانداز توسعه جاسازیشده را تغییر داده است. این زبان موانع ورود را کاهش داده است، و توسعهدهندگان نرمافزار را قادر ساخته تا سختافزار را کنترل کنند و مهندسان سختافزار را قادر ساخته تا سریعتر از همیشه نمونهسازی کنند. سادگی خواندن یک حسگر یا اتصال به اینترنت تنها در چند خط کد خوانا، یک تغییردهنده بازی است.
سفر از یک LED چشمکزن تا یک دستگاه IoT کامل، سفری فوقالعاده پاداشبخش است. جامعه جهانی و ثروت کتابخانههای متنباز به این معنی است که شما هرگز هنگام مواجهه با یک چالش واقعاً تنها نیستید. پس یک برد انتخاب کنید، فریمور را فلش کنید، و ماجراجویی خود را در تقاطع هیجانانگیز پایتون و دنیای فیزیکی آغاز کنید. تنها محدودیت، تخیل شماست.