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が自動的に繰り返し実行してくれました。