به امید خدا تو این پست و پست بعدی به راه اندازی پین های ورودی و خروجی رزبری پای ( GPIO ) می پردازیم.
استفاده از پایه های GPIO رزبری پای به عنوان خروجی
رزبری پای 2 و 3 دارای 40 پین خروجی/ورودی می باشند. که رابط i2c,spi,uart از امکاناتش به حساب میاد. فقط یه adc کم داره که میشه با یه آی سی adc بهش اضافه کرد. نقطه قوت رزبری پای اینه که در عین کامپیوتر بودن، امکانات یک میکرو کنترلر رو در اختیار ما میگذاره. در تصویر زیر، پین های رسپری 2 و 3 رو می بینیم:
در مرحله اول، صفر و یک کردن پایه ها رو بررسی می کنیم.(عملیات مشابه PORTA.0=1 که در CV AVR داشتیم رو با رزبری پای پیاده می کنیم.)
نام گذاری پایه های رزبری پای در دو مد مختلف انجام گرفته :
- BCM
- BOARD
نام گذاری پایه ها در مد BCM برای هر ورژن رزبری پای متفاوت است و برای مثال همان عددی است که در تصاویر بالا مقابل عبارت GPIO نوشته شده است. نام گذاری پایه ها در مد BOARD برای ورژن های مختلف رسپری که تعداد پایه های برابری دارند، مشابه هم است و برای مثال همان عددی است که در تصاویر بالا زیر ستون pin نوشته شده است.
مد BCM زمانی استفاده می شود که نیاز به اجرای برنامه روی نسخه های مختلف رزبری پای باشد.(قابلیت حمل)
در ابتدا، نیاز به یک فضای برنامه نویسی داریم. می توان از ترمینال استفاده کرد ولی ما به دلیل سادگی کار، با python کار میکنیم.
- منابع آموزشی بسیار
- پایتون یک مفسر است و به ما امکان خطایابی دقیق را می دهد ( چون برنامه رو خط به خط ترجمه می کنه ولی کامپایلر برنامه رو یکجا ترجمه میکنه. )
ولی عیب مفسر ها در سرعت پایین تر نسبت به کامپایلر است.(در برنامه هایی با حلقه زیاد و پیچیده و عملیات های تکراری مثلا پردازش تصویر این اختلاف سرعت مشهود است.)
محیط کار پایتون 3 :
می خوایم یه ال ای دی رو با رسپری روشن و خاموش کنیم.مدار زیر رو می بندیم:
آنود ال ای دی رو به پین 36 (GPIO16) وصل می کنیم و با یک مقاومت 220 اهمی سری کرده و سر دوم مقاومت را به یکی از پایه های زمین رزبری پای وصل می کنیم.
با رعایت حروف بزرگ و کوچک و فاصله ها، کد های زیر رو به ترتیب در پایتون وارد کنید ( بعد از هر خط اینتر بزنید )
1 |
import RPi.GPIO as GPIO |
کد بالا، کتابخونه مربوط به GPIO رو فراخوانی میکنه ( یه چیزی مثل <include<mega32 تو کد ویژن میمونه )
1 |
GPIO.setwarnings(False) |
این یکی مانع وقوع خطا هنگام تنظیم دوباره پایه می شود
1 |
GPIO.setmode(GPIO.BOARD) |
کد بالا، مد کاری رو مشخص میکنه.(مد BOARD)
1 |
GPIO.setup(36, GPIO.OUT) |
کد بالا، پایه 36 رو به عنوان خروجی تنظیم میکنه.(عملی مشابه دستور DDRA در کد ویژن)
دو قطعه کدی که در زیر میاریم، کار دو خط بالا رو انجام میده.(این بار در مد BCM )
1 2 |
GPIO.setmode(GPIO.BCM) GPIO.setup(16, GPIO.OUT) |
توجه : برای تغییر مد باید پایتون رو ریست کرد.(با فشردن کلید ترکیبی Ctrl+F6)
در ادامه فرض بر این است که مد کاری روی BCM تنظیم شده است.
حالا برای 0 و 1 کردن پایه مورد نظر،از دستور زیر استفاده می کنیم:(ابتدا یک کردن پایه)
1 |
GPIO.output(16, 1) |
دو دستور زیر،هم عملکرد مشابه دستور قبلی دارند:
1 2 |
GPIO.output(16, GPIO.HIGH) GPIO.output(16, True) |
برای صفر کردن پایه هم از یکی از سه دستور زیر می توان استفاده کرد:
1 2 3 |
GPIO.output(16, 0) GPIO.output(16, GPIO.LOW) GPIO.output(16, False) |
توجه : سطح ولتاژ منطق 1، برابر 3.3 ولت است.
برای اینکه کدهایی که می نویسیم ، دوباره قابل اجرا باشند، پایتون رو ببنید و ترمینال رو باز کنید.در محیط ترمینال،با تایپ کد زیر،یک فایل با پسوند قابل اجرا توسط پایتون باز می شود:
1 |
sudo nano name.py |
از این بعد،برنامه های خودمون رو تو این محیط می نویسیم.
می خواهیم برنامه ای بنویسیم که یک ال ای دی که به پایه شماره 36 متصل است رو به مدت 3 ثانیه روشن کرده،سپس دوباره خاموش کنیم:(پایه 36 در مد BCM 16 نام گذاری شده است.)
1 2 3 4 5 6 7 8 |
import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(16, GPIO.OUT) GPIO.output(16,1) sleep(3) GPIO.output(16,0) |
خط دوم، از کتابخانه time ، تابع sleep رو به برنامه اضافه می کنه.(مشابه <include <delay.h در کد ویژن) تابع sleep پارامترش رو بر حسب ثانیه میگیره و عدد اعشاری هم قبول می کنه.
بعد از نوشتن کد، کلید های ترکیبی Ctrl+x رو فشار دهید، سپس کلید y رو فشار بدید. بعدش اینتر بزنید تا به صفحه اصلی ترمینال برگردید. بعدش کد زیر رو تایپ و اینتر کنید:
1 |
sudo python name.py |
قطعه کدی که نوشتید، اجرا شد.
حالا اگه بخوایم برنامه دائما اجرا بشه، و ال ای دی 3 ثانیه روشن بماند و 1 ثانیه هم خاموش بماند و این روند ادامه داشته باشد در ترمینال تایپ کنید :
1 |
sudo nano name.py |
و مطابق تصویر زیر دو خط به برنامه اضافه کنید :
یکی
1 |
while 1: |
و دیگری
1 |
sleep(1) |
بعدش مثل دفعه قبل، Ctrl+x و بعدش y و سپس اینتر و اجرای برنامه با وارد کردن کد زیر در ترمینال(از این به بعد،نمیگم که اینتر هم می خواد. بدونید که بعد از تایپ هر دستور در ترمینال، باید اینتر بزنید.)
1 |
sudo python name.py |
برنامه شروع به کار می کنه و تا زمانی که کلید های ترکیبی Ctrl+z رو نزدید،به کارش ادامه میده.
توجه : در پایتون، بعد از دستورات شرطی، تعدادی از برنامه های زیر شرط اجرا می شوند که از یک ستون شروع می شوند. برای مثال اگر خط آخر ( (sleep(1 ) رو به اول سطر ببریم، دیگه جزو عملیات شرط نخواهد بود و اجرا نمیشه. و ال ای دی همواره روشن دیده می شه. و پایان while جایی هست که به اول سطر برگردیم.
برای تنظیمات چند پین به صورت هم زمان فقط یه مثال میزنم:
برای مثال،می خواهیم سه پایه GPIO16 و GPIO20 و GPIO21 رو به صورت همزمان تغییر بدیم.
1 2 3 4 5 6 7 8 |
import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup((16,20,21), GPIO.OUT) GPIO.output((16,20,21),1) sleep(3) GPIO.output((16,20,21),0) |
این کد، ابتدا پایه های GPIO16 و GPIO20 و GPIO21 رو به عنوان خروجی تنظیم میکنه. بعدش مقدار 1 رو به هر سه تاشون میده و 3 ثانیه بعد،سه تاشون رو 0 می کنه.
اگر بخوایم به هر کدوم از پایه ها رو جداگانه مقدار بدیم،اینجوری می نویسیم:
1 2 3 4 5 6 7 8 |
import RPi.GPIO as GPIO from time import sleep GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup((16,20,21), GPIO.OUT) GPIO.output((16,20,21),(1,0,1)) sleep(3) GPIO.output((16,20,21),(0,1,0)) |
این کد هم سه تا پایه رو به عنوان خروجی مقدار دهی می کنه و مقدار 1 رو به پایه GPIO16 و GPIO21 و مقدار 0 رو به GPIO20 میده و سه ثانیه بعد معکوسشون می کنه.
توجه : برای اینکه در استفاده های بعدی از خطاهای احتمالی جلوگیری شود،بهتر است در انتهای کد،از تابع زیر استفاده کنیم:
1 |
GPIO.cleanup() |
به امید خدا در مطلب بعدی، نحوه تنظیم PWM رو خواهیم داشت و راه اندازی سرو موتور SG90
جهت هر چه مستحکم تر شدن مقام ولایت فقیه و تعجیل درظهور بابای خوبمون مهدی(عج) صلوات
مهمان
سلام دوست عزیز. بنده میخام صفحه ای طراحی کنم که به ازای هر کلاینت یه دکمه وجود داشته باشه تو او نصفحه. به طور مثال 50 دکمه باشه. روی هر دکمه که مدیر سیستم کلیک کرد، بتونه میزان جریان سیال (flow) رو مشاهده کنه و همچنین امکان روشن، خاموش و ریست کردن اون کلاینت رو داشته باشه. اطلاعات از طریق پورت سریال UART وارد رزپری میشن. میشه راهنمایی کنی اگر تجربشو داشتین که با چه زبانی این کارو انجام بدم؟ با پایتون؟ و اینکه آیا پایتون فقط رو رسپبری نصب و اجرا میشه؟ یا تو ویندوزم میشه
نویسنده این مطلب
سلام.برای طراحی گرافیکی(دکمه و کلید و…) باید از qt یا مشابهش استفاده کنید(qt شبیه ویژوال استودیو هست)
یه نرم افزار خیلی ساده هم برای کد نویسی هست(به نام scratch) که روی رزبری نصبه.ببینید کارتون رو انجام میده یا خیر؟
مهمان
سلام اکر بخواهیم برای ریست کردن یه میکرو از رزبری استفاده کنیم چه پابه ای به کار میاد
نویسنده این مطلب
سلام اگر منظورتون ریست کردن خود رزبریه
تو لینک زیر یه آموزش گذاشته (البته بنده امتحان نکردم!!)
دکمه ریست برای رزبری پای
اما اگه منظورتون ریست کردن یه میکرو دیگه با رزبری هست،باید یکی از پایه های رزبری رو به پایه ریست میکرو وصل کنید .
مهمان
درود
من برنامه شما رو با استفاده فایل سیستم و پایتون اجرا کردم البته با برد pine64 به این صورت
def unexport_pins(pins):
try:
f = open(“/sys/class/gpio/unexport”,”w”)
f.write(str(pins))
f.close()
except IOError:
print “GPIO %s is not found, so skipping unexport gpio” % (str(pins), )
def setpindirection(pin_no, pin_direction):
gpiopin = “gpio%s” % (str(pin_no), )
pin = open(“/sys/class/gpio/”+gpiopin+”/direction”,”w”)
pin.write(pin_direction)
pin.close()
def writepins(pin_no, pin_value):
gpiopin = “gpio%s” % (str(pin_no), )
pin = open(“/sys/class/gpio/”+gpiopin+”/value”,”w”)
if pin_value == 1:
pin.write(“1”)
else:
pin.write(“0”)
pin.close()
def readpins(pin_no):
gpiopin = “gpio%s” % (str(pin_no), )
pin = open(“/sys/class/gpio/”+gpiopin+”/value”,”r”)
value = pin.read()
print “The value on the PIN %s is : %s” % (str(pin_no), str(value))
pin.close()
return int(value)
if __name__ == ‘__main__’:
from time import sleep
export_pins(32)
setpindirection(32, “out”)
while(1):
writepins(32, 1)
sleep(1)
writepins(32, 0)
sleep(1)
نویسنده این مطلب
سلام
خیلی ممنون .
pin64 نسبت به سری رزبری پای چه مزایایی داره؟
مهمان
درود
Pine64 یه پردازنده 4 هسته ای 64 بیتی داره (a64 allwinner) که همانند رزبری پای ۳ از معماری cortex a53 استفاده میکنه و دارای خروجی مشابه رزبری پای 2 هست . از سیستم عامل های android و لینوکس هم پشتیبانی میکنه .
به لحاظ قیمت بسیار ارزون تر هست نسبت به رزبری ولی به لحاظ منابع آموزشی و نرم افزارهای موجود قطعا رزبری حرف اول رو میزنه و من پیشنهاد میکنم واسه کسایی که میخوان با این سیستما کار کنن اول با رزبری شروع کنن به دلیل منابع آموزشی خوب .
مشابه رزبری کتابخانه RPi_GPIO هم میشه روش نصب کرد (البته باید از گیت های دانلودش کنید) که مثل gpio های رزبری میشه به پایه ها تو مد bcm و board مقدار داد.
مهمان
زبان پایتون یه زبان سطح بالاه و به همین دلیل بیش از حد آبخوردن تشریف داره و به نظر شما زیاد جالب نیست مخصوصا نحوه حلقه گذاری و رعایت اصول در حلقه و تب ها نبود goto
و در مورد برنامه نویسی با زبان های دیگه هم اگه کتاب خونش باشه چرا که نه ولی راحت ترین و روش اصلی همین پایتونه
مطمئن باشید اگه پایتون زبان مسخره ای بود به طور پیش فرض در تمامی لینوکس ها قرار نمی گرفت
باز ممنون از سایت خوبتون
مدیر سایت
نه کسی که با خونواده C کار کنه یه جورایی بهش وابسته میشه و نه این که بیشتر کار ما با زبون سی هستش تو الکترونیک یکم سخته بریم سمت پایتون – برا من حداقل این طوری هستش.
مهمان
سلام. بهتر نیست با c++ و کیوت برنامه ها رو نوشت.
این قسمت هم برای مدیر سایت و دوستانی که c++ کار میکنن.
اسم کتابخونه مربوط به gpio
wiringPi هستش. که راحت روی کیوت نصب میشه.
نویسنده این مطلب
تا حالا کار نکردم .
نویسنده این مطلب
البته الان دیگه کار کردم!!!
مهمان
خیلی عالی بود- منتظر قسمت pwm هستیم
مدیر سایت
آقا ممنون ولی
1) کاش شماتیک پروژه رو هم میزاشتی.
2) این پایتون که مثل برنامه نویسی مطلب هستش، به شخصه از پایتون در نگاه اول خوشم نیومد.
نمیشه به زبون c برنامه نوشت؟ خیلی دوست دارم تو رزبری پای از qt و c استفاده کنم.
نویسنده این مطلب
با سلام
1_یه چیزی شبیه شماتیک برای قسمت اول گذاشتم.برای قسمت دوم هم می خواستم بذارم.گفتم الکی مطلب شلوغ میشه.
2_شدن که میشه ولی تا حالا با رسپری قسمت نشده برم سمت C از خداوند می خوام راه C رو به سمت بنده کج بفرماید ما که حالشو نداریم بریم سمت C
نویسنده این مطلب
یه سوال:
چجوری می تونم شماتیکی مثل شکل زیر برای رسپری بسازم؟
https://dmf313.ir/wp-content/uploads/VIEW24.png
مدیر سایت
به کمک نرم افزار Fritzing که برا رزبری هم فک کنم جواب بده