PHPでのRaspberry PiのGPIO操作~ ラズベリーパイ研究室

Raspberry Pi は簡単にいうと Linux マシンですから他の言語でも十分な開発が行えるようになっています。raspberry pi で推奨されている開発言語はどうも Pythonですが、 PHP でGPIOを操作するにはどうするか、という方法をざっと纏めてみました。




コンテンツ関連広告

イントロダクション

raspberry pi で推奨されている開発言語はどうも Python という事のようですね。Python は日本では少しマイナーですが世界的にはとてもメジャーな言語なので、日本と世界との温度差みたいなものが感じられます。

Raspbian をインストールすれば Python のGPIO操作ライブラリも使えるようになっていて、すぐにLEDを光らせてみるような実験が行えるようになります。

他のページでも紹介している Raspberry Pi での電子工作の入門書

のプログラムも Python です。

しかし、Raspberry Pi は簡単にいうと Linux マシンですから他の言語でも十分な開発が行えるようになっています。このページでは PHP でGPIOを操作するにはどうするか、という方法をざっと纏めてみることにします。

ファイルを直接操作する

一番汎用的な操作方法がこれだと思います。

Raspberry Pi は /sys/class/gpio 内に決められたファイルを書きだすことでGPIOの操作が行えるようになっています。デフォルトの状態のこのディレクトリの内容を見てみると

pi@raspberrypi $ cd /sys/class/gpio
pi@raspberrypi /sys/class/gpio $ ls
export gpiochip0 unexport

このような状態です。GPIO 25番(22番ピン)を利用するケースを考えてみると、まず、

echo 25 > /sys/class/gpio/export

として、使用するピン番号をexportに書き込みます。すると、

pi@raspberrypi /sys/class/gpio $ ls
export gpio25 gpiochip0 unexport

このように、gpio25 ディレクトリが生成されます。中身を見てみると、

pi@raspberrypi /sys/class/gpio $ cd gpio25
pi@raspberrypi /sys/class/gpio/gpio25 $ ls
active_low device direction edge subsystem uevent value

このようなファイルやディレクトリが作成されています。これで、GPIO 25番を利用する準備は整いました。ではLEDのアノード側にGPIO 25番(22番ピン)を接続し、カソード側をGNDに接続してLEDを光らせてみましょう。

ブレッドボード

LEDを光らせるということは出力を行うということなので、direction に出力を示す“out”を書き込みます。

echo out > /sys/class/gpio/gpio25/direction

これでGPIO 25は出力用に設定されたので、あとは value に HIGH を示す1を書き込みます。

echo 1 > /sys/class/gpio/gpio25/value

これでLEDが点灯します。なお、value には HIGHかLOW、つまり1か0を書きこむようにしてください。

GPIO 25 を使わなくなったら、最後にunexport に25を出力してください。gpio25 ディレクトリがクリーンナップされます。

echo 25 > /sys/class/gpio/unexport

以上がGPIOのファイルを直接操作する方法です。ちなみに、昔の Raspbian では上記を実行するときには sudo をつける必要があったようですが、現在は gpio を操作するためのグループ gpio がつくられ、pi ユーザーもこのグループに所属するため、sudoをする必要はなくなっています。

つまり、ファイル操作が行える言語で、Raspberry Pi で動作する言語であればなんであろうと、必ずGPIOを操作できるということになります。

例えばPHPでの上記の一連の操作は、次のようになります。

sudo vi gpio_test.php
-----------------------------------------
<?php
file_put_contents('/sys/class/gpio/export', 25);
file_put_contents('/sys/class/gpio/gpio25/direction', 'out');
file_put_contents('/sys/class/gpio/gpio25/value', 1);

上記プログラムを gpio_test.php として保存した後、

sudo php -q gpio_test.php

とすることで、LEDが点灯することが確認できると思います。

点灯したLED

WiringPiを使ったGPIO操作

WiringPi は Raspberry Pi のGPIO操作を行うC言語ライブラリです。簡単にGPIOを操作するためのメソッドが多数実装されていて、さらに、この WiringPi を他の言語でも利用できるようにしたラッパーも多数提供されています。

