جلسه سوم آموزش Raspberry pi – کار با GPIO ها { بخش دوم }
مقدمه
در جلسه دوم از آموزش GPIO قصد داریم بحث مربوط به GPIO ها را ادامه دهیم. در جلسه قبل ما تا بحث خروجی کردن یک پایه پیش رفتیم. در این جلسه قصد داریم در مورد PWM ها و خوانده مقدار روی یک پایه و مقاومت Pull up کمی صحبت کنیم و یاد بگیریم که چگونه یک برنامه را در سیستم عامل رزبین میتوانیم اجرا کنیم. پیشنهاد میکنم برای فهم بهتر این جلسه ، حتما جلسات قبل این آموزش را از لینک های زیر مطالعه کنید :
- جلسه اول دوره رزبری پای – آشنایی با رزبری پای و نحوه نصب سیستم عامل
- جلسه دوم دوره رزبری پای – کار با پایه های GPIO – بخش اول
راه اندازی PWM بر روی رزبری پای
[post_shop]
در برد رزبری پای نسخه 1 فقط یک پایه PWM وجود داشت در حالی که تعداد پایه ها در رزبری پای 3 به 4 عدد افزایش یافت. این پایه ها 12 و 33 و 35 و 36 هستند. در اینجا ما از پایه 12 برای PWM استفاده میکنیم . قبل از این که دستورات مربوط به PWM را با هم یاد بگیریم ، در صورتی که با PWM آشنایی ندارید پیشنهاد میکنم حتما جلسه مربوط به آموزش PWM را از لینک زیر مطالعه کنید:
برای پیکربندی اولیه PWM از دستور زیر استفاده میکنیم :
GPIO.PWM([pin], [frequency])
در دستور بالا pin نام پین مربوطه را مشخص می کند و frequency هم فرکانس خروجی آن پایه را تعیین می کند. البته پیشنهاد می شود ، فورا Duty Cycle مربوط به PWM را به آن اختصاص دهید. این کار را میتوان به صورت زیر انجام داد:
pwm.start([duty cycle])
در دستور بالا پارامتر duty cycle عددی بین 0 تا 100 است که مقدار Duty Cycle موج PWM را تعیین می کند. مثالی از پیکر بندی اولیه یک PWM در زیر آورده شده است :
pwm = GPIO.PWM(12, 1000) pwm.start(50)
در دستورات بالا ما فرکانس PWM را برای پایه 12 برابر با 1 کیلوهرتز (1000 هرتز) تعریف کرده ایم و مقدار Duty Cycle آن نیز برابر با 50 درصد است. البته مقدار Duty Cycle را میتوان تغییر داد. این کار را میتوان با دستور زیر انجام داد :
pwm.ChangeDutyCycle([duty cycle])
مشابه دستور قبل ، در اینجا نیز پارامتر Duty Cycle برابر با Duty Cycle موج است. مثلا اگر بخواهیم Duty Cycle مربوط به این پایه را به 75 درصد تغییر دهیم ، در این صورت خواهیم داشت :
pwm.ChangeDutyCycle(75)
همچنین اگر بخواهیم پایه PWM را غیر فعال کنیم و دیگر موجی در خروجی تولید نکند میتوانیم از دستور زیر استفاده کنیم:
pwm.stop()
به همین سادگی میتوانیم پایه مربوط به PWM را پیکربندی کنیم. البته فراموش نکنید که قبل از هرکاری ، پایه مربوطه را به صورت خروجی تعریف کنید.
استفاده از دستور input برای خواندن سطح یک پایه:
برای تعریف یک پایه به صورت خروجی میتوانیم از دستور زیر استفاده کنیم :
GPIO.input([pin])
خروجی این تابع True یا False هست که اگر True بود به این معنی است که آن پایه در سطح High است و اگر Flase بود به این معنی است که این پایه در سطح LOW است. برای تست سطح پایه میتوانیم از این دستور به همراه if else استفاده کنیم. مثالی در این رابطه در زیر آورده شده است:
if GPIO.input(11): print("Pin 11 is HIGH") else: print("Pin 11 is LOW")
در مثال بالا وضعیت پایه خوانده می شود و اگر آن پایه در سطح HIGH بود Pin 11 is HIGH و اگر در سطح LOW بود عبارت Pin 11 is HIGH نشان داده می شود.
Pull up و Pull down کردن پایه ها
ما در جلسه قبل در مورد تابع GPIO.setup صحبت کرده بودیم که به کمک اون میتونستیم یک پایه رو ورودی و یا خروجی کنیم. در این تابع یک پارامتر سومی هم وجود دارد که البته اختیاری است و ما میتوانیم آن را نگذاریم. با کمک این پایه میتوانیم مقاومت های Pull-up و Pull-down را برای یک پایه تعیین کنیم. برای قرار دادن مقاومت Pull-up بر روی یک پین باید از پارامتر pull_up_down=GPIO.PUD_UP به عنوان پارامتر سوم استفاده کنیم. البته اگر بخواهیم از مقاومت Pull-down استفاده کنیم در این صورت باید عبارت pull_up_down=GPIO.PUD_DOWN را به عبنوان پارامتر سوم آن دستور قرار دهیم. به عنوان مثال اگر بخواهیم بر روی پایه 11 یک مقاومت Pull-up قرار دهیم ، میتوانیم از دستور زیر استفاده کنیم:
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
البته توجه داشته باشید که اگر این پارامتر را تعیین نکنیم ، هر دو مقاومت Pull-up و Pull down غیر فعال می شود.
قرار دادن تاخیر در برنامه:
برای قرار دادن تاخیر در یک برنامه میتوان از ماژول time استفاده کرد. برای اضافه کردن ماژول time کافی است از دستور زیر استفاده کنیم:
import time
دستور مربوط به تاخیر نیز دستور time.sleep می باشد . این دستور یک پارامتر دارد که آن پارامتر نیز میزان تاخیر ایجاد شده بر حسب ثانیه است. مثال زیر را ببینید:
time.sleep(0.25)
به کمک دستور بالامیتوانیم به مدت 250 میلی ثانیه تاخیر ایجاد کنیم. البته ماژول time فقط شامل این دستور نیست و دستورات کامل و جامعی دارد. ولی برای شروع فعلا دستور sleep برای ما کفایت می کند.
آزاد کردن پایه ها:
یکی از نکاتی که باید به آن توجه کنیم این است که در انتهای برنامه حتما پایه ها و منابعی که در کد از آن ها استفاده میکنیم را آزاد کنیم. برای این کار کافی است از دستور GPIO.cleanup در انتهای کد خود استفاده کنیم تا پایه ها و منابع استفاده شده توسط کد به صورت کامل آزاد شوند.
خوب . تا حالا ما همه دستورات لازم برای کار با پایه های GPIO را یاد گرفتیم. حال وقت آن است که همه این موارد را جمع بندی کنیم و کدنهایی خود را بنویسیم و اجرا کنیم. در ادامه به صورت مرحله به مرحله از ایجاد یک فایل تا اجرای برنامه را آورده ایم:
ایجاد یک دایرکتوری
برای شروع ما نیاز داریم که یک فایل پایتون را بسازیم. این کار را به سادگی میتوان به کمک Raspbian انجام داد. البته راه دیگر این است که از Terminal استفاده کنیم. ابتدا ترمینال Rapsbian را باز کنید و کد های زیر را در آن بنویسید:
pi@raspberrypi ~/code $ mkdir python pi@raspberrypi ~/code $ cd python
در دستورات بالا ابتدا یک دایرکتوری به نام python ایجاد می کنیم و وارد آن دایرکتوری می شویم. ( عبارت mkdir مخفف make directory است و از آن برای ایجاد یک دایرکتوری استفاده می شود. )
ساخت یک فایل
کدهای بعدی که باید بنویسیم به صورت زیر است:
pi@raspberrypi ~/code/python $ touch blinker.py pi@raspberrypi ~/code/python $ leafpad blinker.py &
به کمک دستورات بالا یک فایل با نام blinker می سازیم و پسوند آن را py قرار میدهیم که این py مخفف پایتون است. چون میخواهیم در این فایل کدهای پایتون را بنویسیم. سپس این فایل را با ادیتور leafpad باز میکنیم.
کد کلی و اجرای برنامه
در کد زیر ما همه مواردی را که تاکنون یاد گرفته ایم را به صورت یکجا آورده ایم. کد زیر را ببینید:
# External module imports import RPi.GPIO as GPIO import time # Pin Definitons: pwmPin = 12 # Broadcom pin 18 ledPin = 16 # Broadcom pin 23 butPin = 11 # Broadcom pin 17 dc = 95 # duty cycle (0-100) for PWM pin # Pin Setup: GPIO.setmode(GPIO.BCM) # Broadcom pin-numbering scheme GPIO.setup(ledPin, GPIO.OUT) # LED pin set as output GPIO.setup(pwmPin, GPIO.OUT) # PWM pin set as output pwm = GPIO.PWM(pwmPin, 50) # Initialize PWM on pwmPin 100Hz frequency GPIO.setup(butPin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Button pin set as input w/ pull-up # Initial state for LEDs: GPIO.output(ledPin, GPIO.LOW) pwm.start(dc) print("Here we go! Press CTRL+C to exit") try: while 1: if GPIO.input(butPin): # button is released pwm.ChangeDutyCycle(dc) GPIO.output(ledPin, GPIO.LOW) else: # button is pressed: pwm.ChangeDutyCycle(100-dc) GPIO.output(ledPin, GPIO.HIGH) time.sleep(0.075) GPIO.output(ledPin, GPIO.LOW) time.sleep(0.075) except KeyboardInterrupt: # If CTRL+C is pressed, exit cleanly: pwm.stop() # stop PWM GPIO.cleanup() # cleanup all GPIO
بعد از این که کد بالا را در محیط Text editor خودتون تایپ کردید ، اون رو ذخیره کنید. در مرحله بعد میخواهیم این کد را اجرا کنیم.
ماژول RPi.GPIO برای اجرا نیاز به حالت admin دارد. به همین دلیل در ابتدای دستور اجرا از کلمه sudo استفاده میکنیم. حال برای اجرای برنامه بالا کافی است عبارت زیر را تایپ کنیم :
pi@raspberrypi ~/code/python $ sudo python blinker.py
وقتی که کد را اجرا کردید ، دکمه را فشار دهید تا LED متصل شده به پایه دیجیتال روشن شود. همچنین LED متصل شده به پایه PWM با هر بار فشار کلید ، روشنایی آن معکوس می شود.
[/post_shop]
پس کل کدی که ما باید در محیط ترمینال اجرا بنویسیم به صورت زیر است :
برای خارج شدن از برنامه کافی است CTRL+C را فشار دهید.
خوب دوستان. برای این جلسه هم کافی است. ما در جلسه بعد قصد داریم رزبری خود را به لپتاپ خود وصل کنیم و از دست کیبورد و ماوس و مانیتور راحت شویم. مثل همیشه می توانید ما را در تلگرام و یا اینستاگرام دنبال کنید :
دیدگاهتان را بنویسید