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:

sudo apt-get install php5-dev

Daha sonra github’dan WirinPi-PHP’yi kendimize klonluyoruz. –recursive ile alt modülleri de dahil ediyoruz.

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.

cd WiringPi-PHP
./build.sh
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.

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.

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.

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.

<?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.

<?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.

<?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.

CEVAP VER