بهانه ای برای ورود به دنیای امبدد سیستم ها (IV)

سلامدر قسمت سوم، رزبری جان (!) رو راه اندازی کردیم و الان میتونیم از اون استفاده کنیم. در این قسمت با سخت افزار و GPIO های اون آشنا میشیم و روش های برنامه نویسی اون ها رو بررسی می کنیم.بهتره قبل از شروع این قسمت مروری بر برنامه نویسی پایتون داشته باشید.Pinoutقبل از شروع کار به ترمینال رزبری پای ریموت بزنید. و کد زیر رو اجرا کنید.pinoutRaspberry Pi Pinoutچیزی که بالا میبیند اصطلاحا pinout رزبری پای هست و توضیحی در مورد سخت افزار، شماره و نام پایه های رزبری پای میدهد. همون طور که میبینید اون مستطیل سبز رنگ رزبری پای هست و اون کادر های خاکستری پورت های USB, HDMI, شبکه، دوربین، نمایشگر و AV هستند.اون o هایی که اون بالا می بینید همون GPIO های رزبری پای هستند و عدد یک شماره پایه 1 هستتوضیحاتی شامل تعداد پورت ها، میزان رم و... داده شده که کاری نداریم با اون ها فعلا.پایین تر (قسمت راست تصویر بالا) نام و شماره تمام GPIO های رزبری پای هست که برای پیدا کردن شماره پایه ای باید این ها رو با اون شماره پایه 1 که توی شکل بود تطبیق بدین.راه ساده تر این هست که به ادرس زیر مراجعه کنید. https://pinout.xyz/ برای راحتی کار میتونید از این تگ ها تهیه کنید:Pinout Tag GPIO همون پایه های رزبری پای که با اون ها با دنیای خارج ارتباط برقرار میکنیم را GPIO می گویند و مخخف General Propose Input/Output هست.GPIOرزبری پای 40 تا پایه برای ارتباط های خارجی داره که از این 40 پایه شامل:پین های پاور: 8 پایه زمین - 2 پایه 5 ولت - 2 پایه 3.3 ولت 28 پین ورودی خروجی (که با قسمت های دیگه مشترک هست)دو سری پین SPI , دو سری پین I2C و یک UART (با این پایه ها بعدا آشنا میشیم)برنامه نویسی پایه ها و LEDروش های مختلفی برای برنامه نویسی پایه ها وجود داره. میتونید با زبان های C ، Cpp و Python کد بنویسید یا از واسط های گرافیکی مثل Scratch استفاده کنید.در این قسمت برنامه نویسی پایتون رو کار خواهیم کرد.خب برای باز کردن پایتون توی ترمینال کد زیر رو اجرا کنید.python3با اجرا این کد محیط پایتون توی ترمینال باز میشه و میتونید کد های پایتون رو اونجا اجرا کنید.اول سلام کنیم بعد بریم جلوprint('Hello World!')خروجی این کد عبارت Hello Word را در همون ترمینال چاپ می کند. دیگه بیشتر وارد پایتون نمیشم و در روند کار آشنا میشیم.برای استفاده از پین ها باید کتابخونه GPIO رو فراخوانی کنیم. اسم این کتابخونه gpiozero هست که در قدم اول ما میخواهیم یک LED رو روشن کنیم. پس کد زیر رو در همون میحط پایتون اجرا میکنیم.from gpiozero import LEDکد بالا یعنی از کتابخونه gpiozero وارد کن LED را (!)از این به بعد میتونیم از LED استفاده کنیم. LED یک کلاس پایتون هست که شماره GPIO را به عنوان آرگومان (ورودی) میگیرد مثلا (LED(21. این کار GPIO21 را به عنوان یک پایه برای روشن و خاموش کردن led تعریف میکند. برای راحتی کار به (LED(21 یک نام دیگر اختصاص می دهیم و از این به بعد به myled یک شئ (object) میگوییم.myled = LED(21)موازی با کد سخت افزار هم ببندیم! مدار LEDپایه منفی LED به یکی از زمین های رزبری پای و پایه مثبت LED را به GPIO21 (که همون پایه شماره 40) هست وصل میکنیم.حالا برای روشن کردن LED از تابع on استفاده میکنیم.myled.on()مشاهده میکنید که led روشن شد. برای خاموش کردنش از تابع off استفاده میکنیم.myled.off()علاوه بر دو تابع بالا تابع های دیگری مثل toggle هم هست که وضعیت led رو برعکس میکند یعنی از خاموش به روشن یا برعکس.تابع blink: این تابع یک led چشمک زن برای ما درست می کند که ورودی آن فاصله بین هر چشمک هست بر حسب ثانیه مثلا:myled.blink(5)مشاهده می کنید که هر 5 ثانیه یک بار led خاموش و روشن می شود.البته بدون استفاده از تابع blink هم میشود به صورت دستی این کار رو انجام داد. برای این کار باید بتونیم تاخیر ایجاد کنیم. پس از کتابخونه time تابع sleep رو فراخوانی میکنیم.from time import sleepیک حلقه هم نیاز داریم که مداوم این عمل خاموش روشن شدن رو انجام دهد. دستور حلقه در پایتون while هست و جلو آن شرط حلقه را مینویسیم مثلا while 1 که یک حلقه بی نهایت هست و تا ابد این حلقه را اجرا خواهد کرد. (دستورات داخلی while باید با یک tab نوشته شوند)while 1: led.toggle() sleep(1)کد بالا دقیقا همون کاری که تابع blink میکرد رو انجام می دهد.Buttonکلاس button برای تعریف کلید هست و طریقه استفاده همانند کلاس led می باشد.یک آبجکت تعریف میکنیم که پایه GPIO2 را به عنوان یک کلید استفاده کنیم*** دقت کنید شماره پایه با شماره GPIO (عددی که در پرانتز می نویسید) فرق میکنهbtn = Button(2)طریقه وصل کردن هم خیلی ساده است. یک پایه کلید رو به زمین و پایه دیگر به GPIO2 که در کد تعریف کردیم.آبجکت btn دارای 2 ویژگی (property) است: is_pressed , is_held و روش استفاده هم به صورت زیر هست:while True: if btn.is_pressed: led.on() else: led.off()زمانی که شرط btn.is_pressed صحیح باشد led روشن میشود و در غیر این صورت خاموش میشود. با btn.is_held میتوانیم شرط رو طوری بنویسیم که فقط زمانی که کلید نگه داشته شد روشن شود.علاوه بر ویژگی های بالا btn دارای دو متد (method) نیز هست : wait_for_release و wait_for_press با این دو متد میتوان تعیین کرد رزبری پای منتظر بماند که کلید فشار داده شود یا رها شود:while True: button.wait_for_press() led.on() button.wait_for_release() led.off()در این کد رزبری پای صبر می کند تا کلید فشار داده شود و led را پس از فشار دادن روشن میکند و همچنین صبر می کند تا کلید رها شود و led را خاموش کند.روش دیگر پیاده سازی این کد بدون حلقه while به صورت زیر است:btn.when_pressed = led.on btn.when_released = led.offو روش سوم و ساده ترین روش که منبع خاموش و روشن شدن ابجکت led را کلید btn قرار میدهد.led.source = btnکم کم به آخر آموزش نزدیک می شویم و باید رزبری پای رو خاموش کنیم ولی این دفعه با کلید خاموش میکنیم.کلید خاموش و روشن برای رزبری پایfrom gpiozero import Button from subprocess import check_call def shutdown(): print('shutdown...') check_call(['sudo', 'poweroff']) shutdown_btn = Button(17, hold_time=2) shutdown_btn.when_held = shutdown در 2 خط اول کتابخانه های لازم رو فراخوانی میکنیم. تابع check_call از کتابخانه subprocess برای نوشتن دستور در ترمینال رزبری پای هست.در خط سوم یک تابع با نام shutdown تعریف کردیم و کد خط پنجم کامند poweroff را با sudo اجرا میکند (sudo دسترسی به کاربر Root رو میدهد) میتونید خودتون امتحان کنید و sudo poweroff را در ترمینال بنویسید تا رزبری پای خاموش شود. حال هر زمان که این تابع فراخوانی شود رزبری پای خاموش میشود.یک کلید با نام shutdown_btn نیز تعریف میکنیم. کلاس Button در اینجا با یک آرگومان جدید تعریف شده. عدد 17 که شماره gpio هست و hold_time=2 تعیین میکند که زمان نگه داشته شدن کلید 2 ثانیه است. یعنی اگر 2 ثانیه کلید را نگه داریم رزبری پای when_held را تشخیص می دهد که در خط بعد استفاده شده.در خط اخر هم هر زمان که shutdown_btn نگه داشته شود تابع shutdown را اجرا می کند.برای اینکه کد را همیشه داشته باشیم آن را در دسکتاپ رزبری پای ذخیره میکنیم. پس کد زیر را در ترمینال رزبری پای اجرا کنیدcd Desktopاکنون وارد دایرکتوری دسکتاپ شده اید. سپس یک فایل با نام shutdown و با پسوند py. (پسوند فایل پایتون) ایجاد میکنیم.sudo touch shutdown.pyکد فوق را در به کمک nano در فایل مینویسیم.sudo nano shutdown.pyپس از نوشتن کد با کلید های ctrl + o و فشار دادن Enter فایل را ذخیره میکنیم. و با ctrl + x از ادیتور خارج میشویم.برای اجرا کردن برنامه کافیست در آدرس مربوطه (cd Desktop را زده باشیم) کد زیر را در ترمینال اجرا کنیمpython3 shutdown.pyاکنون هر زمان که کلید را فشار دهیم و برنامه اجرا باشد رزبری پای خاموش خواهد شد.--- سخن آخر ---ممنون که همراه ما بودین.در قسمت پنجم با کتابخانه ها و کد های بیشتری آشنا می شویم. با به اشتراک گذاشتن این مجموعه از ما حمایت کنید.راستی اگر هرجای کار سوالی داشتید در قسمت نظرات همین پست بپرسید.