نصب PHP روی رزبری پای خیلی آسونه. توی این مقاله آموزشی نشون میدیم که چجوری میشه یک اپلیکیشن PHP ساخت و با استفاده از اون LED رو کنترل کرد. تا آخر مقاله با من همراه باشین.
شروع نصب PHP بر روی رزبری پای
محبوبترین زبانهای برنامهنویسی رزبری پای Python و Scratch هستن. البته با کمی تلاش میتونین RPi رو آموزش بدین تا زبانهای دیگه از جمله PHP رو درک کنه.
به چند دلیل ممکنه بخواید PHP رو روی Raspberry Pi نصب کنین. برای مثال، اگه قبلاً یک اپلیکیشن PHP ساخته باشین و بخواین اونو در RPi ادغام کنین، منطقیه که کارتون رو با همون PHP ادامه بدین. شاید کدنویسی به PHP براتون آسونتر از پایتون باشه یا شاید دلتون بخواد یک زبان برنامهنویسی دیگه رو هم امتحان کنین.
روش اول استفاده از PHP در رزبری پای
قبل از نصب PHP روی RPi، باید PHP رو روی یک ماشین نصب کنین. خیلی اوقات، PHP همراه با وب سرورهایی مثل Apache استفاده میشه. برای نصب PHP و Apache روی RPi این کد رو اجرا کنین:
sudo apt-get install apache2 php5
به جای Apache میتونین یک سرور سبکتر مثل lighttpd رو نصب کنین، برای نصب این سرور فرمان زیر رو اجرا کنین:
sudo apt-get install lighttpd php5
احتمالاً آسونترین راه استفاده از PHP در RPi از طریق تابع ()shell_exec هست. با استفاده از این تابع میتونین فرمانهای shell رو اجرا کنین، این تابع میتونه به عنوان یک پل بین PHP و RPi عمل کنه. در سادهترین حالت، ()shell_exec میتونه اسکریپتهای پایتون رو که تسکهای خاصی انجام میدن و پینهای GPIO رو کنترل میکنن فراخوان کنه.
روش دوم استفاده از PHP در رزبری پای
یکی دیگه از روشها اینه که با استفاده از کتابخانه Wiring Pi پینهای GPIO رو کنترل کنین و از طریق تابع ()shell_exec کتابخانه رو به همراه PHP استفاده کنین. برای عملی کردن این روش، باید اول Wiring Pi رو روی RPi نصب کنین. این کتابخانه به صورت پکیج باینری در دسترس نیست، بنابراین باید اون رو کامپایل کنین و بعد اون رو از منبع نصب کنین. خوشبختانه، انجام این کار نسبتاً آسونه. ابتدا با اجرای فرمان زیر، نرمافزار Git رو نصب کنین:
sudo apt-get install git-core
در مرحله بعد، با اجرای فرمان زیر Wiring Pi Git repository رو clone کنین:
git clone git://git.drogon.net/wiringPi
به دایرکتوری wiringPi برید و با استفاده از فرمان ./build ، Wiring Pi رو کامپایل و نصب کنین:
cd wiringPi ./build
برای اینکه مطمئن بشین Wiring Pi نصب شده و به درستی کار میکنه، فرمان gpio -v رو اجرا کنین. این فرمان باید نسخه Wiring Pi رو به همراه اطلاعات پایه RPi برگردونه. در مرحله بعد، فرمان رو اجرا کنین تا دیاگرام layout پینهای GPIO رو ببینین.
تمرین اول : یک اپلیکشن ساده برای کنترل LED می نویسیم
من برای استفاده از Wiring Pi، یک اپلیکیشن PHP خیلی ساده میسازم تا LED رو با اون کنترل کنم. یک LED رو به همراه مقاومت به پین 17 و GND وصل کنین (شکل 1). ترمینال رو در RPi باز کنین (یا از طریق SSH به اون وصل بشین) و به دایرکتوری /var/www برید. سپس، برای ایجاد فایل gpio.php فرمان sudo nano gpio.php رو اجرا کنین تا بتونین فایلها رو ویرایش کنین. کد موجود در تمرین 1 رو در فایل کپی کنین.
01 <html> 02 <head> 03 <meta name="viewport" content="width=device-width" /> 04 <title>LED Control</title> 05 </head> 06 <body> 07 LED Control: 08 <form method="get" action="gpio.php"> 09 <input type="submit" value="ON" name="on"> 10 <input type="submit" value="OFF" name="off"> 11 </form> 12 <?php 13 $setmode17 = shell_exec("/usr/local/bin/gpio -g mode 17 out"); 14 if(isset($_GET['on'])){ 15 $gpio_on = shell_exec("/usr/local/bin/gpio -g write 17 1"); 16 echo "LED is on"; 17 } 18 else if(isset($_GET['off'])){ 19 $gpio_off = shell_exec("/usr/local/bin/gpio -g write 17 0"); 20 echo "LED is off"; 21 } 22 ?> 23 </body> 24 </html>
جز اصلی این اپلیکیشن یک HTML هست که شامل کلیدهای ON و OFF میشه. زمانیکه یکی از این کلیدها رو میزنین، مقدار اون به بخشی از URL تبدیل میشه ( gpio.php?on=ON و gpio.php?off=OFF ). کد PHP که از تابع ()shell_exec استفاده میکنه، پین 17 GPIO رو کنترل میکنه. کد موجود در خط 13 حالت پین رو روی out تنظیم میکنه؛ بلوک کد موجود در خطهای 14 تا 21 مقدار فعلی رو از URL میخونه و با استفاده از تابع ()shell_exec پین رو خاموش یا روشن میکنه.
حالا، از مرورگر به http://127.0.0.1/gpio.php برید ( 127.0.0.1 رو با آدرس IP واقعی RPi جایگزین کنین) و با استفاده از کلیدها LED رو که به RPi وصل هست خاموش و روشن کنین.
اگر کلیدها کار نکردن، به احتمال زیاد وب سرور اجازه اجرای فرمانهای Shell رو نداره. برای حل این مشکل، فرمان sudo visudo رو اجرا کنین و خط زیر رو به فایل sudoers اضافه کنین:
www-data ALL=NOPASSWD: ALL
در ضمن، مطمئن بشین دایرکتوری /var/www به user و گروه www-data تعلق داره
( با استفاده از sudo chown -R www-data:www-data /var/www میتونین کاربر صحیح رو انتخاب کنین).
با انجام تغییرهای کوچک در این اپلیکیشن ساده PHP میشه استفادههای مختلفی ازش داشت. برای مثال، من با استفاده از یک سوییچ ترانزیستور که به RPi وصل شده بود، دوربین SLR رو کنترل کردم. در راهکاری اصلی از یک اسکریپت ساده پایتون برای کنترل سوییچ استفاده شده. برای اجرای اسکریپت، میبایست این کار رو از طریق اتصال SSH انجام بدم که در خیلی موارد عملی نبود. به همین دلیل، نمونه اسکریپت PHP رو برای استفاده به همراه سوییچ ترانزیستور تغییر دادم (تمرین 2).
تمرین دوم : اپلیکشن برای کنترل سوییچ ترانزیستور
01 <html> 02 <head> 03 <meta name="viewport" content="width=device-width" /> 04 <title>Trigger</title> 05 </head> 06 <body> 07 Trigger switch: 08 <form method="get" action="switch.php"> 09 <input type="submit" value="Trigger" name="switch"> 10 </form> 11 <?php 12 $setmode17 = shell_exec("/usr/local/bin/gpio -g mode 17 out"); 13 if(isset($_GET['switch'])){ 14 $gpio_off = shell_exec("/usr/local/bin/gpio -g write 17 1"); 15 sleep (0.5); 16 $gpio_on = shell_exec("/usr/local/bin/gpio -g write 17 0"); 17 echo "Done!"; 18 } 19 ?> 20 </body> 21 </html>
تنها کاری که لازم بود انجام بدم این بود که یکی از کلیدها رو حذف کنم و فرمانها رو در جمله شرطی if تغییر بدم تا سوییچ رو روشن کنه، 5/0 ثانیه منتظر بمونه ( تا دوربین سیگنال رو ثبت کنه)، و بعد سوییچ رو خاموش کنه. حالا میتونم با استفاده از اپلیکیشن PHP دوربین رو برای هر نوع کامپیوتر و موبایلی فعال کنم.
استفاده از مسیر دهی GPIO در PHP
هرچند استفاده از Wiring Pi به همراه فراخون ()shell_exec برای کنترل پینهای GPIO در اسکریپتهای PHP خیلی آسونه، اما تنها راهش نیست. پروژه php-gpio یک کتابخانه PHP تخصصی برای دسترسی به پین GPIO رزبری پای در اختیار شما قرار میده. برای شروع کار با php-gpio و نصب کتابخانه و فایلهای اون در دایرکتوری /home/pi فرمانهای زیر رو اجرا کنین:
wget http://getcomposer.org/composer.phar php composer.phar create-project --stability='dev'ronanguilloux/php-gpio
php-gpio برای تعیین پینهای GPIO و تغییر حالت اونا از اسکریپت PHP از مجموعهای از فراخوانهای API استفاده میکنه. برای فعال کردن این قابلیت، اسکریپت باید شامل statement های زیر باشه که کتابخانه رو بارگذاری میکنه و پین GPIO رو نصب میکنه:
require 'vendor/autoload.php'; use PhpGpio\Gpio; $gpio = new GPIO(); $gpio->setup(17, "out");
در این مثال، Statement آخر پین 17 GPIO رو به عنوان خروجی تعیین میکنه. برای کنترل پینها به دو فرمان دیگه هم نیاز داریم:
$gpio->output(17, 1) $gpio->output(17, 0)
فرمان اول پین رو در حالت 1 (به عبارت دیگه اونو روشن میکنه) و فرمان دوم پین رو در حالت 0 (پین رو خاموش میکنه) قرار میده. در آخر، فرمان ()$gpio->unexportAll تمامی پینها رو Reset میکنه.
با استفاده از این فرمانها میتونین یک اسکریپت PHP ساده آماده کنین که LED متصل به پین 17 GPIO رو در حالت چشمکزن قرار بده (تمرین 3).
تمرین سوم : اسکریپت ساده PHP چشمک زدن LED
01 <?php 02 require 'vendor/autoload.php'; 03 use PhpGpio\Gpio; 04 $gpio = new GPIO(); 05 $gpio->setup(17, "out"); 06 while (true){ 07 $gpio->output(17, 1); 08 sleep(1); 09 $gpio->output(17, 0); 10 sleep(1); 11 }
برای اجرای اسکریپت، فرمان sudo php blinking_led_script.php رو اجرا کنین. هرچند با استفاده از کتابخانه php-gpio به سادگی میشه پینهای GPIO رو از اسکریپت PHP کنترل کرد، اما توجه داشته باشین که اسکریپتها باید از خط فرمان اجرا بشن. به عبارت دیگه، نمیشه فرمانهای فوق رو مستقیماً در صفحات PHP که وب سرور به اونا سرویسدهی میکنه استفاده کرد.
راهحل خیلی ساده است: از تابع ()shell_exec برای فراخوانی اسکریپت از اپلیکیشن PHP استفاده کنین. برای مثال، من یک گالری عکس ساده مبتنی بر PHP روی RPi اجرا کردم و shell_exec(‘sudo php path/to/php-gpio/blink_led.php’) رو اضافه کردم که اسکریپت blink_led.php رو فراخون میکنه. بدین ترتیب، وقتی کسی به گالری من سر میزنه، LED چند ثانیه چشمک میزنه.
تنها مشکلی که وجود داره اینه که اگر اسکرپیت فراخوان شده اجرا بشه، کل اپلیکیشن PHP متوقف میشه. در مورد اسکرپیت LED چشمکزن، ممکنه این مسئله مشکلی به وجود نیاره اما، اگر اسکریپتی فراخوانی کنین که اجراش بیشتر طول بکشه، با مشکل جدی مواجه میشین. خوشبختانه، میشه این مشکل رو حل کرد. میشه اسکریپت رو در پسزمینه اجرا کرد و با redirect کردن اسکریپت، خروجی رو نادیده گرفت:
shell_exec('sudo php path/to/php-gpio/\ blink_led.php > /dev/null 2> /dev/null &');
از آنجاییکه تمام اسکریپتهای PHP رزبری پای باید با root privilege اجرا بشن، باید کاربر www-data رو به فایل sudoers اضافه کنین.
کتابخانه php-gpio میتونه کاربردهای دیگهای هم داشته باشه. برای مثال، php-gpio-web GitHub repo شامل یک وب اپلیکیشن ساده است که نشون میده چجوری میشه یک رابط وب برای کنترل LED ایجاد کرد و پروژه temperature-pi نشون میده که چجوری میشه دادههای یک سنسور دما رو خوند و ثبت کرد.
جمع بندی
در این آموزش تونستیم زبان PHP رو در رزبری پای نصب کنیم و از اون استفاده کنیم. داخل این مقاله سه مثال ساده برای استفاده از PHP در رزبری پای اورده شد. شاید براتون سوال باشه که مزیت زبان برنامه نویسی PHP در چیست؟ در ادامه با بعضی از برتری های این زبان برنامه نویسی آشنا خواهید شد:
-
مهمترین مزیت PHP این است که منبع باز و بدون هزینه است. می توان آن را در هر جایی دانلود کرد و به راحتی برای استفاده برای رویدادها یا برنامه های کاربردی وب در دسترس است.
-
مستقل از پلتفرم است. برنامه های مبتنی بر PHP می توانند روی هر سیستم عاملی مانند یونیکس، لینوکس، ویندوز و غیره اجرا شوند.
-
برنامه هایی که مبتنی بر PHP هستند و به پایگاه داده متصل می شوند را می توان به راحتی بارگذاری کرد. این عمدتا به دلیل سرعت بارگذاری سریعتر آن در سرعت پایین اینترنت نسبت به سایر زبان های برنامه نویسی استفاده می شود.
-
استفاده از آن ساده است. شخصی که با برنامه نویسی C آشنا است می تواند به راحتی روی PHP کار کند.
-
با کمک پشتیبانی مداوم از نسخه های مختلف، برای چند سال پایدارتر است.
-
به استفاده مجدد از یک کد معادل کمک می کند و نیازی به نوشتن کد طولانی و ساختار پیچیده برای رویدادهای برنامه های کاربردی وب نیست.
-
دارای پشتیبانی کتابخانه ای قدرتمند برای استفاده از ماژول های عملکرد مختلف برای نمایش داده ها.