Web Server Raspberry Pi

Webブラウザ経由でRaspberry PiのGPIOに繋がるリレーを駆動する

Raspberry PiのGPIOからリレーを駆動する方法について紹介しましたが、PHPとPythonを使ってWebブラウザ経由でリレーをON,OFFさせる方法を紹介します。すごく簡単ですが、Webとモノを連携したシステムで、IoTを感じられる内容になっていると思います。

PHPでPythonを実行する

下の記事で紹介している通り、Raspberry PiからPythonでGPIOを制御することは簡単に実現出来ます。

今回実現することは、WebブラウザからRaspberry PiのGPIOをコントロールすることになります。そこで、サーバーサイドで動作するPHPを使って、GPIOを制御するPythonプログラムを実行させることにします。PHPから、Linuxのシェルで実行されるコマンドを起動してGPIOを動かすことも出来ますが、少し特殊なシェルスクリプトが必要になります。今回は、より応用性の高いPythonを使った方法で実現したいと思います。

PHPでPythonを実行するには、下図のようにexec関数を使用し、実行するPythonのプログラム名の文字列データを第1引数に指定します。第2引数はPythonプログラムの標準出力結果を格納する変数を指定し、Pythonプログラム上printで出力する文字列等が格納されます。

PHPからPythonプログラムを実行

事前準備 Raspberry PiでWebサーバー構築

事前準備として、Rasbperry PiにApache2およびPHPをインストールしておきます。リレーはGPIOの信号で駆動できるドライブ回路が搭載された市販基板を用います。参考記事を載せておきます。

全体構成

全体構成としては、下図のようになります。

  • クライアント機:PCでもタブレットでもスマホでも構いません。
  • ルーター:クライアント機とサーバー機に同一LANのIP付与が必要です。
  • サーバー機:Raspberry Pi。Apache2のドキュメントルートにPHPとPythonプログラムを格納することになります。
  • リレーモジュール:Raspberry PiのGPIOから駆動するリレーモジュールです。
Raspberry PI GPIO ブラウザから実行_構成図

Raspberry PiのGPIOとリレーモジュール間配線

これは使用するリレーモジュールや、使用するGPIOの端子番号によって構成が変わりますので、参考として紹介します。この記事では、次のような配線にしています。

Raspberry PI GPIO ブラウザから実行_配線図

クライアント機から操作する画面イメージ

クライアント機のWebブラウザからサーバー機のGPIOに繋がっているリレーをON,OFFさせるわけですが、Webブラウザの画面は次のような構成とします。サブミットボタンを用い、リレーONボタン、リレーOFFボタンを準備します。

Raspberry PI GPIO ブラウザから実行_画面イメージ

では、プログラムを作成していきましょう。

PHPプログラム

ポイントとしては、リレーONのボタンが押されたときに呼び出すPythonのプログラムと、リレーOFFのボタンが押されたときに呼び出すプログラムを分けている所です。繰り返しになりますが、PHPからPythonプログラムを実行するために、exec関数を使用し、引数に"pyhon Pythonのプログラム名"を指定します。プログラム名はtest_php.phpとします。

<?php
if(isset($_POST['on']))
{
  $command="python test_py_on.py";
  exec($command,$output);
  print "relay ON signal sent";
}
else if(isset($_POST['off']))
{
  $command="python test_py_off.py";
  exec($command,$output);
  print "relay off signal sent";
}
?>
<form action="test_php.php" method="post">
    <input type="submit" name="on" value="リレーON" />
    <input type="submit" name="off" value="リレーOFF" />
</form>

Pythonプログラム

この記事ではGPIO14をリレー駆動の信号とするので、GPIO14番をOUTに設定しON側プログラムではHIGHに、OFF側プログラムではLOWにするプログラムです。

・リレーONが押された時に実行されるプログラム test_py_on.py

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
channel1 = 14
GPIO.setwarnings(False)
print("relay on signal sent")
GPIO.setup(channel1, GPIO.OUT)
GPIO.output(channel1, GPIO.HIGH)

・リレーOFFが押された時に実行されるプログラム test_py_off.py

import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
channel1 = 14
GPIO.setwarnings(False)
print("relay off signal sent")
GPIO.setup(channel1, GPIO.OUT)
GPIO.output(channel1, GPIO.LOW)

実行確認

プログラムが出来たら、早速実行してみましょう。作成したPHPと、2つのPythonプログラムをApache2のドキュメントルートへ格納します。Linuxのディストリビューションによって異なりますが、Debian系であれば、/var/www/htmlがApache2のドキュメントルートになります。こちらにプログラムをコピーしておいて下さい。

クライアント機のWebブラウザを起動し、Raspberry PiのIPアドレスのPHPプログラムを次のように指定します。

webブラウザで入力するアドレス

//Raspberry PiのIPアドレス/test_php.php

次のような画面が表示され、ON、OFFボタンでリレーをONOFFすることが出来れば成功です。

Raspberry PI GPIO ブラウザから実行_実行結果

もしリレーが動かない場合は、GPIOのコントロールの実行権限の問題の可能性があります。こちらの記事で対処方法を記載しています。

いかがでしたでしょうか。GPIOを制御出来るサーバー機(今回はRaspberry Pi)を使うことで、簡単にweb経由でリレーを駆動することが出来ました。組込み機器にweb対応をする手段として、Raspberry PiのようなLinuxが動くコンピュータを導入する場面も多いかと思います。こちらにRaspberry Piの紹介と購入先をまとめています。

最後までお読みいただきありがとうございます。

-Web Server, Raspberry Pi