نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
أَللّهُمَّ ارْزُقْنی شَفاعَةَ الْحُسَیْنِ یَومَ الْوُرُودِ
محمدرضا اسلامی

پین های ورودی و خروجی رزبری پای raspberry pi gpio tutorial_part1

264

به امید خدا تو این پست و پست بعدی به راه اندازی پین های ورودی و خروجی رزبری پای ( GPIO ) می پردازیم.

استفاده از پایه های GPIO رزبری پای به عنوان خروجی

رزبری پای 2 و 3 دارای 40 پین خروجی/ورودی  می باشند. که رابط i2c,spi,uart از امکاناتش به حساب میاد. فقط یه adc کم داره که میشه با یه آی سی adc بهش اضافه کرد. نقطه قوت رزبری پای اینه که در عین کامپیوتر بودن، امکانات یک میکرو کنترلر رو در اختیار ما میگذاره. در تصویر زیر، پین های رسپری 2 و 3 رو می بینیم:
پین های ورودی و خروجی رزبری پای raspberry pi gpio tutorial
در مرحله اول، صفر و یک کردن پایه ها رو بررسی می کنیم.(عملیات مشابه PORTA.0=1 که در CV AVR داشتیم رو با رزبری پای پیاده می کنیم.)
نام گذاری پایه های رزبری پای در دو مد مختلف انجام گرفته :

  1. BCM
  2. BOARD

نام گذاری پایه ها در مد BCM برای هر ورژن رزبری پای متفاوت است و برای مثال همان عددی است که در تصاویر بالا مقابل عبارت GPIO نوشته شده است. نام گذاری پایه ها در مد BOARD برای ورژن های مختلف رسپری که تعداد پایه های برابری دارند، مشابه هم است و برای مثال همان عددی است که در تصاویر بالا  زیر ستون pin نوشته شده است.
پورت های رزبری پای
مد BCM زمانی استفاده می شود که نیاز به اجرای برنامه روی نسخه های مختلف رزبری پای باشد.(قابلیت حمل)
در ابتدا، نیاز به یک فضای برنامه نویسی داریم. می توان از ترمینال استفاده کرد ولی ما به دلیل سادگی کار، با python کار میکنیم.

چرا پایتون؟

  1. منابع آموزشی بسیار
  2. پایتون یک مفسر است و به ما امکان خطایابی دقیق را می دهد ( چون برنامه رو خط به خط ترجمه می کنه ولی کامپایلر برنامه رو یکجا ترجمه میکنه. )

ولی عیب مفسر ها در سرعت پایین تر نسبت به کامپایلر است.(در برنامه هایی با حلقه زیاد و پیچیده و عملیات های تکراری مثلا پردازش تصویر این اختلاف سرعت مشهود است.)

برای آشنایی با فضای پایتون در رزبری پای، مسیر زیر رو طی کنید:
آموزش پایتون در رزبری پای
محیط کار پایتون 3 :
محیط کار پایتون 3 رزبری پای
می خوایم یه ال ای دی رو با رسپری روشن و خاموش کنیم.مدار زیر رو می بندیم:
پروژه gpio رزبری پای
آنود ال ای دی رو به پین 36 (GPIO16) وصل می کنیم و با یک مقاومت 220 اهمی سری کرده و سر دوم مقاومت را به یکی از پایه های زمین رزبری پای وصل  می کنیم.
با رعایت حروف بزرگ و کوچک و فاصله ها، کد های زیر رو به ترتیب در پایتون وارد کنید ( بعد از هر خط اینتر بزنید )

کد بالا، کتابخونه مربوط به GPIO رو فراخوانی میکنه ( یه چیزی مثل <include<mega32 تو کد ویژن میمونه )

این یکی مانع وقوع خطا هنگام تنظیم دوباره پایه می شود

کد بالا، مد کاری رو مشخص میکنه.(مد BOARD)

