ラズベリーパイZERO-WHの監視カメラを動かすための環境構築作業

# はじめに

前々回からQiitaにて監視カメラの記事を投稿しています。
監視カメラをもう一つ構築するので、環境構築についてもすこしまとめてみました。

## 1) 準備するもの

 * Raspberry Pi Zero WH
 * microSD カード(32GB、16GBでもOK)

## 2) 設定する前に必要なもの

設定作業を行う上で必要な周辺機器です。

 * PC（windows or mac) OSのダウンロードやmicroSDカードの作成ほか
 * USB2.0のハブ(USB2.0-microUSB変換アダプタが必要）
 * USB マウス(USBハブに接続)
 * USB キーボード(USBハブに接続)
 * HDMI接続できるモニタ（接続ケーブルが必要。HDMI-miniHDMIケーブルもしくはminiHDMIに変換できるアダプタが必要
 * マイクロUSB電源アダプタ
 * USBのSDカードリーダ（MicroSDカードの場合はSD用のアダプタが必要）。PCに接続します。

# OSのイメージをmicroSDに作成する。

1. microSDカードをWindowsマシンに接続します（SDカードアダプタ経由）。
2. SDカードをフォーマットし、OSイメージをmicroSDに作成します[SDカードフォーマッターでフォーマットする](https://www.fabshop.jp/%E3%80%90step-02%E3%80%91raspberry-pi%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8Bmicrosd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88)を参考に、フォーマット、OSイメージの取得、SDカードへの書き込みまで行います。こちらのサイトではラズベリーパイZEROではないですが、OSイメージ作成ではおおよそ同じです（ラズベリーパイ４や64bit　OSなどが出てきていますが、ZEROでは動作しないので、気を付けてください）。

# ラズベリーパイの起動

準備したものや設定に必要なものをすべて接続します（電源接続は一番最後にします。すべて接続しておかないと、起動時にデバイス確認できないと再起動しないかぎり再認識しない場合があります）。
その後電源接続すると、OSイメージが正常に転送されていれば、黄緑色のLEDが点滅してBootを始めます。すぐにモニタ画面にラズベリーパイのアイコンが表示されます。以降、LinuxのBOOTシーケンスに沿って起動が進みます。ラズベリーパイZEROだと少しかかるでしょうか。起動後はディスクトップの操作ができるようになります。なお、32GBのSDカードを使用しているので、OSはフルバージョンを使用しています。ほかのバージョンの場合は、場合によってはライブラリなどを追加インストールする必要があるかもしれません(確認していません）。

# ユーザの作成
起動後は、ラズベリーパイに共通なユーザ「pi」でログインとなっています。
piユーザはセキュリティの関係で使用しないほうが良いと考えていますので、新しいユーザを作成します(以下、コンソールを開いてコマンド入力(CUI)で進めていきます)。

```
sudo adduser <username> sudo
```

\<username\>は各自で好きな名前をつけます。新しいユーザでインストール作業ができるようにgroupにsudoを付与しています。


# 環境構築

以下、必要なものをインストールしていきます。ラズベリーパイZEROでのインストールにはそれなりの時間がかかります。気長にやってください。

## 1) python3の確認
python3のバージョンを確認します。コマンドがない場合は、python3のインストールを行います。

```
python3 -V
```

## 2) pydriveのインストール

インストール作業前に、最新版の取得を行います。以下のコマンドを実施しても、特に何もインストールすることはないと思いますが、念のため実行してからpydriveをインストールします。実行する前に、1行のみコマンドを入力し、sudoでの実行時にパスワード入力を求められます。1度入力を行えば、しばらくはパスワードの入力を求められないので、以降のコマンドはまとめてコピーして実行しても大丈夫ですが、エラーになった場合のことを考えると、1つづつ行うほうが良いかもしれません。

```
sudo rpi-update
sudo apt update
sudo apt upgrade
sudo pip install --upgrade pip
pip3 install google-api-python-client
sudo pip3 install pydrive
```

* バージョンの確認

```
pip3 list | grep google-api-python-client
pip3 list | grep PyDrive
```

現状では以下のバージョンです。

```
google-api-python-client 1.9.1
PyDrive                  1.3.1
```

## 3) OpenCvのインストール

［RaspberryPiへのOpenCVインストール手順](https://qiita.com/wk_/items/8db529a6b24a955888db)を参考にしています。
実際にインストールしてpythonにてimportした際に、ライブラリ不足のエラーが出たので、再度以下のコマンドでライブラリをインストールすることで対応できました。

```
sudo apt-get install libatlas-base-dev 
sudo apt-get install libjasper-dev 
sudo pip3 install opencv-contrib-python
sudo pip3 install opencv-contrib-python-headless
sudo apt install libhdf5-dev
```

この後、python3を起動しOpneCvをインポートします。

```
python3
>>> import cv2
```

importには少し時間がかかります。この時エラーが出る場合は、[Raspbian Liteでビルド済みのOpenCVパッケージを使うための依存パッケージいろいろ](https://qiita.com/atuyosi/items/5f73baa08c3408f248e8)を参考に不足しているライブラリ等を追加すれば大丈夫と思います。

* インストールしたOpenCvのバージョンは以下の通りです。

```
pip3 list | grep opencv-python
opencv-python            4.1.1.26
```

## 4) GoogleDriveの設定

GoogleDriveの設定にはアカウントの作成から、各種の設定を粉います。
参考にしたのは、[RaspberryPi 3 Model B+でIoT監視カメラをつくる（その２GoogleDriveとLINEの設定）](https://www.souichi.club/raspberrypi/monitoring-camera-system02/)です。同様に監視カメラを作成するテーマで詳しく記載しています。
GoogleDriveにアクセスできている場合は、以下の2つのファイルを持っていくことでアクセスできます。

```
credentials.json
settings.yaml
```

同じアカウントとなるので、保存先のフォルダーを変更する必要があります。保存先のFolder-IDの変更を行う必要があります。以前投稿した、[ラズベリーパイZERO-WHでカメラ画像をGoogleDriveにアップロードする(python+pydrive)](https://qiita.com/ochiai_t/items/ad4e28b08d064a0ac0b2)のFolder-IDを別の場所から取得し記載することになります。

# そのほかの設定

監視カメラとして運用する場合は、ある程度のセキュリティ対策を行う必要があります。

## 1) ユーザアカウントの対応

 [初心者向！Raspberry Pi 最低限のセキュリティ設定【所要時間 30分】](https://qiita.com/mochifuture/items/00ca8cdf74c170e3e6c6)を参考に、ユーザアカウントへの対応は少なくともします。

## 2) WiFiの設定

[RaspberryPiの初回セットアップ手順#無線LAN設定](https://qiita.com/ljourm/items/ee01c2b3d48c9958b9b3#%E7%84%A1%E7%B7%9Alan%E8%A8%AD%E5%AE%9A) を参考に、Wifiの設定を行います。
また、複数の接続先がある場合でも、network={}を続けて記載することができます。
尚、後述のraspi-configでも設定できます（こちらは複数登録はできず、アクセスポイントは1つの設定のみになってしまったと思います）。

## 3) hostnameの変更

raspi-configもしくは、hostnamectlで変更します。

raspi-configはCUIでも使用できるメニュー形式のシステムコンフィグツールです。最初のメニューの2番目にネットワークについての項目があり、選択後の先頭にHostnameの確認・変更メニューとなります。

```
sudo raspi-config
```

コマンドでの変更の場合は、以下のコマンドのみで行います。複数台設置の際には区別できる名前を付与したほうが管理が楽になります。メニュー選択はカーソルキーもしくはタブで移動します。選択した場所でエンターキーを押すとメニューを選択したことになります。

```
hostnamectl set-hostname <新しいホスト名>
```

# 監視カメラシステムの構築

## 1) GoogleDriveへの動作確認

環境の設定ができれば、次に[ラズベリーパイZERO-WHで監視カメラ（動体検知と動画保存）を作成する](https://qiita.com/ochiai_t/items/db7e2393c3a6cb9bb902)の手順を行い、GoogleDriveにファイルを送信できるかを確認します。

## 2) 監視カメラプログラムの動作確認

同様に、[ラズベリーパイZERO-WHでカメラ画像をGoogleDriveにアップロードする(python+pydrive)](https://qiita.com/ochiai_t/items/ad4e28b08d064a0ac0b2)で、プログラムの配置、設定の変更を行い動作を確認します。
基本、新規作成ユーザのカレントディレクトリなどで動かすことを想定しています。

# 起動設定

## 1) サービス設定

起動サービスを設定します。以下のファイルを作成します(ここではautocameraをサービス名としています)。

``` autocamera.service 
[Unit]
Description=autocamera
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/home/<username>
ExecStart=/usr/bin/env /home/<userbname>/autocamera.sh
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target
```

作成したファイルを以下の場所にコピーします。

```
sudo cp autocamera.service /lib/systemd/system/
```

サービスとして確認します。

```
sudo systemctl status autocamera.service 
```
サービスを開始していないので、disabled　となっています。

```
● autocamera.service - autocamera
   Loaded: loaded (/lib/systemd/system/autocamera.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
```

サービスで起動するのは、ホームディレクトリにある以下のシェルファイルとしています。

``` autocamera.sh 
#! /bin/bash
cd /home/<username>
export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1
/usr/bin/python3 ./camOpen.py
```

サービスで起動する各ファイルのパーミッション(実行権）を付与します（サービスはrootユーザで実行するの意で、rootと同じグループであれば、Otherに実行権は不要です）。

```
chmod a+x autocamera.sh camOpen.py googleUploadDir.py
```

ユーザのカレントディレクトリにて、GoogleDriveの設定ファイルなどを置いているので、このようにしています。

2) 起動設定

ラズベリーパイが起動したら、そのままカメラが動作するように設定します。
crontabで、起動時の実行などを設定します。

```
sudo crontab -e -u root
```

一番最後に、以下の行を追加します。

```
@reboot systemctl start autocamera
 1 1 * * * systemctl restart autocamera
 2 1 * * 0 reboot
```
3行分ですが、上からのCrontabの内容について説明します。

* 1行目：起動時に実行するコマンドを記載。autocameraサービスを開始します。
* 2行目：毎夜1時1分にサービスを再起動しています。これで、1日分のログファイルをサーバに送信します。サービスが止まっていても、これで再度実行します。
* 3行目：日曜日の夜2時1分にrebootします。念のためです。

これ以外に、プロセスの監視を行い、プロセスがいなくなったり、通信不良などでゾンビプロセスが出たら再起動するなどの方法が本来の形かと思いますが、念のためのもの程度と考えています。

# おわりに

環境構築を行うときに、構築方法としてまとめながら記載したいと思いましたが、実際には試行錯誤を行っているうちに、何が正しいのかがわからなくなっていて、書くのが止まってしまいました。
進めているときには、インストールしたけどうまくいかないもの、必要ないものなどが多数あったりで、
改めて難しいものと思いました。
今回は、ある程度動くものができたので、再構築の確認を含め順番に行いながら書いています。そのため、いくつか手抜きになっている部分もあります。もしかしたら、漏れなどもあるかもしれません。
さらに作成するときに、更新が必要なら修正や追記を行いたいと思います。