Bir önceki yazımda PHP ile gpio kontrolünü anlatmıştım. Burada WiringPi-PHP’den bahsedeceğim. Bildiğiniz gibi WiringPi kütüphanesi C dilinde yazılmış ve derlemiş programlar ile GPIO kontrolü 7MHz gibi hızlara çıkabilmekte. Ancak kontrolü system/exec komutları üzerinden /sys/class/gpio arayüzü ile yapınca muazzam yavaş hızlara takılı kalıyoruz.
Bu yazıda WiringPi’nin bir PHP extension’ı (PHP uzantısı) olarak web sunucuya yüklenmesinden bahsedeceğim. WiringPi-PHP WiringPi kütüphanesini bir alt modül olarak kullanan bir PHP uzantısı. Bu uzantı ile GPIO kontrolü çok yüksek hızlara çıkabilmekte. Henüz bir osilaskop ile frekans ölçümü yapmadım fakat en kısa zamanda yapıp burada sizler ile paylaşacağım.
Öncelikle php-dev’i kuruyoruz:
1 |
sudo apt-get install php5-dev |
Daha sonra github’dan WirinPi-PHP’yi kendimize klonluyoruz. –recursive ile alt modülleri de dahil ediyoruz.
1 |
git clone --recursive https://github.com/WiringPi/WiringPi-PHP.git |
Klonlama tamamlandığında WiringPi-PHP dizinine girip derleme ve yükleme işlemini gerçekleştiriyoruz.
1 2 3 4 |
cd WiringPi-PHP ./build.sh |
1 2 3 |
sudo ./install.sh |
install script’i bizim için wiringpi.so PHP uzantısını derleyip PHP extension dizinine kopyaladı. PHP’nin extension dizinini öğrenmek isterseniz aşağıdaki komutu kullanabilirsiniz.
1 |
php-config --extension-dir |
Şimdi sırada bu uzantıyı PHP’ye tanıtma işlemi var. Önceklikle nano ile yeni bir php ayar dosyası oluşturacağız.
1 |
sudo nano /etc/php5/conf.d/wiringpi.ini |
Daha sonra bu dosyanın içerisine aşağıdaki satırları aynen yazın ve kaydedin.
extension=wiringpi.so
wiringpi.pinmaptype=PINS
Ayarların geçerli olması için apache’yi yeniden başlatıyoruz.
1 |
sudo service apache2 restart |
WiringPi-PHP ‘nin doğru olarak yüklendiğini test etmek için aşağıdaki php sayfasını çağırın ve wiringpi modülünü aratın.
1 2 3 4 5 6 7 |
<?php echo phpinfo(); ?> |
Şimdi gelelim WiringPi-PHP’nin kullanımına. Öncelikle WiringPi sınıf yükleyicisini sunucunuzun yayın dizininde bir yere wiringpi.php adıyla kaydedin. Daha sonra bu php dosyasını örneğimiz içerisinde include ile çağıracağız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php /* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (http://www.swig.org). * Version 2.0.7 * * This file is not intended to be easily readable and contains a number of * coding conventions designed to improve portability and efficiency. Do not make * changes to this file unless you know what you are doing--modify the SWIG * interface file instead. * ----------------------------------------------------------------------------- */ // Try to load our extension if it's not already loaded. if (!extension_loaded('wiringpi')) { if (strtolower(substr(PHP_OS, 0, 3)) === 'win') { if (!dl('php_wiringpi.dll')) return; } else { // PHP_SHLIB_SUFFIX gives 'dylib' on MacOS X but modules are 'so'. if (PHP_SHLIB_SUFFIX === 'dylib') { if (!dl('wiringpi.so')) return; } else { if (!dl('wiringpi.'.PHP_SHLIB_SUFFIX)) return; } } } abstract class wiringpi { static function wiringPiSetup() { return wiringPiSetup(); } static function wiringPiSetupSys() { return wiringPiSetupSys(); } static function wiringPiSetupGpio() { return wiringPiSetupGpio(); } static function pullUpDnControl($pin,$pud) { pullUpDnControl($pin,$pud); } static function pinMode($pin,$mode) { pinMode($pin,$mode); } static function digitalWrite($pin,$value) { digitalWrite($pin,$value); } static function digitalWriteByte($value) { digitalWriteByte($value); } static function pwmWrite($pin,$value) { pwmWrite($pin,$value); } static function digitalRead($pin) { return digitalRead($pin); } static function shiftOut($dPin,$cPin,$order,$val) { shiftOut($dPin,$cPin,$order,$val); } static function shiftIn($dPin,$cPin,$order) { return shiftIn($dPin,$cPin,$order); } static function delay($howLong) { delay($howLong); } static function delayMicroseconds($howLong) { delayMicroseconds($howLong); } static function millis() { return millis(); } static function serialOpen($device,$baud) { return serialOpen($device,$baud); } static function serialClose($fd) { serialClose($fd); } static function serialPutchar($fd,$c_) { serialPutchar($fd,$c_); } static function serialPuts($fd,$s) { serialPuts($fd,$s); } static function serialDataAvail($fd) { return serialDataAvail($fd); } static function serialGetchar($fd) { return serialGetchar($fd); } static function serialPrintf($fd,$message) { serialPrintf($fd,$message); } } ?> |
Daha önce burada verdiğim örneğin aynısını bu kez WiringPi-PHP ile gerçekleştireceğim. Lütfen kodları inceleyin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php ini_set("enable_dl","On"); include('wiringpi.php'); for ($i=0; $i<=16; $i++) wiringpi::pinMode($i, 1); $delay = 10*1000; for ($j=0; $j<10; $j++) { for ($i=0; $i<=16; $i++) { wiringpi::digitalWrite($i, 1); usleep($delay); } for ($i=0; $i<=16; $i++) { wiringpi::digitalWrite($i, 0); usleep($delay); } } ?> |
Bu örnekte $delay değerini artırarak döngüleri yavaşlatabilirsiniz. Gördüğünüz gibi WirinPi-PHP uzantısı shell exec örneğine göre çok daha hızlı.
Umarım faydalı olur. Sorularınız olursa sayfanın sonuna yazarsanız elimden geldiğince yanıtlamaya çalışırım.
Kolay gelsin.