کد بالا، پایه 36 رو به عنوان خروجی تنظیم میکنه.(عملی مشابه دستور DDRA در کد ویژن)
دو قطعه کدی که در زیر میاریم، کار دو خط بالا رو انجام میده.(این بار در مد BCM )

توجه : برای تغییر مد باید پایتون رو ریست کرد.(با فشردن کلید ترکیبی Ctrl+F6)
در ادامه فرض بر این است که مد کاری روی BCM تنظیم شده است.
حالا برای 0 و 1 کردن پایه مورد نظر،از دستور زیر استفاده می کنیم:(ابتدا یک کردن پایه)

دو دستور زیر،هم عملکرد مشابه دستور قبلی دارند:

برای صفر کردن پایه هم از یکی از سه دستور زیر می توان استفاده کرد:

توجه : سطح ولتاژ منطق 1، برابر 3.3 ولت است.
برای اینکه کدهایی که می نویسیم ، دوباره قابل اجرا باشند، پایتون رو ببنید و ترمینال رو باز کنید.در محیط ترمینال،با تایپ کد زیر،یک فایل با پسوند قابل اجرا توسط پایتون باز می شود:

آموزش پایتون در رزبری پای
از این بعد،برنامه های خودمون رو تو این محیط می نویسیم.
می خواهیم برنامه ای بنویسیم که یک ال ای دی که به پایه شماره 36 متصل است رو به مدت 3 ثانیه روشن کرده،سپس دوباره خاموش کنیم:(پایه 36 در مد BCM 16 نام گذاری شده است.)

خط دوم، از کتابخانه time ، تابع sleep  رو به برنامه اضافه می کنه.(مشابه <include <delay.h در کد ویژن) تابع sleep پارامترش رو بر حسب ثانیه میگیره و عدد اعشاری هم قبول می کنه.
بعد از نوشتن کد، کلید های ترکیبی Ctrl+x رو فشار دهید، سپس کلید y رو فشار بدید. بعدش اینتر بزنید تا به صفحه اصلی ترمینال برگردید. بعدش کد زیر رو تایپ و اینتر کنید:

قطعه کدی که نوشتید، اجرا شد.
حالا اگه بخوایم برنامه دائما اجرا بشه، و ال ای دی 3 ثانیه روشن بماند و 1 ثانیه هم خاموش بماند و این روند ادامه داشته باشد در ترمینال تایپ کنید :

و مطابق تصویر زیر دو خط به برنامه اضافه کنید :
یکی

و دیگری

برنامه نویسی رزبری پای
بعدش مثل دفعه قبل، Ctrl+x و بعدش y و سپس اینتر و اجرای برنامه با وارد کردن کد زیر در ترمینال(از این به بعد،نمیگم که اینتر هم می خواد. بدونید که بعد از تایپ هر دستور در ترمینال، باید اینتر بزنید.)

