نحوه پیکربندی پین های رزبری پای (Raspberry GPIO) در پایتون
سلام. چطور روی raspberry Pi تحت سیستم عامل Linux چطوری میتونید از GPIO ها یا پایه های برد خودتون در python استفاده کنیم ؟
در پست های قبل توضیح دادم که چطور میتونید روی Raspberry PI خودتون Ubuntu Linux نصب کنید .
در این پست نصب کتابخانه رو یاد میگیریم و با چند مثال ساده یه برنامه مینویستم .
اگر شما هم برنامه ای برای اولین بار نوشتید اعلام کنید تا به اسم خودتون تو سایت بزارمش .
پین GPIO در رزبری پای چیست ؟
پینهای GPIO در رزبری پای، پینهایی هستند که برای افزودن برخی امکانات به رزبری پای طراحی شدهاند. این پینها به صورت دیجیتال عمل میکنند و میتوانند دو حالت روشن یا خاموش داشته باشند. با استفاده از زبانهای برنامهنویسی مانند پایتون، جاوااسکریپت و نود-رد میتوانید وضعیت و جهت پینها را کنترل کنید۱۲.
برای مثال، با استفاده از پینهای GPIO میتوانید با استفاده از چراغ LED یک سیگنال را نمایش دهید۳.
ورودی و خروجی های متنوعی در رزیری پای وجود داره که برای اتصال اکثر تجهیرات الکترونیکی در دسترس هست . دقت داشته باشید بعضی سنسور ها با ولتاژ ۳.۳ ولت و بعضی ها هم با ولتاژ ۵ ولت یا بیشتر کار میکنند .
حداکثر ولتاژ ورودی و خروجی پین های GPIO رزبری پای ۵ ولت هست !
نصب کتابخانه GPIO رزبری پای در پایتون:
اول باید کتابخانه پایتون رو نصب کنیم .
۱ ۲ |
sudo apt-get update sudo apt-get install python-rpi.gpio python3-rpi.gpio -y |
کتابخانه تخصصی (برنامه نویسان ارشد ):
اگر احتیاج به کتابخانه های تخصصی هم داشتید میتونید از این دستورات استفاده کنید که اگر استقبال شد بعدا این پست رو درست میکنم.
۱ ۲ ۳ ۴ ۵ ۶ |
sudo apt-get install python-dev python3-dev sudo apt-get install mercurial sudo apt-get install python-pip python3-pip sudo apt-get remove python-rpi.gpio python3-rpi.gpio sudo pip install hg+http://hg.code.sf.net/p/raspberry-gpio-python/code#egg=RPi.GPIO sudo pip-۳.۲ install hg+http://hg.code.sf.net/p/raspberry-gpio-python/code#egg=RPi.GPIO |
حذف کتابخانه پین GPIO در رزبری پای :
برای حذف کتابخانه ها میتونید از دستورات زیر استفاده کنید :
۱ ۲ ۳ |
sudo pip uninstall RPi.GPIO sudo pip-۳.۲ uninstall RPi.GPIO sudo apt-get install python-rpi.gpio python3-rpi.gpio |
پیکربندی اولیه پایتون در رزبری پای :
فراخانی کتابخانه :
برای استفاده از این کتابخانه باید حتما در ابتدای برنامه اون رو فراخونی کنید .
۱ |
import RPi.GPIO as GPIO |
شماره پایه های GPIO رزبری پای :
برای فراخوانی پایه ها ۲ روش متفاوت وجود داره .
- ساختار شماره پایه ها مشخص شده برای برد (توضیه شده ) ،این شماره ها همون شماره های استفاده شده بر روی برد هاست که از ۱ تا ۴۰ هست و استفاده از اون خیلی راحته
- ساختار BCM ،در این روش که برای برنامه های سطح پایین (برعکس اسمش اصلا سطح پایین نیست D: )استفاده میشه به جای شماره پایه از شماره کانال استفاده میشه .
مثال :
دو حالت نوشته شده رو میتونید استفاده کنید
۱ ۲ ۳ |
GPIO.setmode(GPIO.BOARD) # or GPIO.setmode(GPIO.BCM) |
و برای اینکه متوجه بشید هر پایه رو به چه سیستمی تعیین کردید از دستور زیر استفاده کنید
۱ |
mode = GPIO.getmode() |
نتیجه به ۲ حالت میتونه باشه GPIO.BOARD و یا GPIO.BCM
پیکربندی نوع پابه ها به صورت تکی(استفاده به عنوان ورودی و یا خروجی )
شما نیاز دارید هر پایه رو به صورت جداگانه پیکربندی کنید و تعیین کنید که میخواید از این پایه به عنوان ورودی استفاده کنید یا خروجی که با دستور زیر این کار رو انجام میدیم .
منظور از ورودی اینه که پایه مد نظر شما قرار اطلاعات رو دریافت کنه مثلا وصلش کنید به یه کلید که مقدار کلید رو که ۰ یا ۱ هست بخونه و خروجی هم مثلا قرار به یه لامپ وصل بشه و اطلاعات رو ارسال کنه
برای پیکربندی پایه رزبری پای به عنوان ورودی از دستور زیر استفاده میکنیم و به جای کلمه channel شماره پایه مدنظر رو وارد میکنیم .
۱ |
GPIO.setup(channel, GPIO.IN) |
برای پیکربندی پایه رزبری پای به عنوان خروجی از دستور زیر استفاده میکنیم و به جای کلمه channel شماره پایه مدنظر رو وارد میکنیم .
۱ |
GPIO.setup(channel, GPIO.OUT) |
در ضمن اگر میخواید مقدار پیش فرزی برای یک پایه تعیین کنید عبارت initial=GPIO.HIGH رو اضافه میکنیم به صورت زیر :
۱ |
GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH) |
پیکربندی نوع پین GPIO در رزبری پای به صورت گروهی :
برای پیکربندی نوع پایه های رزبری پای به صورت گروهی از دستور زیر استفاده میکنیم :
۱ ۲ ۳ |
chan_list = [۱۱,۱۲] # شماره پایه های مدنظر خودتون رو در این لیست وارد کنید # بین شماره پایه ها از , استفاده کنید GPIO.setup(chan_list, GPIO.OUT) |
دستورات پایتون کنترل پین GPIO در رزبری پای :
کنترل وضعیت پایه ورودی :
فرض کنید شما یک کلید به یکی از GPIO رزبری پای خودتون متصل کردید و میخواید وضعیت اون کلید رو متوجه بشید ، با استفاده از دستور زیر میتونید وضعیت پایه مدنظر خودتون رو متوجه بشید . فقط کافیه به جای channel شماره GPIO مد نظر خودتون رو وارد کنید .
۱ |
GPIO.input(channel) |
بعد از وارد کردن مقدار برگشتی به صورت ۰ و یا ۱ برگشت داده میشه .
کنترل وضعیت پایه خروجی :
حالا میخوایم لامپ LED که به یکی از پایه های رزبری پای متصل کردیم رو با پایتون روشن کنیم . از دستور زیر استفاده کنید و به جای channel پایه GPIO که لامپ LED بهش متصل شده رو وارد کنید و به جای state مقدار ۰ یا false یعنی خاموش و ۱ یا true یعنی روشن رو وارد کنید .
۱ |
GPIO.output(channel, state) |
کنترل وضعیت پایه ها خروجی به صورت گروهی :
حالا فرض کنید میخواید با یه دستوز تعدادی پایه رو کنترل کنید ، از دستور زیر استفاده کنید
۱ ۲ |
chan_list = [۱۱,۱۲] # شماره پایه های مدنظر خودتون رو در این لیست وارد کنید GPIO.output(chan_list, GPIO.LOW) # تمامی پایه های لیست بالا رو خاموش میکنه |
پاک سازی وضعیت پین GPIO در رزبری پای در پایتون :
در حالتی که شما یک پایه رو مقدار دهی میکنید اون مقدار تا زمانی که مقدار جدیدی به اون پایه نداده باشید تغییر نمیکنه و بعد از پایان یک برنامه کماکان آخرین وضعیت روی پایه ها پابرجا هست . برای همین بعد از اجرای یک کد میتونید پایه ها رو به حالت پیش فرض خودشون در بیارید .
برای پاکسازی مقدار پایه ها از دستور زیر استفاده میکنیم :
۱ |
GPIO.cleanup() |
با دستور بالا تمامی پایه ها به حالت پیش فرض بر میگردند و اگر بخواهید فقط بعضی از پایه ها رو پاکسازی کنید به صورت زیر عمل کنید :
۱ ۲ ۳ |
GPIO.cleanup(channel) GPIO.cleanup( (channel1, channel2) ) GPIO.cleanup( [channel1, channel2] ) |
ورودی در پین GPIO در رزبری پای :
راه های مختلفی برای دریافت مقدار از پایه ها GPIO وجود داره . اولین و ساده ترین راه بررسی مقدار در زمان مشخص هست البته معایبی هم وجود داره در این روش که مثلا مقدار رو در زمان اشتباهی بخونید و داده رو از دست بدید . در این حالت مقادیر در بازه رمانی مشخصی به صورت چرخشی خونده میشن . راه دوم خواندن مقادیر ورودی به صورت ‘interrupts’ هست که وابسته به تحریک یک پایه هست و به محض تغییر وضعیت یک پایه مقدار خوانده میشه . در روش دوم حتما باید از مدار مقاومت Pull up / Pull down استفاده کرد تا نتیجه صحیح باشد .
مدار Pull up / Pull down :
فرض کنید در روش دوم ( interrupts ) در ورودی از مقاومت Pull up / Pull down استفاده نکنید و در این حالت پایه در وضعیت شناور قرار دارد و مقداری که از این پایه خوانده میشود در وضعیت تعریف نشده قرار دارد چون مدار نه به زمین و نه به تغذیه متصل شده .
برای رفع این مشکل ، از یک مقاومت با عنوان pull up/down resistors استفاده میکنیم . این مقاومت هم به صورت نرم افزاری و هم به صورت سخت افزاری قابل استفاده میباشد . در حالت سخت افزاری معمولا از یک مقاومت 10K اهمی بین کانال ورودی و ولتاژ تغذیه ۳.3V یا بین کانال ورودی و زمین استفاده میشود .
برای pull up/down resistors به صورت نرم افزاری به صورت زیر عمل میکنیم :
۱ ۲ ۳ |
GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP) # or GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) |
خروجی در GPIO :
برای اینکه بتوانیم مقداری رو به پایه ها ارسال کنیم اول باید پایه رو به صورت خروجی تعریف کنیم
۱. تنظیم پایه های مدنظر به عنوان خروجی
۱ ۲ ۳ |
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(۱۲, GPIO.OUT) |
۲. برای فعال کردن یک پایه :
۱ ۲ ۳ ۴ ۵ |
GPIO.output(۱۲, GPIO.HIGH) # or GPIO.output(۱۲, ۱) # or GPIO.output(۱۲, True) |
۳. برای غیر فعال کردن یک پایه :
۱ ۲ ۳ ۴ ۵ |
GPIO.output(۱۲, GPIO.LOW) # or GPIO.output(۱۲, ۰) # or GPIO.output(۱۲, False) |
۴. برای تغییر مقدار چند پایه به صورت همزمان :
۱ ۲ ۳ ۴ ۵ |
chan_list = (۱۱,۱۲) GPIO.output(chan_list, GPIO.LOW) # all LOW GPIO.output(chan_list, (GPIO.HIGH,GPIO.LOW)) # first LOW, second HIGH |
۵. پاکسازی مقادیر پایه ها
۱ |
GPIO.cleanup() |
توجه داشته باشید که با استفاده از تابع input() می توانید وضعیت فعلی یک کانال راه اندازی شده را به عنوان خروجی بخوانید. به عنوان مثال برای تغییر یک خروجی
۱ |
GPIO.output(۱۲, not GPIO.input(۱۲)) |
استفاده از PWM در پایتون روی رزبری پای :
برای ساخت سیگنال PWM از این دستور میتوانید استفاده کنید .
۱ |
p = GPIO.PWM(channel, frequency) |
برای شروع ایجاد سیگنال PWM :
۱ |
p.start(dc) # where dc is the duty cycle (0.0 <= dc <= 100.0) |
تغییر فرکانس خروجی :
۱ |
p.ChangeFrequency(freq) # where freq is the new frequency in Hz |
برای تغییر چرخه کار ( duty cycle ) از دستور زیر استفاده کنید .
۱ |
p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0 |
توقف سیگنال pwm :
۱ |
p.stop() |
با اجرای دستور فوق ارسال دستور PWM متوقف میشود .
مثال : چشمک LED یه مرتبه در هر ۲ ثانیه :
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ |
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(۱۲, GPIO.OUT) p = GPIO.PWM(۱۲, ۰.۵) p.start(۱) input('Press return to stop:') # use raw_input for Python 2 p.stop() GPIO.cleanup() |
مثال :برای تغییر نور LED به وسیله سیگنال PWM :
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ |
import timeimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(۱۲, GPIO.OUT) p = GPIO.PWM(۱۲, ۵۰) # channel=12 frequency=50Hz p.start(۰) try: while ۱: for dc in range(۰, ۱۰۱, ۵): p.ChangeDutyCycle(dc) time.sleep(۰.۱) for dc in range(۱۰۰, -۱, -۵): p.ChangeDutyCycle(dc) time.sleep(۰.۱) except KeyboardInterrupt: pass p.stop() GPIO.cleanup() |
منبع : https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/