この WiringPi を利用するのが一番効率が良いかと思います。

まず、WiringPi のソースコードをgitで入手するための下準備をします。

sudo apt-get install libi2c-dev
sudo apt-get install git-core

そうしたら、WiringPi のソースを入手してインストールします。インストールは以下のコマンドを順次実行するだけです。

cd ~
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

WiringPi がインストールされたか、gpioコマンドでバージョンを確認してみましょう。

pi@raspberrypi ~/wiringPi $ gpio -v
gpio version: 2.26
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
Type: Model 2, Revision: 1.1, Memory: 1024MB, Maker: Sony

上記の様に gpio のバージョン情報が表示されればインストールは正常に行われています。

さて、ではこの状態で先程のファイル操作と同じことをしてみます。

gpio -g mode 25 out
gpio -g write 25 1

これだけです。-g オプションは WiringPi のページ によると、WiringPi のピン番号ではなく、BCM_GPIOのピン番号で指定を行うことを明示するためのオプションだそうです。

ここで、「WiringPi のピン番号とは?」と思った方は、

gpio readall

コマンドで各ピン番号の対比を見てみてください。

そうすると、PHP でこのコマンドを叩けば、やはりGPIOの操作が可能です。

sudo vi gpio_test2.php
------------------------------------
<?php
exec("gpio -g mode 25 out");
exec("gpio -g write 25 1");

となります。ただ、execコマンドは少し処理が重いので使いどころ次第ですね。

PHP用のライブラリを利用する

PHP 用の GPIO ライブラリも複数ありますが、最有力なのはWiringPi-PHPでした。ところが、このWiringPi-PHP、どうもまだ Raspberry Pi 2 Model B には対応していないようです。Model B+ で動作したコードが2Bでは動作しませんでした。

Raspberry Pi 2 は CPU の変更により GPIO のアドレスが変更になったそうで、githubにあるWiringPi-PHP のコードはこれにまだ対応していないようです。 WiringPi の方は対応済みとなっていて、WiringPi-PHP はこのラッパーですから少しコードを読めば対応できると思います。あまり長引くようなら対処法を調べてみたいと思います。(2015/06/14追記 この記事の最後にWiringPi-PHPを使えるようにする方法を追記しました)

では別のライブラリですが、php-gpio というのがあります。

こちらは WiringPi-PHP よりもずっと簡単な作りで、原理としては最初のファイル操作をそのまま行うライブラリのようです。

インストールは、現在の PHP でスタンダードになりつつある composer を使うようです。

まず、composer のインストールですが、

cd /var/www
sudo wget http://getcomposer.org/composer.phar

で、composer.phar をダウンロードします。そうしたら、この composer.phar を使って、php-gpio のパッケージをインストールします。

sudo php composer.phar create-project --stability='dev' ronanguilloux/php-gpio /var/www/php-gpio

これで、/var/www/ ディレクトリに php-gpioプロジェクトが作成され、パッケージがインストールされました。あとはPHPコードでこのディレクトリのなかの vendor/autoload.php を require すれば GPIO操作が行えるようです。

実際にやってみましょう。

cd /var/www/html/
sudo vi gpio_test4.php
------------------------------------
<?php
require '/var/www/php-gpio/vendor/autoload.php';
use PhpGpio\Gpio;

$gpio = new GPIO();
$gpio->setup(25, "out");
$gpio->output(25, 1);

となります。

こちらのライブラリが Raspberry Pi 2 でも問題なく動作したのは、前述したとおり、ファイル操作による GPIO 操作を行っていたからですね。より簡単な実装の物の方が、汎用性が高かったようです。ただ、こちらは PWM 信号のインターフェイスが実装されていません。(PWM信号とは極めて短い間隔でHIGHとLOWを切り替える信号で、アナログ信号のように1と0だけでない中間の値を表現する事等につかわれます)

ですから、本当にGPIOをフル活用したければ、やはりWiringPi-PHPの対応が待たれます。

別のプログラムでコードを書き、PHPで呼び出す

