کنترل پایههای رزبریپای از طریق مرورگر وب
رزبریپای یک کامپیوتر مینیاتوری فوقالعادهست که دستت رو برای اجرای پروژههای خفن باز میذاره. یکی از قابلیتهای جذاب این برد، کنترل پینهای ورودی و خروجی یا همون GPIO از طریق شبکهست. تصور کن بتونی وسایل الکترونیکی اتاقت رو مستقیما از روی صفحه مرورگر لپتاپ یا گوشیت کنترل کنی؛ بدون اینکه نیازی به نوشتن اپلیکیشنهای پیچیده برای سیستمعاملهای مختلف داشته باشی.
توی این پروژه از آیسیمدار، میخوایم یک رابط کاربری تحت وب ساده و در عین حال کاربردی برای رزبریپای بسازیم. با ترکیب چند تا الایدی، یک سرور لوکال (Apache) و کمی کدنویسی PHP و وب، بهت یاد میدیم چطور یک داشبورد کنترلی بسازی. این داشبورد بهت اجازه میده با کلیک روی دکمههای گرافیکی، پایههای رزبریپای رو روشن و خاموش کنی.
خوبی این روش اینه که کدهای وب روی هر دستگاهی که مرورگر داشته باشه اجرا میشن و نیازی به نصب هیچ نرمافزار اضافهای نداری. ابزارها و قطعات رو آماده کن تا بریم سراغ ساخت این سرور کنترلی جذاب!
راهاندازی مدار الکترونیکی و اتصال الایدیها
اول باید مدار سختافزاری رو روی بردبورد ببندیم. بخش الکترونیکی این پروژه خیلی سادست و فقط از 8 تا الایدی همراه با مقاومتهای محافظشون تشکیل شده. تنها چالش کار، اتصال درست این الایدیها به پینهای مناسب روی برد رزبریپایه.
چون قراره از کتابخونهای به اسم WiringPi استفاده کنیم، شمارهگذاری پینها با اونی که روی خود برد رزبریپای میبینی کمی فرق داره.
ما از پینهای 0 تا 7 تو استاندارد WiringPi استفاده میکنیم. دقت کن که مدلهای مختلف رزبریپای ممکنه چیدمان پین متفاوتی داشته باشن، پس حتما تطابق پایهها رو بررسی کن.
برای مقاومتها میتونی از مقدار 270 اهم استفاده کنی. اگه این مقدار رو نداشتی، مقاومتهای 560 اهم هم کار رو راه میندازن، فقط نور الایدیها یکم کمتر میشه.
شماتیکهای مدار بهت کمک میکنن تا پایههای فیزیکی روی برد رو با شمارهگذاری کتابخونه تطبیق بدی و سیمکشیها رو بدون اشتباه انجام بدی. تو یکی از تصاویر، پینهای فیزیکی برد و تو تصویر دیگه شمارههای معادلشون توی WiringPi کاملا مشخص شده.
نصب و کار با کتابخونه WiringPi روی رزبریپای
حالا نوبت بخش نرمافزاریه. کتابخونه WiringPi کار با پینهای GPIO رو به شدت راحت میکنه. به جای درگیری با کدهای طولانی و پیچیده، با یک دستور ساده میتونی پایهها رو کنترل کنی. این یعنی میتونی ازش توی کدهای زبان C هم به راحتی استفاده کنی.
البته ما اینجا برنامه C نمینویسیم؛ به جاش از ابزار Gpio که همراه این کتابخونه نصب میشه استفاده میکنیم. این ابزار اجازه میده پینها رو مستقیم از طریق خط فرمان (ترمینال) یا اسکریپتهای Bash مدیریت کنی. برای نصب این ابزار، کافیه نسخه اون رو از مخازن گیت دانلود کنی و با دستور build نصبش رو انجام بدی.
بعد از نصب، دستور gpio mode 0 out رو تو ترمینال بزن. اگه خطایی ندیدی، یعنی همهچیز عالی پیش رفته. این دستور پین شماره صفر رو به عنوان خروجی تعریف میکنه.
اگه سیستم پیغام خطایی مثل command not found داد، یعنی فرآیند نصب کتابخونه کامل نشده و باید دوباره بررسیش کنی. حالا بیایم پین شماره 0 رو روشن و خاموش کنیم. همونطور که گفتیم با gpio mode 0 out پین صفر رو خروجی کردیم. کلمه out به معنی خروجیه.
برای روشن کردن الایدی متصل به این پین، کافیه دستور gpio write 0 1 رو تایپ کنی. عدد یک برای روشن شدن و عدد صفر برای خاموش شدنه. اگه سیمکشی درست باشه، الایدی روشن میشه.
برای خاموش کردنش از gpio write 0 0 استفاده کن. یک نکته جالب: اگه میخوای به جای شمارههای WiringPi از شماره واقعی پایهها روی برد (مثلا GPIO-17) استفاده کنی، باید سوییچ -g رو تو دستورت بیاری؛ یعنی به جای قبلی بنویسی: gpio -g write 17 1.
یک دستور کاربردی دیگه هم به اسم gpio read وجود داره که وضعیت فعلی یک پین رو میخونه. این دستور برای وقتهایی که الایدی جلوی چشمت نیست و میخوای از روشن یا خاموش بودنش مطمئن بشی به کار میاد. برای استفاده ازش بنویس gpio read 0.
این دستور خروجی 1 (روشن) یا 0 (خاموش) رو بهت برمیگردونه. ابزار Gpio قابلیتهای خیلی بیشتری هم داره، اما ما برای این پروژه فقط به همین چند تا دستور نیاز داریم. حالا که با این دستورات آشنا شدی، میتونی کمی باهاشون تمرین کنی.
اگه از طریق SSH (با برنامههایی مثل Putty روی ویندوز یا کلاینتهای موبایل) به رزبریپای وصل شدی، میتونی حسابی با اسکریپتنویسی سرگرم بشی. مثلا میتونی یک اسکریپت ساده Bash بنویسی که الایدیهای 0 تا 7 رو روشن کنه، 2 ثانیه صبر کنه و بعد همهشون رو خاموش کنه. برای این کار از حلقههای for تو محیط ترمینال استفاده میشه و دستور sleep 2 هم وقفه دو ثانیهای رو ایجاد میکنه.
نصب وبسرور آپاچی و انتقال فایلهای سایت
بریم سراغ ساخت رابط کاربری! کنترل کردن الایدیها از طریق ترمینال و با زدن دستورات متنی شاید جالب باشه، اما اصلا کاربرپسند نیست. از طرفی تایپ کردن مداوم دستورات خیلی زود خستهکننده میشه.
نوشتن یک اپلیکیشن مجزا برای اندروید، ویندوز یا آیاواس هم حسابی وقتگیره و نیاز به یادگیری چندین زبان مختلف داره که برای این پروژه کوچیک اصلا منطقی نیست.
بهترین راهحل، ساخت یک صفحه وب سادهست که روی همه دستگاهها کار میکنه و فقط به کمی دانش HTML برای اسکلتبندی، CSS برای زیباسازی، PHP برای ارتباط با سرور و جاوااسکریپت برای تعامل با کاربر نیاز داره. پس اول باید یک وبسرور روی رزبریپای نصب کنیم.
ما به دیتابیس نیاز نداریم، فقط یک سرور HTTP و اکستنشن PHP کافیه. اول با دستور sudo apt-get update مخازن رو بهروزرسانی کن و بعد با دستور sudo apt-get install apache2 php5 libapache2-mod-php5 سرور آپاچی و PHP رو نصب کن. حالا آیپی رزبریپای رو تو مرورگر کامپیوترت بزن. باید صفحه پیشفرض آپاچی با پیام It works! رو ببینی. اگه این صفحه نیومد، آیپی رو چک کن یا یک بار دستگاه رو ریبوت کن.
دیدن این صفحه یعنی سرور آپاچی کار میکنه، اما هنوز نمیدونیم PHP هم سالمه یا نه. برای تست PHP، با دستور cd /var/www/ به پوشه اصلی سرور برو. اگه دستور ls رو بزنی، میبینی که فقط یک فایل index.html اونجا وجود داره که همون صفحه پیشفرض آپاچیه.
این فایل رو با دستور sudo rm index.html پاک کن و با دستور sudo nano index.php یک فایل جدید بساز و کدهای تستی اطلاعات PHP (تابع phpinfo) رو داخلش بنویس.
فایل رو با Ctrl+O ذخیره کن و با Ctrl+X از ویرایشگر nano خارج شو. حالا اگه صفحه مرورگر رو رفرش کنی، باید یک جدول طولانی از اطلاعات سرور و PHP ببینی. اگه ندیدی یعنی PHP درست کانفیگ نشده.
اگه همهچیز درست بود، یعنی یک سرور کامل و آماده کار داری. اما کار با ویرایشگر nano برای کدنویسی طولانی سخته. ما باید فایلهای رابط کاربری رو از کامپیوتر به رزبریپای منتقل کنیم. میتونی از نرمافزارهای SFTP مثل WinSCP استفاده کنی.
این کلاینتها بدون نیاز به نصب FTP سرور مجزا، فایلها رو خیلی راحت بین دو تا سیستم جابهجا میکنن. اما اگه همین الان سعی کنی فایلی رو کپی کنی، با خطای Access Refused (عدم دسترسی) مواجه میشی.
دلیلش اینه که کاربر pi (که تو باهاش لاگین هستی) مالک پوشه www نیست. اگه از دستور ls -l /var/www استفاده کنی میبینی که فقط کاربر root به این پوشه دسترسی نوشتن داره.
برای رفع این مشکل، باید با دستور sudo chown -R pi /var/www مالکیت پوشه و تمام فایلهای داخلش رو به کاربر pi تغییر بدی (سوییچ -R یعنی این تغییر روی محتویات داخل پوشه هم اعمال بشه). حالا سرور وب کاملا آمادهست تا فایلهای وبسایتت رو میزبانی کنه. نکته: تو نسخههای جدیدتر، پوشه پیشفرض آپاچی به var/www/html/ تغییر کرده، پس دستورات قبلی رو با این مسیر جدید تطبیق بده.
کنترل قطعات سختافزاری با استفاده از کدهای PHP
الان هم یک وبسرور داریم و هم کتابخونهای برای کنترل پینها؛ وقتشه این دو تا رو به هم پیوند بدیم. زبان PHP یک زبان سمت سروره؛ یعنی کدهای اون روی سرور اجرا میشن و کاربر نهایی کدهای خام رو نمیبینه، بلکه فقط نتیجه (مثل یک صفحه HTML) بهش نمایش داده میشه.
ما از PHP استفاده میکنیم چون تو دنیای وب به شدت محبوبه. البته زبانهای دیگهای مثل پایتون، روبی یا پرل هم هستن که کارهای مشابه رو انجام میدن، اما ما اینجا روی PHP تمرکز میکنیم.
برای اجرای دستورات ترمینال (مثل همون دستورات Gpio) از داخل PHP، دو تا تابع خیلی مهم وجود داره: system و exec. اول از تابع system شروع میکنیم. این تابع دستور خط فرمان رو میگیره و اجرا میکنه.
تابع system زمانی استفاده میشه که فقط میخوای یک دستور اجرا بشه و نیازی به خوندن خروجی متنی اون تو صفحه وب نداری؛ دقیقا مثل همون دستورات روشن و خاموش کردن الایدی (gpio write). مثبت: اما تابع exec خروجی دستوری که تو ترمینال اجرا میشه رو میگیره و تو یک متغیر یا آرایه ذخیره میکنه.
این تابع برای خوندن وضعیت پینها عالیه. وقتی از دستور gpio read استفاده میکنی، تابع exec عدد 0 یا 1 رو میگیره تا بتونی تو برنامهت ازش استفاده کنی و بفهمی پین روشنه یا خاموش.
با همین دو تا تابع ساده، قدرت این رو پیدا میکنی که تمام امکانات رزبریپای رو مستقیما از داخل کدهای PHP صدا بزنی. مثلا میتونی یک اسکریپت PHP بنویسی که با یک حلقه for، پینهای 0 تا 7 رو یکییکی روشن کنه، دو ثانیه صبر کنه و بعد خاموششون کنه.
طراحی گرافیکی رابط کاربری وب
حالا که کنترل پینها با PHP انجام میشه، باید یک ظاهر گرافیکی و دکمههای تعاملی براش بسازیم. رابط کاربری ما خیلی سادست و از چند تا عکس دکمه خاموش و روشن که تو اینترنت پیدا میشن ساخته شده.
من دکمههای سبز و قرمز رو انتخاب کردم و روی هر کدوم شماره الایدی مربوطه رو نوشتم. ایده اینه که وقتی روی دکمه کلیک میکنی، الایدی متصل به اون پین روشن بشه و عکس دکمه روی صفحه وب هم به حالت سبز (روشن) تغییر کنه.
بدنه اصلی صفحه با HTML ساخته میشه، ظاهرش با CSS و منطق کلیکها با جاوااسکریپت هندل میشه. از اونجایی که جاوااسکریپت روی مرورگر کاربر اجرا میشه، سرعت بالایی داره و میتونه تغییرات ظاهری رو بدون اینکه کل صفحه دوباره لود بشه اعمال کنه.
استفاده از CSS هم برای یکدست کردن پسزمینه (مثلا تیره کردنش) و چیدمان منظم دکمهها در کنار هم ضروریه تا ظاهری شبیه به یک داشبورد واقعی پیدا کنه.
فایل اصلی ما index.php هست. وقتی این صفحه باز میشه، با یک حلقه و تابع exec، دستور gpio read برای هر 8 تا پین ارسال میشه تا سیستم ببینه کدوم الایدیها روشن و کدوما خاموش هستن و دکمه مناسب رو همون اول به کاربر نشون بده. بخش جذاب ماجرا تو فایل script.js اتفاق میافته. این فایل جاوااسکریپت دائما منتظره تا کاربر روی دکمهها کلیک کنه.
به محض اینکه روی یکی از 8 تا دکمه کلیک کنی، جاوااسکریپت به صورت پسزمینه (آژاکس) یک درخواست به یک فایل واسط به اسم gpio.php میفرسته و میگه وضعیت این پین رو عوض کن! بعد بر اساس جوابی که میگیره، عکس دکمه رو به قرمز یا سبز تغییر میده.
فایل gpio.php رابط اصلی بین دکمههای کاربر و سختافزاره. نکته مهمی که همیشه تو برنامهنویسی وب باید رعایت کنی اینه که: "هیچوقت به ورودی کاربر اعتماد نکن!". ممکنه یک نفر بخواد به جای شماره پین، کدهای مخرب به سرور بفرسته.
به همین خاطر تو فایل gpio.php چند تا شرط امنیتی گذاشتیم تا مطمئن بشیم مقداری که کاربر فرستاده حتما یک عدد معتبر بین 0 تا 7 هست. دیاگرامی که ضمیمه شده، چرخه این ارتباط رو به زبان ساده نشون میده.
جمعبندی پروژه و ایدههایی برای توسعه
روشن و خاموش کردن چند تا الایدی با رابط وب شاید تو نگاه اول یک پروژه ساده به نظر برسه، اما در واقع پایه و اساس ساخت خانههای هوشمنده! این پروژه بیشتر شبیه یک ابزار آموزشیه تا بتونی مفاهیم رو درک کنی.
حالا فرض کن به جای الایدی، بردهای رله رو به رزبریپای وصل کنی. به راحتی میتونی لامپهای اتاقت، ریسههای نوری یا لوازم برقی کوچیک رو کنترل کنی. ماژولهای رله مخصوص رزبریپای با قیمت خیلی مناسبی تو بازار پیدا میشن.
اگه به الکترونیک مسلطی و از کار با برق شهری نمیترسی، میتونی درب گاراژ، سیستم گرمایشی، پمپ آب یا حتی دستگاه قهوهساز رو دقیقا با همون صفحه وب و از طریق گوشیت کنترل کنی. تنها محدودیت، تخیل و خلاقیت خودته! میتونی با استفاده از شیفترجیسترها تعداد خروجیها رو به شدت افزایش بدی.
علاوه بر این، قابلیتهای PHP و رزبریپای فقط به روشن و خاموش کردن پینها ختم نمیشه. میتونی از طریق پروتکلهای سریال (UART) با دستگاههای دیگه ارتباط بگیری یا از سیگنالهای PWM برای کنترل زاویه سروو موتورها استفاده کنی.
هدف اصلی آموزش این پروژه تو آیسیمدار این بود که فقط یک سری کد رو کپی نکنی، بلکه دقیقا بفهمی پشت پرده ارتباط بین وبسرور و پایههای سختافزاری چی میگذره و چرا باید از روشهای خاصی استفاده کرد. یادگیری زمانی اتفاق میافته که درک کنی هر ابزار چه وظیفهای داره و چطور تو سیستم کلی نقش ایفا میکنه.
اگه این داشبورد کنترلی رو ساختی یا ایده جالبی برای هوشمندسازی وسایل اتاقت داری، حتما توی بخش نظرات برامون بنویس تا با هم در موردش گپ بزنیم و ایده بگیریم!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!