Raspberry PIでLED点灯コントロール、Part3 ネット経由(WebIOPi)でコントロール

Raspberry PiのGPIOをLEDにつないで、Webブラウザからコントロールする方法はいくつかありますが、簡単な方法はどうもセキュリティ面で不安が残ります。

数日悩んだ結果、WebIOPiを使うのが一番無難ということで、Raspberry PiにWebIOPiをインストールしてLED点灯コントロールを行ってみます。


まずはWebIOPiをダウンロードしてインストールします。

最新のWebIOPiをwgetでダウンロードします。
WebIOPiのダウンロードリスト

現時点の最新バージョンは0.7.0。

2015年2月28日現在、WebIOPiはRaspberry Pi2には対応していません。Part3 Raspberry Pi2に対応でWebIOPiがPi2に対応することができます。

Raspberry Piから

wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.0.tar.gz/download
tar xvzf download
cd WebIOPi-0.7.0
sudo ./setup.sh
セットアップするのに少し時間がかかります。

ファイヤウォールを変更する
sudo ufw allow 8000

webiopiを起動する
sudo webiopi -d -c /etc/webiopi/config

ブラウザでアクセスする
http://192.168.0.122:8000/

ユーザ名とパスワードを要求される
ユーザ名 webiopi
パスワード raspberry

ざっくり試してみると、
各GPIOのアウトプットとインプットを切り替えることができて、アウトプットに指定したピンをHighとLowに切り替えることができました。

よくわからないのがSerial MonitorとDevices Monitor。

Serial Monitor
Use the browser to play with Serial interfaces configured in WebIOPi.

Devices Monitor
Control and Debug devices and circuits wired to your Pi and configured in WebIOPi.

とりあえず無視する。


このままでは全てのGPIOのピンが変更できてしまうのでwebiopiの設定を変更する。
sudo vim /etc/webiopi/config
[GPIO]
# Initialize following GPIOs with given function and optional value
# This is used during WebIOPi start process
#21 = IN
23 = OUT 0
#24 = OUT 0
#25 = OUT 1

[~GPIO]
# Reset following GPIOs with given function and optional value
# This is used at the end of WebIOPi stop process
#21 = IN
23 = OUT 0
#24 = IN
#25 = OUT 0
#GPIO23をアウトプットで初期値は0で使う予定なので、上記の設定にする。

[REST]
# By default, REST API allows to GET/POST on all GPIOs
# Use gpio-export to limit GPIO available through REST API
#gpio-export = 21, 23, 24, 25
gpio-export = 23
#利用するGPIOを指定する。指定しない場合、全てのGPIOが利用可の状態になる。
#とりあえずパワーLED用のGPIO23だけ使う予定なので、23だけ指定する。

# Uncomment to forbid changing GPIO values
#gpio-post-value = false
#アウトプットをHighかLowに切り替えるかどうかの設定。
#コメントアウトすると切り替えられなくなる。
#通常はコメントアウトのまま。

# Uncomment to forbid changing GPIO functions
#gpio-post-function = false
#アウトプットとインプットを切り替えるかどうかの設定。
#コメントアウトすると切り替えできなくなる。
#普通プログラミングの途中で切り替えることはないので、コメントアウトするべき。

一旦WebIOPiを再起動して確認してみる。
sudo webiopi -d -c /etc/webiopi/config

ブラウザでアクセス
http://192.168.0.122:8000/app/gpio-header

GPIO23だけアウトプットでHighとLowの指定ができる、それ以外は無効な状態になっている。


ここで問題になるのが、WebIOPiのconfigからGPIOを制限した場合、
プログラムからもGPIOをコントロールできなくなるかどうかです。

gpio-post-valueとgpio-post-functionを両方ともfalseして、
ブラウザのボタン(Light On)を押すと、10秒間GPIO23がオンになるプログラムで試してみました。
(10秒オンになったあとは最低10秒はオフにする)

まずはconfigを設定
sudo vim /etc/webiopi/config
[SCRIPTS]
myproject = /home/username/myproject/python/script.py

[HTTP]
doc-root = /home/username/myproject/html

[REST]
gpio-export = 23
gpio-post-value = false
gpio-post-function = false

