前回、ApacheとPHPをインストールし、動作確認をするところまで記載しました。今回は目標であった、PHPからRaspbery PiのGPIOを制御する方法を記載したいと思います。PHPからGPIOを制御できれば、Webページの作り方次第でいろいろなユーザーインターフェースを作ることができます。
PHPからGPIOを制御する方法はいくつかあると思いますが、PHPからpythonコード(xxx.py)を実行する方法を紹介したいと思います(WiringPi でも可能です、時間があればWiringPi も記事にしたいと思います)。作成済みのpythonコード(xxx.py)を多く持っている方や、PHP等のWebを作る人と組み込み系のpythonコードを作る人と分業体制で開発している方は、この方法が便利だと思います。
それでは実際にWebページを作っていきましょう。以下のような簡単なWebページで動作を確認します。
・WebページのStartボタンを押す ⇒ GPIOに繋がっているLEDが点灯する
・WebページのStopボタンを押す ⇒ GPIOに繋がっているLEDが消灯する
phpのコードの作成
Webサーバのルートフォルダの下に、ledTest.phpを新規に作成し、以下のコードを記載します。
sudo vi /var/www/html/ledTest.php
特に難しいことはありません。startとstopボタンを作成し、switch文で
・startボタンが押されたら、LEDを点灯するpythonコードを実行する
・stopボタンが押されたら、LEDを消灯するpythonコードを実行する
というコードになります。
----------ledTest.php----------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LedTest</title>
</head>
<body>
<?php
if(isset($_POST["start"])) {
echo "LED Light ON";
$path ='python ./ledStart.py';
exec($path);
}
else if(isset($_POST["stop"])) {
echo "LED Light OFF";
$path ='python ./ledStop.py';
exec($path);
}
?>
<form method="POST" action="">
<input type="submit" value="start" name="start">
<input type="submit" value="stop" name="stop">
</form>
</body>
</html>
LEDを点灯/消灯させるpythonコードの作成
上記で作成したledTest.phpと同じフォルダ内にledStart.pyとledStop.pyを作成します。LEDを点灯させたり、消灯させたりするコードは、Lチカの記事を参照してください。(ledStart.py ⇒ LED点灯、ledStop.py ⇒ LED消灯)
sudo vi /var/www/html/ledStart.py
----------ledStart.py----------
# -*- coding: utf-8 -*- #!/usr/bin/env python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
GPIO.output(37, True)
sudo vi /var/www/html/ledStop.py
----------ledStop.py----------
# -*- coding: utf-8 -*- #!/usr/bin/env python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(37, GPIO.OUT)
GPIO.output(37, False)
これでphpとpythonのコードは作成完了です。
動作確認
コードが完了しましたので、動作確認を行いましょう。ブラウザに "http://[Raspberry PiのIPアドレス]/ledTest.php"とアドレスを入力し、Enterキーを押します。Webページにstartボタンをstopボタンが表示されたと思います。startボタンを押すとLEDが点灯すると思ったのですが、点灯せず。。
apacheのエラーログを見ると、エラーが出てますね。この問題の解決方法は次回、記載したいと思います。つづく。。。