RaspberryPi 3 Model B+でIoT監視カメラをつくる(その4プログラムの自動起動設定) | そう備忘録

RaspberryPi 3 Model B+でIoT監視カメラをつくる(その4プログラムの自動起動設定)

RaspberryPi(ラズパイ)でIoT監視カメラ

RaspberryPi 3 Model B+とカメラ(Raspberry Pi Camera Module V2)とモーションセンサー(HC-SR501)で動きがあった時だけ録画する監視カメラを作成したときの備忘録の4回目。

1回目はRaspberryPiとカメラ、モーションセンサーとの接続に関するこちらの記事を参照

2回目はGoogleDriveにアクセスする為のGoogle Developersの設定とLINEにメッセージを送信するためのLINE Notifyでのアクセストークンの発行に関する記事

3回目はPythonのプログラムの説明の記事

今回はRaspberryPiのプログラムの起動環境、CLI起動とプログラムの自動起動に関する記事とする。

CLI起動に変更する

監視カメラプログラムを長時間動作させるにあたってGUI(デスクトップ)環境である必要はない。

今までは操作性上、デスクトップ環境で開発・テストを行ってきたが継続稼働させるのであればCLI(Command Line Interface)の方がリソースも消費しないので好ましい。

RaspberryPiのメニューから”RaspberryPiの設定”の”システム”タブでブートをCLIに変更する。

ブートをCLIに変更する

VNCの無効化

またVNC接続も不要なので無効にしておく。

セキュリティ上はSSHも無効にした方が好ましいが、そうすると何らかの変更やrebootをしたい時にRaspberryPiにキーボードとディスプレイを接続しないと操作ができない。

それは流石に面倒なのでSSHは有効にしておいた。

VNCを無効にする

raspi-config

上記はGUI環境からの操作だがCLI起動になった後ではterminalからでも同様の設定変更や元に戻すことができる。

sudo raspi-config

上記のコマンドを入力するとRaspberryPiの設定画面が表示されるので、

”3 Boot Options”を選択する。

boot optionsを選択する

”B1 Desktop/CLI”を選択する。

B1 Desktop/CLIを選択する

”B1 Console”(自動ログインをしない)を選択する。

B1 Consoleを選択する

最初の画面に戻るので”Finish”を選択する。

Finishを選択する

再起動をするかを聞かれるので”はい”を選択する。

はいを選択する

CLI起動の自動ログイン無しに設定される。

監視カメラプログラムの自動起動

自動起動のやり方

電源を入れた時に自動的に今回作成した”SecCamera.py”を起動するようにしたい。

プログラムの自動起動には幾つかの方法がある。

  1. systemdを使用する方法
  2. /etc/rc.localに起動スクリプトを記述する方法
  3. etc/lxsession/LXDE-pi/にautostartファイルを記述する方法

以前にTKinter(Python からGUIプログラムを構築するためのライブラリ)を使ったプログラムを自動起動させようとした時には3.の方法を使った。

なぜなら1、2ではGUI環境が整ってからのプログラムの起動がうまく制御できなかったので。

systemdにてWantedBy=graphical.targetを指定したのだけれども上手く起動できる時と駄目な時があった。 

どなたか良い方法を御存知の方は教えて下さい

しかし今回はGUI環境では無いので1.のsystemdを使うことにした。

以前は2.が主流だったようだが今のOSではsystemdを使う方法が推奨されている模様。

systemdの設定

/etc/systemd/system/配下にsecurity-camera.serviceファイルを作成する。

security-cameraの部分は任意の文字列

sudo vi /etc/systemd/system/security-camera.service
[Unit]
Description = Security Camera
After=network.target

[Service]
ExecStart=/usr/bin/python /opt/security-camera/SecCamera.py
Restart=always

Type=simple

[Install]
WantedBy=multi-user.target

設定可能なパラメータの詳細については別記事にしようと思う。

今回は監視カメラで設定したパラメータを中心に説明する。

Description

説明文

2019/09/16 追記

After

ここで指定したユニットの後に起動される(事前に起動しているべきユニットを指定する)

ネットワークが起動した後にプロセスを起動させたかったのでnetwork.targetを指定した

ExecStart

起動したいプロセスを記述する

Pythonを起動してプログラムをパラメータで渡している

Restart

プロセスが終了した時の再起動の指定

”always”:常に再起動するを指定した

監視カメラプログラムが何らかの理由で終了してしまった時も自動で再起動して欲しいのでalwaysを指定した

ちなみに”no”だと再起動しない

Type

simpleを指定した

simpleはプロセスをフォアグラウンドで起動した場合の指定、バックグラウンドで起動した場合はforkingを指定する

WantedBy

multi-user.targetを指定した

この辺りも詳細は別記事とする

登録状態の確認

ファイルを保存したら以下のコマンドで登録状態を確認する。

systemctl list-unit-files --type=service

一覧にdisableで表示されていればOK。

登録状態の確認

有効化

以下のコマンドで自動起動を有効化する。

sudo systemctl enable security-camera.service

もう一度先程のコマンドでステータスを確認してenableになっていればOK。

enableの確認

その他のコマンド

上記の他に使用可能なコマンド

サービスの自動起動の停止
sudo systemctl disable security-camera.service
サービスの開始
sudo systemctl start security-camera.service
サービスの停止
sudo systemctl stop security-camera.service
ステータスの確認
sudo systemctl status security-camera.service
デーモンのリロード
sudo systemctl daemon-reload

エラーの場合

尚、何らかのエラーで自動起動が有効にならない時のエラーログは以下のファイルを確認してみる。

  • /var/log/syslog
  • /var/log/message

「権限が無い」「スペルを間違えた」等の理由が多い気がする。

次回の記事

今回の記事は以上で終了。

次回は外観(外箱)を作成した時の記事とする。

次回の記事はこちら

動画

2019年9月16日 追記

この記事の内容を動画にしているので参考にして欲しい。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。