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

سلام

در قسمت سوم، رزبری جان (!) رو راه اندازی کردیم و الان میتونیم از اون استفاده کنیم. در این قسمت با سخت افزار و GPIO های اون آشنا میشیم و روش های برنامه نویسی اون ها رو بررسی می کنیم.

بهتره قبل از شروع این قسمت مروری بر برنامه نویسی پایتون داشته باشید.



Pinout

قبل از شروع کار به ترمینال رزبری پای ریموت بزنید. و کد زیر رو اجرا کنید.

pinout
Raspberry Pi Pinout
Raspberry Pi Pinout


چیزی که بالا میبیند اصطلاحا pinout رزبری پای هست و توضیحی در مورد سخت افزار، شماره و نام پایه های رزبری پای میدهد.

همون طور که میبینید اون مستطیل سبز رنگ رزبری پای هست و اون کادر های خاکستری پورت های USB, HDMI, شبکه، دوربین، نمایشگر و AV هستند.

اون o هایی که اون بالا می بینید همون GPIO های رزبری پای هستند و عدد یک شماره پایه 1 هست

توضیحاتی شامل تعداد پورت ها، میزان رم و... داده شده که کاری نداریم با اون ها فعلا.

پایین تر (قسمت راست تصویر بالا) نام و شماره تمام GPIO های رزبری پای هست که برای پیدا کردن شماره پایه ای باید این ها رو با اون شماره پایه 1 که توی شکل بود تطبیق بدین.

راه ساده تر این هست که به ادرس زیر مراجعه کنید.

https://pinout.xyz/

برای راحتی کار میتونید از این تگ ها تهیه کنید:

Pinout Tag
Pinout Tag



GPIO

همون پایه های رزبری پای که با اون ها با دنیای خارج ارتباط برقرار میکنیم را GPIO می گویند و مخخف General Propose Input/Output هست.

GPIO
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 به یکی از زمین های رزبری پای و پایه مثبت 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

اکنون هر زمان که کلید را فشار دهیم و برنامه اجرا باشد رزبری پای خاموش خواهد شد.



--- سخن آخر ---
ممنون که همراه ما بودین.
در قسمت پنجم با کتابخانه ها و کد های بیشتری آشنا می شویم.
با به اشتراک گذاشتن این مجموعه از ما حمایت کنید.

راستی اگر هرجای کار سوالی داشتید در قسمت نظرات همین پست بپرسید.