極論を言えば、全てを PHP コードで書く必要などありません。WiringPi-PHP がつかえなくても、Pythonのライブラリである WiringPi2-Python は使えるのですから、Python で書いて、それを PHP から呼び出せばよいわけです。

簡単な例として、以下のようなプログラムを試してみましょう。

sudo vi python.py
-------------------------------------
print "Python"

sudo vi call.php
-------------------------------------
<?php
echo "この文字列は " . exec("sudo python python.py") . "からの文字列です。\n";

さあ、実行してみましょう。

sudo php -q call.php

pi@raspberrypi /var/www/html $ sudo php -q call.php
この文字列は Pythonからの文字列です。

この研究室ページの 赤外線リモコン信号受信・送信 で紹介しているプログラムはC言語で書かれていますが、これをPHPから上記と同様に呼び出して動作させることが可能です。(この場合は、C言語のプログラムからの echo を確認するため、system()コマンドを用いた方が良いでしょう)

冒頭で紹介した「Raspberry Pi で学ぶ電子工作」には Python のコードが沢山ありますので、1からPHPで書き直そうとせずに、必要なところだけそのまま流用する、という使い方も一つの方法かと思います。

WiringPi-PHPを使う

(2015/06/14 追記)

WiringPi-PHP を使う方法についてですが、github にあるWiringPi-PHP のコードは前述の通り古いもので、Raspberry Pi 2 では正しく動作しないようです。これは、WiringPi-PHP のディレクトリ内にある wiringPi のコードが古いもので、コンパイル時にこれを利用しているからです。

ですから、WiringPi-PHP ディレクトリ内の wiringPi のソースコードを新しい物に替えれば Raspberry Pi 2 に対応させることができます。

まず、念のためWiringPi-PHP の中の古い wiringPi を念のためバックアップします。

cd WiringPi-PHP
mv WiringPi WiringPi-back

次に、この記事の上の方でダウンロードしてあった wiringPi を WiringPi-PHP ディレクトリにコピーします。wiringPi は小文字で始まりますが、WiringPi-PHP 内のwiringPi ディレクトリは大文字で始まっています。コンパイル情報をあまりいじらなくてよいように、コピー時にリネームしてしまいます。

cd ../
cp wiringPi WiringPi-PHP/WiringPi

これでコンパイルすればよさそうですが、どうやら新しい wiringPi ではいくつかのメソッドが追加されたかあるいは記述場所が移動しているようで、build エラーが発生してしまいます。具体的には、softToneとsoftPwmで、これらをbuild.shに追加する必要があります。( ‘ はバッククオートです)

cd WiringPi-PHP
sudo vi build.sh
--------------------------------
mkdir build
cd build

gcc ‘php-config --includes‘ -fpic -c ../wiringpi_wrap.c ../WiringPi/wiringPi/wiringPi.c ../WiringPi/wiringPi/wiringShift.c ../WiringPi/wiringPi/wiringSerial.c ../WiringPi/wiringPi/piHiPri.c ../WiringPi/wiringPi/softPwm.c ../WiringPi/wiringPi/softTone.c

gcc -shared wiringpi_wrap.o wiringPi.o wiringSerial.o piHiPri.o wiringShift.o softPwm.o softTone.o -o wiringpi.so

それぞれ、

  • ../WiringPi/wiringPi/softPwm.c ../WiringPi/wiringPi/softTone.c
  • softPwm.o softTone.o

が追加コードです。

後は github の記述通り、ビルドしてインストールするだけです。

./build.sh
sudo ./install.sh

ビルドに失敗した場合は、mkdir build で作成されている build ディレクトリを rm -rf build で削除すれば何度でもやり直せます。

これで、Raspberry Pi 2 でもWiringPi-PHP が利用できるようになります。

ただし、先ほど追加した softTone と softPwm のラッパーメソッドはWiringPi-PHP には追加されていません。

このため、これらを利用したい場合には WiringPi-PHP 内の php_wiringpi.h と wiringpi_wrap.c に、softTone と softPwm のラッパーファンクションを別途、追加する必要があります。

この記事へのコメント


この記事に返信

このコメントに返信


コンテンツ関連広告