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に返信された文字列(検出時刻)、が表示される。