伝説のSpice特別企画 いまさらIOT

[前のページ]  [TOPページ]  [次のページ]

Node Express 自動起動

Youtube.PNG【伝スパ】xbeeIOT_自動起動とワンボタンシャットダウン

このIOTシステムは最終的にコンソールも表示装置もありません。 電源を入れると自動的にNodeプログラムが起動する必要があります。 起動したことを示すLEDもあります。

逆にlinuxでは直接電源を切ることはファイルを壊すことにつながるので出来ません。 システムシャットダウンのスイッチが必要です。 このスイッチは回路図ではxbeeのリセットスイッチに接続されているラインです。 短い時間で押された場合xbeeのリセットになります。 長い時間押されるとシステムシャットダウンになります。 長く押すと、やがてraspberry-piの小さな緑のLEDが点滅します。 そうなったらスイッチを放しても大丈夫です。 プログラム実行中の赤いLEDが消えるまで押し続けても構いません。 最終的にraspberry-piの小さな緑のLEDは消灯します。 その時点でOFFが完了になっています。
電源は入ったままですのでxbeeのLED等は点灯しています。 この状態で安全に電源コードを抜いて完全オフにできます。

次起動するときは新たに電源ケーブルをつなぐと起動しますが、上記で電源コードを抜く前でもxbeeリセットスイッチ(シャットダウンスイッチ)を押すと再起動します。 これはraspberry-piの基本機能ですので設定を何もしなくても機能します。

プログラム実行LEDの点灯

nodeプログラムが実行されるとLEDが点灯する機能はすでに今回のプログラムに入っています。 コンソールからコマンドで起動しても点灯します。

forever インストール

まず forever プログラムを準備します。 パスは作業エリアに入っておきます

cd xbeeIOT/robo
sudo npm install -g forever

グローバルな位置にパッケージをロードします。

起動してみる

一度起動してみましょう

forever start --append -l xbeeIOT.log --minUptime=10000 --spinSleepTime=1000 /home/pi/xbeeIOT/robo/bin/www

forever を停止する

forever を強制停止したいときは起動している forever を確認します。 最初の一つだけなので番号’0’になっていると思います。 listで確認 番号’0’を強制停止です。

forever list
forever stop 0

プログラムの自動起動

プログラムの自動起動はrc.localを使用しますが、その前に長い起動コマンドをスクリプトにします。
rootに戻ってautoxbeeIOT.shファイルを作成します

cd ~
nano autoxbeeIOT.sh

内容は

#!/bin/sh
forever start --append -l xbeeIOT.log --minUptime=10000 --spinSleepTime=1000 /home/pi/xbeeIOT/robo/bin/www

ファイルを閉じたら、そのファイルに実行権限を与えます。

sudo chmod +x autoxbeeIOT.sh

rc.localに登録します。

sudo nano /etc/rc.local

すでにこのファイルはDNSの起動保障のためのコードが入っていますのでその下、一番最後に exit() 文がありますのでその間に書きます。

sudo -u pi /home/pi/autoxbeeIOT.sh

正しく実行されるか確認

sudo /etc/rc.local

これで Raspberry-pi 起動後 rc.local 起動タイミングで autoxbeeIOT.sh が実行され forever が nodeプログラム robo/bin/www を起動するという手順です。

参考
    Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説

シャットダウン処理

スイッチによるシャットダウン処理はpythonで記述します。 手順は起動時にデーモンとしてシャットダウンスイッチを常にモニタして押されたらシャットダウン処理に入るプログラムを作成します。
処理ファイルは /home/pi に shutdownd.py を作ります。

(note)この処理を紹介していますサイトでは gpio readall コマンドを使用しています。 私のところではどこかで apt-get のミスをしたのか wiringpi が削除されていてコマンドがなくなっていました。 そのような方は下記で復旧してください。 gpio readall が動作する方は不要処理です。

sudo apt-get purge wiringpi
sudo apt-get install wiringpi

シャットダウンファイルの新規作成編集から始めます。

参考
    ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)
この資料のgpioポート番号を3番ピンに変更して使用します。 詳しくは参考サイトを見てください。

nano shutdownd.py

ファイルの中身は

#!/usr/bin/python 
# coding:utf-8 
import time
import RPi.GPIO as GPIO
import os

pinnumber=3
GPIO.setmode(GPIO.BCM)

#GPIO3pinを入力モードとし、pull up設定とします 
GPIO.setup(pinnumber,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:
    GPIO.wait_for_edge(pinnumber, GPIO.FALLING)
    sw_counter = 0

    while True:
        sw_status = GPIO.input(pinnumber)
        if sw_status == 0:
            sw_counter = sw_counter + 1
            if sw_counter >= 50:
                print("長押し検知!")
                os.system("sudo shutdown -h now")
                break
        else:
            print("短押し検知")
            break
        time.sleep(0.01)
    print(sw_counter)

実行権限を与えます。

sudo chmod +x shutdownd.py

このデーモンを起動するシステムサービスを作成します。

ファイル shutdownbuttond.service を新しく作成します。

sudo mkdir /usr/lib/systemd/system
sudo nano /usr/lib/systemd/system/shutdownbuttond.service

ファイルの中身は

[Unit]
Description=Shutdown Daemon

[Service]
ExecStart =/home/pi/shutdownd.py
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

そししてこのサービスを有効にします。

sudo systemctl enable shutdownbuttond.service

リブートしないで起動してみる

sudo service shutdownbuttond start

サービスが有効になったか確認

systemctl status shutdownbuttond

これでボタンを長く押すとシャットダウン処理に入ります。

[前のページ]  [TOPページ]  [次のページ]