ブログ

Armadillo-IoTで人感センサーが動体検知した時刻をHerokuに送信してWebブラウザで確認

at_kazutaka.bito
2015年5月8日 16時00分

Armadillo-IoT+Armadillo-IoT 絶縁デジタル入出力/アナログ入力アドオンモジュール DA00で、 マグネットセンサーの接点のオープン/クローズ状態を取得して、Herokuに通知する仕組みを作ってみた。 ここでは、株式会社日本アレフの人感センサーAPX-101を使用する。 この人感センサーは動体を検知すると、赤い光が点灯して警報出力用にパルスを出力する。 Armadillo-IoTで警報出力のパルスの立ち上がりエッジを検出して、検出した時刻をHeroku送信する仕組みを作る。

1.Armadillo-IoT 絶縁デジタル入出力/アナログ入力アドオンモジュールを使用するための準備

1.1.Armadillo-IoT 絶縁デジタル入出力/アナログ入力アドオンモジュールを使用するためのパッチの適用

フォーラムのArmadillo IoTの運用にあたってによると 現時点(2015.5.7)では、このスレッドに添付されているパッチlinux-2.6.26-at25_support-didoad-addon.patch を当てる必要があるので、上記スレッドを参考にパッチを適用する。 これにより、

GPIO名 用途
DO1_CON1 デジタル出力1
DO2_CON1 デジタル出力2
DI1_CON1 デジタル入力1
DI2_CON1 デジタル入力2

というようにデジタル入出力とGPIO名が結び付けられる。

将来的にパッチがなくても上記GPIOディレクトリが生成されるように対応されれば、この手順はとばす。

1.2.デジタル入出力のGPIOの制御にgpioctrlを使えるようにする

Armadillo-IoTでgpioctrlを使うの手順1~4(手順「5.使用するgpioのGPIOクラスディレクトリを追加する」は不要。)で、 Armadillo-IoTでgpioctrlを使えるようにする。 なお、上記のGPIOのDO1_CON1/DO2_CON1/DI1_CON1/DI2_CON1を対象にするため、 「3.gpioctrlのソースコードを編集する」のgpiolib.c、option.cの編集内容は、下記に置き換える。

[atde ~/atmark-dist/vendors/AtmarkTechno/my-iot/gpioctrl]$ gedit gpiolib.c でgpiolib.cをエディタで開いて、 static char *gpio_num2id(unsigned long num) を下記のように変更する。(コメントアウトした箇所はオリジナルの部分)

static char *gpio_num2id(unsigned long num)
{
    switch (num) {
    case GPIO0: return "DO1_CON1";
    case GPIO1: return "DO2_CON1";
    case GPIO2: return "DI1_CON1";
    case GPIO3: return "DI2_CON1";
/*
    case GPIO0: return "CON9_21";
    case GPIO1: return "CON9_22";
    case GPIO2: return "CON9_23";
    case GPIO3: return "CON9_24";
    case GPIO4: return "CON9_25";
    case GPIO5: return "CON9_26";
    case GPIO6: return "CON9_27";
    case GPIO7: return "CON9_28";
    case GPIO8: return "CON9_11";
    case GPIO9: return "CON9_12";
    case GPIO10: return "CON9_13";
    case GPIO11: return "CON9_14";
    case GPIO12: return "CON9_15";
    case GPIO13: return "CON9_16";
    case GPIO14: return "CON9_17";
    case GPIO15: return "CON9_18";
*/
    default:
        return NULL;
    }
}

[atde ~/atmark-dist/vendors/AtmarkTechno/my-iot/gpioctrl]$ gedit option.c でoption.cをエディタで開いて、 struct sub_param com_sub_param[] を下記のように変更する。(コメントアウトした箇所はオリジナルの部分)

struct sub_param com_sub_param[] = {
    { COM_SUB_GPIO0, "DO1_CON1" },
    { COM_SUB_GPIO1, "DO2_CON1" },
    { COM_SUB_GPIO2, "DI1_CON1" },
    { COM_SUB_GPIO3, "DI2_CON1" },
/*
    { COM_SUB_GPIO0, "gpio0" },
    { COM_SUB_GPIO1, "gpio1" },
    { COM_SUB_GPIO2, "gpio2" },
    { COM_SUB_GPIO3, "gpio3" },
    { COM_SUB_GPIO4, "gpio4" },
    { COM_SUB_GPIO5, "gpio5" },
    { COM_SUB_GPIO6, "gpio6" },
    { COM_SUB_GPIO7, "gpio7" },
    { COM_SUB_GPIO8, "gpio8" },
    { COM_SUB_GPIO9, "gpio9" },
    { COM_SUB_GPIO10, "gpio10" },
    { COM_SUB_GPIO11, "gpio11" },
    { COM_SUB_GPIO12, "gpio12" },
    { COM_SUB_GPIO13, "gpio13" },
    { COM_SUB_GPIO14, "gpio14" },
    { COM_SUB_GPIO15, "gpio15" },
*/
    { COM_SUB_ALL  , "all" },
    { COM_SUB_END, "" },
};