برنامه شروع به کار می کنه و تا زمانی که کلید های ترکیبی Ctrl+z رو نزدید،به کارش ادامه میده.
توجه : در پایتون، بعد از دستورات شرطی، تعدادی از برنامه های زیر شرط اجرا می شوند که از یک ستون شروع می شوند. برای مثال اگر خط آخر ( (sleep(1 ) رو به اول سطر ببریم، دیگه جزو عملیات شرط نخواهد بود و اجرا نمیشه. و ال ای دی همواره روشن دیده می شه. و پایان while جایی هست که به اول سطر برگردیم.
برنامه نویسی رزبری پای
برای تنظیمات چند پین به صورت هم زمان فقط یه مثال میزنم:
پروژه gpio رزبری پای
برای مثال،می خواهیم سه پایه GPIO16  و GPIO20 و GPIO21 رو به صورت همزمان تغییر بدیم.
 

این کد، ابتدا پایه های GPIO16  و GPIO20 و GPIO21 رو به عنوان خروجی تنظیم میکنه. بعدش مقدار 1 رو به هر سه تاشون میده و 3 ثانیه بعد،سه تاشون رو 0 می کنه.
اگر بخوایم به هر کدوم از پایه ها رو جداگانه مقدار بدیم،اینجوری می نویسیم:
 

این کد هم سه تا پایه رو به عنوان خروجی مقدار دهی می کنه و مقدار 1 رو به پایه GPIO16 و GPIO21 و مقدار 0 رو به GPIO20 میده و سه ثانیه بعد معکوسشون می کنه.
توجه : برای اینکه در استفاده های بعدی از خطاهای احتمالی جلوگیری شود،بهتر است در انتهای کد،از تابع زیر استفاده کنیم:

 
به امید خدا در مطلب بعدی، نحوه تنظیم PWM رو خواهیم داشت و راه اندازی سرو موتور SG90
جهت هر چه مستحکم تر شدن مقام ولایت فقیه و تعجیل درظهور بابای خوبمون مهدی(عج) صلوات

تعداد مطالب : 30 تا
دانش آموخته (فارغ التحصیل سابق) کارشناسی الکترونیک هستم. سه سال اول دانشگاه رو به نحو احسن هدر دادم رفت!! تا پایان ترم هفتم داشتم فکر می کردم که چی کار کنم و چی کار نکنم؟ ترم هشتم اساتید خوبی داشتم و تصمیم گرفتم،یه تکونی به خودم بدم. الان هم در حال یاد گیری علایقم هستم...
بقیه جلسات :
این مطلب هیچ طبقه بندی یی ندارد!
ارسال دیدگاه
17
نظرات این مطلب بسته شده است.
  1. وزیری

    مهمان

    وزیری

    سلام دوست عزیز. بنده میخام صفحه ای طراحی کنم که به ازای هر کلاینت یه دکمه وجود داشته باشه تو او نصفحه. به طور مثال 50 دکمه باشه. روی هر دکمه که مدیر سیستم کلیک کرد، بتونه میزان جریان سیال (flow) رو مشاهده کنه و همچنین امکان روشن، خاموش و ریست کردن اون کلاینت رو داشته باشه. اطلاعات از طریق پورت سریال UART وارد رزپری میشن. میشه راهنمایی کنی اگر تجربشو داشتین که با چه زبانی این کارو انجام بدم؟ با پایتون؟ و اینکه آیا پایتون فقط رو رسپبری نصب و اجرا میشه؟ یا تو ویندوزم میشه

    مشاهده پاسخ ها (1)
    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام.برای طراحی گرافیکی(دکمه و کلید و…) باید از qt یا مشابهش استفاده کنید(qt شبیه ویژوال استودیو هست)
      یه نرم افزار خیلی ساده هم برای کد نویسی هست(به نام scratch) که روی رزبری نصبه.ببینید کارتون رو انجام میده یا خیر؟

  2. moreza

    مهمان

    moreza

    سلام اکر بخواهیم برای ریست کردن یه میکرو از رزبری استفاده کنیم چه پابه ای به کار میاد

    مشاهده پاسخ ها (1)
    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام اگر منظورتون ریست کردن خود رزبریه
      تو لینک زیر یه آموزش گذاشته (البته بنده امتحان نکردم!!)
      دکمه ریست برای رزبری پای
      اما اگه منظورتون ریست کردن یه میکرو دیگه با رزبری هست،باید یکی از پایه های رزبری رو به پایه ریست میکرو وصل کنید .

  3. محمد

    مهمان

    محمد

    درود
    من برنامه شما رو با استفاده فایل سیستم و پایتون اجرا کردم البته با برد 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)

    مشاهده پاسخ ها (2)
    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      سلام
      خیلی ممنون .
      pin64 نسبت به سری رزبری پای چه مزایایی داره؟

      • محمد

        مهمان

        محمد

        درود
        Pine64 یه پردازنده 4 هسته ای 64 بیتی داره (a64 allwinner) که همانند رزبری پای ۳ از معماری cortex a53 استفاده میکنه و دارای خروجی مشابه رزبری پای 2 هست . از سیستم عامل های android و لینوکس هم پشتیبانی میکنه .
        به لحاظ قیمت بسیار ارزون تر هست نسبت به رزبری ولی به لحاظ منابع آموزشی و نرم افزارهای موجود قطعا رزبری حرف اول رو میزنه و من پیشنهاد میکنم واسه کسایی که میخوان با این سیستما کار کنن اول با رزبری شروع کنن به دلیل منابع آموزشی خوب .
        مشابه رزبری کتابخانه RPi_GPIO هم میشه روش نصب کرد (البته باید از گیت های دانلودش کنید) که مثل gpio های رزبری میشه به پایه ها تو مد bcm و board مقدار داد.

  4. آرین

    مهمان

    آرین

    زبان پایتون یه زبان سطح بالاه و به همین دلیل بیش از حد آبخوردن تشریف داره و به نظر شما زیاد جالب نیست مخصوصا نحوه حلقه گذاری و رعایت اصول در حلقه و تب ها نبود goto
    و در مورد برنامه نویسی با زبان های دیگه هم اگه کتاب خونش باشه چرا که نه ولی راحت ترین و روش اصلی همین پایتونه
    مطمئن باشید اگه پایتون زبان مسخره ای بود به طور پیش فرض در تمامی لینوکس ها قرار نمی گرفت
    باز ممنون از سایت خوبتون

    مشاهده پاسخ ها (1)
    • مهدی دمرچیلو

      مدیر سایت

      مهدی دمرچیلو

      نه کسی که با خونواده C کار کنه یه جورایی بهش وابسته میشه و نه این که بیشتر کار ما با زبون سی هستش تو الکترونیک یکم سخته بریم سمت پایتون – برا من حداقل این طوری هستش.

  5. farzad

    مهمان

    farzad

    سلام. بهتر نیست با c++ و کیوت برنامه ها رو نوشت.
    این قسمت هم برای مدیر سایت و دوستانی که c++ کار میکنن.
    اسم کتابخونه مربوط به gpio
    wiringPi هستش. که راحت روی کیوت نصب میشه.

    مشاهده پاسخ ها (2)
    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      تا حالا کار نکردم .

      • محمدرضا اسلامی

        نویسنده این مطلب

        محمدرضا اسلامی

        البته الان دیگه کار کردم!!!

  6. keivanjan

    مهمان

    keivanjan

    خیلی عالی بود- منتظر قسمت pwm هستیم

  7. مهدی دمرچیلو

    مدیر سایت

    مهدی دمرچیلو

    آقا ممنون ولی
    1) کاش شماتیک پروژه رو هم میزاشتی.
    2) این پایتون که مثل برنامه نویسی مطلب هستش، به شخصه از پایتون در نگاه اول خوشم نیومد.
    نمیشه به زبون c برنامه نوشت؟ خیلی دوست دارم تو رزبری پای از qt و c استفاده کنم.

    مشاهده پاسخ ها (3)
    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      با سلام
      1_یه چیزی شبیه شماتیک برای قسمت اول گذاشتم.برای قسمت دوم هم می خواستم بذارم.گفتم الکی مطلب شلوغ میشه.
      2_شدن که میشه ولی تا حالا با رسپری قسمت نشده برم سمت C از خداوند می خوام راه C رو به سمت بنده کج بفرماید ما که حالشو نداریم بریم سمت C

    • محمدرضا اسلامی

      نویسنده این مطلب

      محمدرضا اسلامی

      یه سوال:
      چجوری می تونم شماتیکی مثل شکل زیر برای رسپری بسازم؟
      https://dmf313.ir/wp-content/uploads/VIEW24.png

      • مهدی دمرچیلو

        مدیر سایت

        مهدی دمرچیلو

        به کمک نرم افزار Fritzing که برا رزبری هم فک کنم جواب بده