اطلاعیه

Collapse
No announcement yet.

آموزش کار با درگاه های رسپبری پای

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    آموزش کار با درگاه های رسپبری پای

    به نام خدا
    با سلام
    قبل از مشاهده تاپیک حتما خوانده شود
    با توجه به بحث های انجمن به نظرم اومد جای یک منبع فارسی جامع و شامل در مورد این بورد کم هست، بنابراین گفتم این تاپیک رو ایجاد کنم.
    ضمن اینکه خودم تجربه محدودی در کار با این برد رو دارم و می خوام که یادگیری بیشتری داشته باشم، و چون هنگام بازگو کردن مطلب برای دیگران، به نکاتی توجه میکنم که در حالت عادی نمیکنم، پس این هم دلیل دیگه ای برای این مطلب میشه.

    پیش نیازها:
    ----->آشنایی اولیه با برد رسپبری پای نظیر نصب سیستم عامل و ...
    ----->آشنایی اولیه با اصول مدارات الکترونیکی
    ----->آشنایی با زبان c(زبان های دیگه هم استفاده میشن، اما سعی میشه اول ورژن c بحث بشه)
    ----->آشنایی اولیه با سیتم عامل لینوکس

    چند تا نکته:
    ----->من خودم در حال یادگیری هستم، و اطلاعاتم در خیلی موارد ناقص، درسته که تلاش می کنم تا مورد درست رو انتقال بدم، اما امکان اشتباه در ارائه مفهوم ها وجود داره، علائه بر اینکه از اساتید درخواست تصحیح دارم، اینم بگم که مسئولیتی در قبال وجود اشتباه در آموزش ها رو تقبل نمیکنم.
    ----->آموزش ها بر اساس برد قدیمی تر یعنی مدل B+ هست، دوستانی که از ورژن های دیگه استفاده می کنند، خودشون باید حواسشون به تطبیق های لازم باشه.
    ----->کد ها و موارد مطرح شده روی برد تست میشن و سپس قرار داده میشن، مسئولیتی در قبال هرگونه صدمه به برد شما در حین اجرای کدها تقبل نمی شود.
    ----->چون موارد تحت پوشش زیاد و حجم هم بالاست، سوالات خودتون رو در تاپیک های دیگه بپرسین، مخصوصا تاپیک مربوط به برد رسپببری پای
    ----->برای یادگیری بهتر و فراگیر تر استفاده از مطالب انگلیسی رو توصیه میکنم.
    ----->استفاده از تاپیک به معنای قبول شرایط بالاست(به خصوص گاهی از بندهای اول)، مسئولیتی در قبال استفاده بدون مطالعه شرایط، تقبل نمیشود.
    ----->امیدوارم موارد آموزشی مفید باشه.
    The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

    #2
    پاسخ : آموزش کار با درگاه های رسپبری پای

    خب، چند بخش اول آموزش رو به gpio اختصاص میدیم، و راه های متفاوت کار با اون. دوستانی که با برد کار کردن احتمالا از کتابخانه پایتون(RPi.GPIO) خودش استفاده کردن، خب این یک راه سریع برای راه اندازی و کار با gpio هست که سراغش هم میریم اما الان میخوایم یک مقدار سطح پایین تر کار کنیم و سعی کنیم با ابزار موجود در سیستم عامل، سخت افزار رو کنترل کنیم،در حقیقتهدف این بخش از آموزش اینه که بتونیم با زبان c کتابخانه خودمون رو برای gpio بنویسیم

    اول یک توضیح کوچولو انحرافی:
    برای اینکه بشه از طریق سیستم عامل سخت افزار رو کنترل کرد، نیاز به درایور هست، پس یک راه برای کار با gpio اینه که بریم درایور بنویسیم، میشه اما کار پیچیده ای هست و ما هم نمی خوایم حداقل فعلا بهش بپردازیم، و نیازی هم نیست این کا رو بکنیم ، فقط بدونیم که درایور ها در کرنل(kernel) سیستم عامل اجرا میشن، که ما بهش میگیم فضای کرنل، سیستم عامل لینوکس میاد برای ما که در فضای کاربر(user space) قرار داریم، رابط کاربری میذاره تا بتونیم با فضای کرنل تعامل کنیم، چند راه برای این مسئله هست، اما من تو این اموزش از روش sysfs استفاده می کنم، که با یه سرچ کوچولو دیدم که از قبلی هاش خیلی بهتر هست و یک سری مشکلات اونا رو نداره،
    اینم بگم که تو لینوکس همه چی به چشم یک فایل دیده میشه

    خب، با این توضیحات بریم سراغ کار،
    ترمینال رو باز کنین و سطح دسترسی رو به super user ارتقا بدین(من از رسپین استفاده می کنم)
    کد:
    sudo su
    حالا برین به پوشه /sys/class/gpio
    کد:
    cd /sys/class/gpio
    اگر ls بگیرین باید فایلی به اسم export موجود باشه، ما با این کار داریم
    ما با نوشتم تو این فایل می تونیم gpio مورد نظر رو فعال کنیم، مثلا
    کد:
    echo 4 > export
    ما gpio شماره 4 رو فعال کردیم، حالا ls بگیرین، باید پوشه ای به اسم gpio4 ساخته شده باشه
    برین توش
    کد:
    cd gpio4
    بازم ls بگیرین چند تا فایل هست، direction و value اونایی هست که برای ما مهم هستند،
    برای تعیین جهت in و یا out رو در direction بنویسید
    با خواندن از و یا نوشتن در value مقدار gpio رو خوانده و یا بنویسید.
    مثلا می خوایم یک led رو روی gpio4 روشن کنیم
    کد:
    echo out > direction
    echo 1 > value
    حالا خاموشش می کنیم
    کد:
    echo 0 > value
    حالا اگه کارمون تمومه بهتره، gpio رو خلاص کنیم بره پی کارش
    کد:
    cd ..
    echo 4 > unexport
    خب فعلا اینو امتحان کنید تا بگم بعدش، چطور با استفاده از c کتابخانه خودتون رو بنویسید، البته اگه کار با فایل بلدین فکر کنم خودتون تا تهشو برین.
    The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

    دیدگاه


      #3
      پاسخ : آموزش کار با درگاه های رسپبری پای

      با سلام مجدد
      خب می خوایم با استفاده از یک زبان برنامه نویسی کار بالا رو انجام بدیم، الان می خوایم با c کار کنیم اما استراتژی به هر زبانی قابل تعمیم هست
      اگه پست قبلی رو خونده باشین، میبینین که تمام اتفاقات داره با نوشتن و خوندن از چند تا فایل صورت میگیره، قبلا هم گفتیم که همه چی تو لینوکس به چشم فایل نگاه میشه، پس اگه ما کار با فایل رو باد باشیم میتونیم همه کار های بالا رو اتوماتیک وار انجام بدیم
      چند تا تابع مینویسیم، یکی برای تعیین جهت، یکی برای ست کردن مقدار خروجی، یکی برای خوندن ورودی و دیگری برای ازاد کردن پورت
      سیستم کار یکی رو توضیح میدم بقیه به همین سبک نوشته میشن از روی هم و شبیه هم هستن
      اول یه هندلر فایل میسازیم
      کد:
      FILE *sysfs_handle = NULL;
      بعد فایل مورد نظر رو باز میکنیم، ترتیب باید مثل ترتیب بالا باشه، مثلا برای گرفتن پورت باید اول export رو باز کنیم، بعد از نوشتن باید فایل رو ببندیم و تا ذخیره بشه
      کد:
      if ((sysfs_handle = fopen("/sys/class/gpio/export", "w")) != NULL)
      {
         fwrite("4", sizeof(char), 2, sysfs_handle);
         fclose(sysfs_handle);
      }
      بد نیست اگه برای هر مرحله یک ارور هم بذاریم تا ببینیم مشکل احتمالی از کجاست،
      یک نکته مهم تو ارگومان سوم fwrite اینکه باید تو شمارش اون null اخر رشته رو هم حساب کنید.
      توضیح زیادی ندارم بدم، هر چی بگم یاد دادن c هست که قرار شد بلد باشین دیگه :biggrin:، اگه بلدین که عالی اگه نه توابع بالا رو سرچ کنید و ببینید کار باهاشون چطور هست
      یک برنامه تست هم نوشتم که با اون میشه پورت رو گرفت، خوند، مقدار داد و ازاد کرد، تابع main رو به دلخواه تغییر بدین و نتیجه رو ببینین. به نظر خودم فهمش سادست و نیاز به توضیح نداره.
      https://github.com/hessam2013/rpi-gp...ter/gpio_dir.c

      تا بعد.
      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

      دیدگاه


        #4
        پاسخ : آموزش کار با درگاه های رسپبری پای

        سلام دوباره،در این بخش می خوایم کار با پورت سریال رو داشته باشیم
        تو رسپبری، بصورت پیش فرض پورت سریال به عنوان یه ورودی خروجی پیش فرض برای سیستم تعریف شده و میشه مثلا باهاش تو سیستم لاگین کرد.
        برای این که ما بتونیم ازش تو برنامه خودمون استفاده کنیم، باید از این حالت پیش فرض درش بیاریم
        سطح دسترسی رو ارتقا بدین و برین به پوشه زیر
        کد:
        cd /etc
        فایل inittab رو باز کنین،باید در انتهای کدی شبیه کد زیر ببینید، با گذاشتن یک # در اول خط کامنتش کنین
        کد:
        T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
        با این کار دیگه نمیشه از این پورت لاگین کرد و پورت سریال اماده و ازاد هست تا ما ازش استفاده کنیم
        اما یک نکته اختیاری هم هست، رسپبری وقتی بالا میاد اطلاعاتی رو موقع boot رو پورت سریال میریزه، اگه قطعش نکنیم دستگاهی که با پورت سریال به برد وصله اون اطلاعات رو میبینه، اگه مشکلی نیست با این مسئله، می تونید از این مرحله رد شین.
        برای از کار انداختن این قابلیت
        فایل زیر رو باز کنین /boot/cmdline.txt
        محتوایی به شکل زیر داره
        کد:
        dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
        هر عبارتی که توش ttyAMA0 هست رو حذف کنید، میشه یه چیزی مثل
        کد:
        dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
        حالا یه ریبوت انجام بدین
        حالا یک برنامه می خوایم که با پورت سریال کار کنه، برنامه minicom هست، نصبش کنین
        کد:
        sudo apt-get install minicom
        وقتی نصب شد با دستور زیر بالا میاد
        کد:
        minicom -b 9600 -o -D /dev/ttyAMA0
        نکته
        پین های برد رسپبری توان تحمل ولتاژ 5 رو ندارند، پس اگه با دستگاه 5 ولت ارتباط میدینش، سر tx دستگاه 5 ولت تقسیم مقاومتی مناسب فراموش نشه
        امیدوارم مفید بوده باشه، تا بعد که برنامه نویسی پورت سریال رو کار کنیم
        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

        دیدگاه


          #5
          پاسخ : آموزش کار با درگاه های رسپبری پای

          خب، بعد ازمدتی غیبت که وقت نمی کردم پست بذارم، اموزش برنامه نویسی پورت سریال رو داریم
          برای برنامه نویسی پورت سریال ما از مفهومی به نام POSIX استفاده می کنیم
          سوال اول که پیش میاد اینه، POISX چیست؟
          در جواب باید بگم خیلی ساده ( تا اونجا که من فهمیدم ) مجموعه ای از قوانین و استاندارد ها هست که توسط IEEE وضع شده، تا برنامه نویسی برای سیستم عامل های تحت unix به صورت متحد و یکپارچه باشه، البته هر سیستم عامل دیگه ای هم میتونه POSIX رو پیاده کنه، به عبارت دیگه مجموعه ای از API ها هست که استاندارد شده و در سیستم عامل های تحت unix وجود داره تا برنامه های به شکل متحد نوشته شن،
          بدون شک اگه گوگل کنین اطلاعات بیشتری خواهید داشت.
          روش های متفاوتی برای کار با پورت سریال هست، اما من این روش none blocking رو ترجیح میدم، اصول یکیه، فقط بدونید میشه روش های دیگه ای هم داشت
          خب برای اموزش پیشنهاد من اینه، فایل پیوست رو جلوتون باز کنید و خط به خط باهم بریم جلو
          اصول کار برنامه اینه که هر وقت جمله ای که به اینتر ختم شه، به پورت سریال ارسال شه، یک سیگنال ( مثل اینتراپت) ست میشه و تابع مربوطه بهش صدا میشه و ما توی اون تابع یک فلگ که خودمون تعریف کردیم رو ست می کنیم و بنا به مقدارش تو حلقه اصلی برنامه کارایی انجام میدیم
          اول از include ها شروع کنیم
          termios.h : این فایل حامل تعریف هایی است که توسط ترمینال های ورودی خروجی استفاده میشه
          stdio.h : معرف حضور هست، همه ما از printf استفاده کردیم.
          unistd.h : تعاریف پر کاربرد رو تو خودش داره
          fcntl.h : شامل تعریفی برای کار با فایل ها
          sys/signal.h : برای استفاده از سیگنال اضافه کردیم
          sys/type.h : تعاریف نوع متغیر ها
          stdlib.h : تابع exit رو لازم داریم
          تو بخش define ها حواستون باشه باود ریت رو درست تنظیم کنید، و modemdevice رو به نام پورتی که می خواین باهاش کار کنید، ارجاع بدین
          خب بریم تو main،
          struct termios، استراکچری هست که تنظیمات پورت رو تو خودش داره، struct sigaction هم مربوط به استفاده از سیگنال هست،
          بعد از تعاریف اول فایل پورت رو باز میکنه، تو اموزش های قبلی توضیح دادیم که تو لینوکش همه چی فایله، به فلگ ها دقت کنید
          O_RDWR : فایل به عنوان ورودی و خروجی باز شود
          O_NOCTTY :میگه اگه فایل از نوع ترمینال بود، به عنوان کنترل کننده استفاده نشه، یعنی اینکه ورودی و خروجی هاش لینوکس رو کنترل نکنن، اگه نذاریم و مثلا نویز بیاد و نویز ctrl-c باشه برنامه بسته میشه
          O_NONBLOCK : بلاک نکنه و سریع برگرده به برنامه

          تو قسمت بعدی سیگنال رو راه اندازی کرده، فقط اون قسمت saio.sa_handler = signal_handler_IO; شاید مهم باشه، چرا که نام تابع سیگنال هندلر رو مشخص میکنیم.

          تابع fcntl میاد و دستوراتی رو روی فایل انجام میده،
          کد:
          fcntl(fd, F_SETOWN, getpid());
          این دستور میگه که سیگنال ناشی از این ترمینال ( فایل ) رو به کی بفرستم
          دستور دوم هم چک میکنه که مد non blocking باشه، و فلگ های مربوطه رو ست میکنه
          کد:
          tcgetattr(fd,&oldtio);
          شرایط فعلی پورت رو ذخیره میکنه
          بعد استراکچر newtio رو با تنظیمات دلخواهمون پر می کنیم و با دستور زیر تنظیمات رو اعمال می کنیم
          کد:
          tcsetattr(fd,TCSANOW,&newtio);
          خب، بقیه کار مشخصه یک وایل که شرطش برقراره، هر وقت که از پورت سریال جمله ای که اخرش اینتر باشه ارسال شه، سیگنال ارسال میشه، و تابع هندلر اجرا میشه، این تابع فلگ رو ست میکنه و این باعث میشه تا تو وایل تابع read اجرا شه، و جمله ورودی و تعداد کاراکتر های اون چاپ شه، اگه جمله برابر exit باشه هم از برنامه خارج میشیم،
          خب، در بالا نحوه راه اندازی و یک برنامه نمونه رو دیدیم، اموزش هنوز جای کار داره، تنظیمات یوزارت و سیگنال خیلی خوب پوشش داده نشده که ایشالا کاملش می کنیم، اما فعلا در همین حد می تونید راه اندازی کنید و برنامه نمونه خودتون رو بنویسید، یک استارتی هم هست تا گوگل کنید و موارد بیشتری رو یاد بگیرین، مثلا ارسال روی پورت سریال که البته حدش زدنش راحته که باید با تابع write انجام شه،
          فایل پیوست:
          http://hostcode.sourceforge.net/view/3048

          The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

          دیدگاه


            #6
            پاسخ : آموزش کار با درگاه های رسپبری پای

            دوست عزیز تو این پست آخر کجا تعریف شده که اگر رشته ورودی به Enter ختم شد اون flag ست بشه؟ یعنی منظورم اینه چرا کاراکتر Enter ؟

            دیدگاه


              #7
              پاسخ : آموزش کار با درگاه های رسپبری پای

              با سلام
              فکر می کردم بازدید نداره تاپیک
              شما وقتی کانونیکال مد میزاری که با فلگ زیر تو کد انجام شده، دیفالت یک خط کامل بافر میشه و بعد میاد تو روال برنامه خونده میشه، باید از این مد خارج کرد تا اینطور نباشه،
              کد زیر کانونیکال میکنه
              کد:
              newtio.c_lflag = ICANON;
              The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

              دیدگاه


                #8
                پاسخ : آموزش کار با درگاه های رسپبری پای

                سلام
                ممنون
                خب اگه بخوای دیتا رو بصورت Hex بفرستی (هر دیتای 8 بیتی میتونه تو رشته ارسالی باشه) نه بصورت Text اونوقت امکانش هست که کاراکترهای 0D 0A که همون کاراکتر Enter هستش تو رشته ی ارسالی باشه. اینطوری اشتباه بافر میشه که.

                کلا روش غیر NONBLOCK بهتر نیست به نظرتون؟ تو While دائم پورت رو بخونی اگه ابتدا و انتهای رشته ی دریافتی درست بود (حالا طبق پروتکلی که خودت در نظر گرفته ای) اونوقت اون رشته پردازش بشه. البته یه 40 30 میلی ثانیه ای تاخیر داره اگه NONBLOCK نباشه.

                دیدگاه


                  #9
                  پاسخ : آموزش کار با درگاه های رسپبری پای

                  ما هم نان بلاک کار کردیم، فرمایش شما متینه، اما هر کدوم به دردی می خورن، باید از مد کانونیکال خارج کرد تا اونی که شما میگی بشه، ،فلگ قبلی که گفتم رو نات کن،
                  The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                  دیدگاه


                    #10
                    پاسخ : آموزش کار با درگاه های رسپبری پای

                    نه منظورم NONBLOCK نبود. منظورم عکسش بود. یعنی روش Blocking رو گفتم که به نظرم بهتره.
                    خب اگه فلگ رو برداری اونوقت آخر داده ورودی رو چی درنظر میگیره که در صورت رسیدن ش کل داده ها رو بافر کنه؟
                    ببخشید میپرسم خودم خیلی حوصله خوندن کتاب های چند صد صفحه ای Unix Programming رو ندارم !

                    دیدگاه


                      #11
                      پاسخ : آموزش کار با درگاه های رسپبری پای

                      لازم نیست کتابو بخونین،توابع رو سرچ کنید توضیح کامل میاد براشون،الان بردم خرابه چک کنم، اما تو اون مد میشه تنظیم کرد کی برگرده، مثلا بایت به بایت
                      The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                      دیدگاه


                        #12
                        پاسخ : آموزش کار با درگاه های رسپبری پای

                        سلام ایا سیستم عامل اوبونتو روی رزپری پای فایل های ویدیویی فلش را نیز ساپورت میکنه؟؟؟من میخام با فرمان دادن به gpio یک فایل فلش ویدیویی مثل بازی های ساده فلش که از صفحه کلید ورودی میگیرند، رو اجرا کنم....در صورت امکان لطفا کمی توضیح بدین ممنون

                        دیدگاه


                          #13
                          پاسخ : آموزش کار با درگاه های رسپبری پای

                          سلام!
                          یه سوال
                          من یه برنامه مثل فلاشر ال ای دی طراحی کردم که چراغارو رسپبری خاموش روشن کنه اما مشکلم اینه که برق ورودی مدارم 12 ولت هست!
                          من چه طوری میتونم از رسپبری برق 12 ولت بکشم؟
                          مثلا میتونم یه برق اکسترنال به برد آزمایش بزنم ولی چه جوری رسبری رو سر راه قرارش بدم که به رسبری صدمه وارد نشه؟
                          ممنون
                          از این سایت بازدید کنید لطفا
                          اخبار فیلم و سریال و سلبریتی ها
                          http://celebritiha.com/

                          دیدگاه


                            #14
                            پاسخ : آموزش کار با درگاه های رسپبری پای

                            سلام
                            اموزش این کار تو انجمن هست، خیلی ساده، یه ترانزیستور میخواد، با میکرو 220 خاموش روشن میکنن، 12 که چیزی نیست، در مورد کنترل 220 با میکرو سرچ کن به جواب میرسی
                            The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                            دیدگاه


                              #15
                              پاسخ : آموزش کار با درگاه های رسپبری پای

                              شما می تونید از اپتوکوپلرها استفاده کنید.
                              مثل tlp521
                              واسه 220 ولت AC هم می تونید از سری MOC (MOC3041) استفاده کنید. همین اسمها رو یه سرچ بکنید همه چیز دستتون میاد

                              دیدگاه

                              لطفا صبر کنید...
                              X