نحوه پیکربندی پین های رزبری پای (Raspberry GPIO) در پایتون
![نحوه پیکربندی پین های رزبری پای (Raspberry GPIO) در پایتون](https://meties.ir/wp-content/uploads/2019/11/blog-image.jpg)
سلام. چطور روی 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 استفاده میکنیم . این مقاومت هم به صورت نرم افزاری و هم به صورت سخت افزاری قابل استفاده میباشد . در حالت سخت افزاری معمولا از یک مقاومت ۱۰K اهمی بین کانال ورودی و ولتاژ تغذیه ۳.۳V یا بین کانال ورودی و زمین استفاده میشود .
برای 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/