上記手順でソースコードを編集後、makeしてイメージを作成して、Armadillo-IoTに書き込む。

2.Armadillo-IoTの絶縁デジタル入出力/アナログ入力アドオンモジュールに人感センサーを接続

まず、人感センサの蓋を外して、Power/ALARMに配線用のコードを付ける。

ここでは、人感センサーのPowerは、Armadillo-IoTから供給することにする。 人感センサーの電源電圧はDC9V-28V必要。 Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル図14.14 電源回路の構成より、 Armadillo-IoTのCON16を使うと12V弱の電源電圧を供給できる。 Armadillo-IoTの CON16の1ピン(12V) CON16の2ピン(GND) を人感センサーのPowerに接続する。 (添付の写真では、CON16の2ピンの代わりに、CON8の2ピン(GND)を使っている)

ここでは、絶縁デジタル入出力/アナログ入力アドオンモジュールをArmadillo-IoTのCON1に接続したものとして説明する。 Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル18.6.3.3. CON2 デジタル入出力インターフェースより、 人感センサーのALARMを絶縁デジタル入出力/アナログ入力アドオンモジュールの端子台のデジタル入力DI1(CON2の5,6ピン)に接続する。 これにより、 DI1_CON1 という名前のGPIOで、人感センサーの警報出力が検出できる。

3.人感センサーの警報出力のパルスを検出できるようにする

人感センサーの警報出力のパルスの立ち上がりエッジを絶縁デジタル入出力/アナログ入力アドオンモジュールのデジタル入力で確認するために、 Armadillo-IoTでgpioctrlを使うの手順「6.gpioctrlを使ってみる」の立ち上がりエッジの例を使う。 DI1_CON1という名前のGPIOを入力で使って、立ち上がりエッジで"interrupted"を標準出力するようにする。 Armadillo-IoTに下記スクリプトを作成する。 (ここでは、detect_motionというファイル名とする)

#!/bin/sh
while :
do
gpioctrl --set=DI1_CON1 --mode=input --type=rising-edge --debounce --handler="echo interrupted"
done

上記スクリプト(detect_motion)に実行権限を付けて実行する。

[armadillo ~]# chmod +x detect_motion
[armadillo ~]# ./detect_motion

人感センサーに赤い光が点灯したとき、"interrupted"という文字が標準出力に表示される。

4.人感センサーの警報出力を検出したら、検出時刻をHerokuに送ってWebブラウザで見る

上記手順3を、人感センサーの警報出力を検出したら、検出した時刻をHerokuに送る、という仕組みを追加する。 Herokuへの送信中はArmadillo-IoTの側面の緑LED(led3)を点灯するようにもする。

まず、 Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るを一通り実行して Armadillo-IoTからHerokuに送信した文字がWebブラウザで見えることを確認する。 (下記文中の"***.herokuapp.com"は自分で作成したHerokuのURLに読み替える。)

Armadillo-IoTに下記スクリプトを作成する。 (ここでは、send_motionというファイル名とする)

#!/bin/sh
VAR1=`date`
while :
do
  gpioctrl --set=DI1_CON1 --mode=input --type=rising-edge --debounce --handler="echo interrupted"
  VAR1=`date`
  echo 1 > /sys/class/leds/led3/brightness
  wget -O- -q --post-data="data=$VAR1" https://***.herokuapp.com/series
  echo 0 > /sys/class/leds/led3/brightness
  sleep 1
done

上記スクリプト(send_motion)に実行権限を付けて実行する。

[armadillo ~]# chmod +x send_motion
[armadillo ~]# ./send_motion

Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信した 人感センサーの警報出力を最後に検出した時刻が表示される。 注意)Webブラウザの表示の更新には再読み込みが必要。 補足)Armadillo-IoTの標準出力には、gpioctrlの出力"interrupted"と Armadillo-IoTからHerokuに送信した文字をWebブラウザで見るのHerokuで動作しているアプリ(app.js)により、 Herokuが受け取った文字列(検出時刻)がArmadillo-IoTに返信された文字列(検出時刻)、が表示される。