PHPでLチカやってみた

isaax Advent Calendar 2018の17日目の記事です。 Raspberry Piのチュートリアルでは比較的ポピュラーなLチカ(LEDチカチカ)ありますよね。多くの場合、PythonやNode.jsを使うと思いますが、PHPでも出来るのでやってみました。 何でPHPでやろうと思ったかというと、週末PHPカンファレンスに参加して懇親会でLTをすることになったので思いつきました。 こちらの発表スライドを見ながらやってみると上手く出来ると思います。 https://speakerdeck.com/tomotomo/phpdeltika-phpkanhuarensu2018-ken-qin-hui 次は、実際に動かした動画です。 https://twitter.com/tomotomobile/status/1074131194567045121

補足説明

スライドを見てもらったらわかるかもしれませんが、それだと書くことが無くなってしまうので、ちょっとだけ補足説明していきます。(脱線多め)

何でPHPでLチカ出来るのか

Raspberry PiのGIPO操作は/sys/class/gpio以下の特定のファイルに特定の文字列を書き込むことで電圧をHIGHにしたりLOWにしたりします。 なのでファイルへの書き込みができる言語ならば何を使ってもGPIOの操作ができます。Raspbianで実行環境を構築することが前提となりますが。

PHPの実行環境の作り方

Raspberry Pi用のOS RaspbianにはPHPの実行環境が最初は用意されていません。なので環境を用意する必要があります。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install php
$ php -v
PHP 7.0.33-0+deb9u1 (cli) (built: Dec  7 2018 11:36:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u1, Copyright (c) 1999-2017, by Zend Technologies
sudo apt install phpを実行する前にパッケージリストを更新して上げる必要があります。私は面倒臭がってやらずにPHPのインストールをしようとしたところ、必要なパッケージがリンク切れになっていてインストール出来ませんでした。 ちなみに、昔からUbuntuやDebianを使っている人はapt-getで覚えていると思いますが、最近はaptコマンドの方が推奨に変わったらしいですね。

sudoいる?いらない?

シェルスクリプトでGIPOの操作をしたときはecho out > /sys/class/gpio/gpio4/directionでsudoをつけなくてもファイルに書き込みができました。しかし、PHPで実行する際はsudo php led.phpの様にsudoをつけずに実行するとパーミッションエラーで書き込みが出きませんでした。
$ php led.php
PHP Warning:  file_put_contents(/sys/class/gpio/gpio4/direction): failed to open stream: Permission denied in /home/pi/led.php on line 5
PHP Warning:  file_put_contents(/sys/class/gpio/gpio4/value): failed to open stream: Permission denied in /home/pi/led.php on line 7
/sys/class/gpio/exportへの書き込みはできますが、/sys/class/gpio/gpio4/derectionへの書き込みができません。エラーが発生したところでスクリプトを止めて書き込み対象のファイルの詳細を見てみます。
pi@raspberrypi:~ $ ls -l /sys/class/gpio/
total 0
-rwxrwx--- 1 root gpio 4096 Dec 17 08:32 export
lrwxrwxrwx 1 root gpio    0 Dec 17 08:32 gpio4 -> ../../devices/platform/soc/3f200000.gpio/gpiochip0/gpio/gpio4
lrwxrwxrwx 1 root gpio    0 Dec 17 07:17 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
lrwxrwxrwx 1 root gpio    0 Dec 17 07:17 gpiochip128 -> ../../devices/gpiochip1/gpio/gpiochip128
-rwxrwx--- 1 root gpio 4096 Dec 17 08:31 unexport
ちゃんとgpio4が生成されていましたし、どちらのファイルも所有者はroot:gpioです。piユーザーはgpioグループに所属しているので書き込みできそうな感じはしますが。。。 よく見るとgpio4はシンボリックリンクになっているます。PHPのfile_put_contents関数の仕様なのかもしれませんが、とにかくsudoをつけて実行しないと書き込みができないということだけわかりました。謎は深まるばかりですが、これ以上はどんどんRaspberry Piと関係なくなりそうなのでこのへんで止めておきます。

isaaxで動かしてみた

毎回Raspberry Piにログインして実行コマンドを叩くのは大変なのでisaaxで動くようにしてみました。isaax.jsonファイルを作成し、下記のようにstartコマンドを定義します。
{
    "name": "php-led-chika",
    "version": "0.1",
    "description": "PHPでLチカ",
    "author": "tomotomo",
    "license": "MIT License",
    "language": "",
    "scripts": {
        "start": "php led.php"
    }
}
isaaxで動かすときは、rootユーザーで実行されますので、sudoを付ける必要はありません。 [caption id="attachment_8453" align="alignnone" width="1213"] ON/OFFのログが表示された[/caption] Raspberry Piの電源を入れOSが起動するとLEDが点灯し、5秒後に消えるLチカができました。今回作成したプログラムはGithubに公開しましたので、試してみたい方はご自由にお使いください。 余談ですがisaaxはプロセスが終了すると2分後に自動的に再度プロセスを立ち上げます。今回はLチカを繰り返すPHPの処理を書きませんでしたが、isaaxが自動的に繰り返し実行してくれました。

まとめ

いかがでしょうか。PHPerでもRaspberry Piを使ってIoTシステムを構築することができそうな気がしませんか?PHPでGPIOの操作が出来るということは、頑張ればサーボモーターの制御もできるということです(頑張れば)。そのうちチャレンジしてみたいと思います。 それでは引き続きisaax Advent Calendar 2018をお楽しみください。]]>

上部へスクロール