10秒間GPIO23がオンにして、その後最低10秒間はオフにするPythonプログラム
sudo vim /home/username/myproject/python/script.py
import webiopi
GPIO = webiopi.GPIO
LIGHT = 23 # GPIO pin using BCM numbering
OFFFLAG = 24

# setup function is automatically called at WebIOPi startup
def setup():
    # set the GPIO used by the light to output low
    GPIO.setFunction(LIGHT, GPIO.OUT)
    GPIO.digitalWrite(LIGHT, GPIO.LOW)
    GPIO.setFunction(OFFFLAG, GPIO.OUT)
    GPIO.digitalWrite(OFFFLAG, GPIO.LOW)

@webiopi.macro
def lightOn():
    if (GPIO.digitalRead(LIGHT) == GPIO.LOW and GPIO.digitalRead(OFFFLAG) == GPIO.LOW):
        GPIO.digitalWrite(LIGHT, GPIO.HIGH)
        webiopi.sleep(10)
        GPIO.digitalWrite(LIGHT, GPIO.LOW)
        GPIO.digitalWrite(OFFFLAG, GPIO.HIGH)
        webiopi.sleep(10)
        GPIO.digitalWrite(OFFFLAG, GPIO.LOW)

# destroy function is called at WebIOPi shutdown
def destroy():
    GPIO.digitalWrite(LIGHT, GPIO.LOW)
    GPIO.digitalWrite(OFFFLAG, GPIO.LOW)

WebブラウザからアクセスするためにHTMLファイルを作成
sudo vim /home/username/myproject/html/index.html
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>WebIOPi | Light Control</title>
        <script type="text/javascript" src="/webiopi.js"></script>
        <script type="text/javascript">
        webiopi().ready(function() {
                // Create a "Light" labeled button for GPIO 23
                var lightButton = webiopi().createButton("lightButton", "Light On", function(){
                    webiopi().callMacro("lightOn");
                });

                // Append button to HTML element with ID="controls" using jQuery
                $("#controls").append(lightButton);
        });

        </script>
        <style type="text/css">
                button {
                        display: block;
                        margin: 5px 5px 5px 5px;
                        width: 160px;
                        height: 45px;
                        font-size: 24pt;
                        font-weight: bold;
                        color: white;
                        background-color: Yellow;
                }
        </style>
</head>
<body>
        <div id="controls" align="center"></div>
</body>
</html>

結果、configでGPIOを制限した場合でもPythonプログラムから変更できました。

configでGPIOを制限した場合、Restfulなコントロールは制限されますが、
プログラムからでは制限されていませんでした。


上記のプログラムは10秒点灯のあと10秒消灯します。

ところが、”Light On”ボタンを何度もクリックすると、クリックしただけ、10秒点灯10秒消灯を繰り返してしまいました。

点灯プログラムの一連の動作(10秒点灯10秒消灯)の間に再びクリックすると、そのクリックはそのときに動作するのではなく、一連の動作が完了した後に実行されてしまいます。

タイムスタンプを使うことにしました。
sudo vim /home/username/myproject/python/script.py
import webiopi
import time

GPIO = webiopi.GPIO

LIGHT = 23 # GPIO pin using BCM numbering
time_stamp = time.time() - 20

# setup function is automatically called at WebIOPi startup
def setup():
    # set the GPIO used by the light to output low
    GPIO.setFunction(LIGHT, GPIO.OUT)
    GPIO.digitalWrite(LIGHT, GPIO.LOW)

@webiopi.macro
# loop function is repeatedly called by WebIOPi
def lightOn():
    global time_stamp
    if (time_stamp <= time.time() - 20):
        time_stamp = time.time()
        GPIO.digitalWrite(LIGHT, GPIO.HIGH)
        webiopi.sleep(10)
        GPIO.digitalWrite(LIGHT,GPIO.LOW)

# destroy function is called at WebIOPi shutdown
def destroy():
    GPIO.digitalWrite(LIGHT, GPIO.LOW)


これでクリックを連打しても、
点灯するのは1回だけでになりました。

コメントを残す

メールアドレスが公開されることはありません。