RaspberryPi4 セットアップについて(てんこ盛り版)

立ち上げ手順等の取りまとめメモ
正直まとめておかないとすぐ忘れるのでやばい

# やりたい事
①Opencvによる画像データ収集
②Tensorflow1系を使っての画像判別

大きくこの2つ(細かい部分はもっとあるが…)
目的別にRaspberryPiをセットアップすればOKだが
テスト機として全部入れる
その各種セットアップ方法をメモとして残す

# 機器環境
RaspberryPi4 modelB 8GB
RaspberryPi OS bastar(RaspberryPiImagerにて`RASPBERRY PI OS FULL(32bit)`をセットアップ)
Windows10 home 64bit

# 初回セットアップ
使用microSDは64GBを使用。
microSDのフォーマットについては[SDcardformatter](https://www.sdcard.org/ja/downloads-2/formatter-2/)を使用。
OSの書き込みに関しては[Raspberry Pi Imager](https://www.raspberrypi.org/software/)を使用。
RaspberryPiimagerが出る前は[balenaEtcher](https://www.balena.io/etcher/)を使用していたが
最新版を入れるなら公式版が楽。
各種APPのダウンロード・インストールについては割愛。

## 立ち上げ
OSをインストールしたmicroSDカードをRaspberryPi本体スロットに入れて電源ON

電源入れてしばらくするとデスクトップが立ち上がり、セットアップ案内が出るので
画面に沿ってセットアップを行っていく。

`Set country`⇒`Change Password`⇒`Set Up Screen`⇒`Select WiFi Network`⇒`Enter WiFi Password`⇒`Updata Software`と
アナウンスに従って進めていけば問題なく辿り着けると思われる。
(たまにWiFiのセッティングでバグる)

初回のセットアップが完了したら本番スタート

ターミナルを立ち上げて

```
sudo apt update
sudo apt upgrade -y
sudo apt autoremove
sudo reboot
```
上記を入力して最新にする。(初回の`Software Updata`でも可だが打ち込みしないと気持ち悪いのでいつもやってる)

これで次に進める。

### 機械学習系モジュールのインストール

setuptoolsが40.8.0なので `--upgrade`で41系にする。(tendorboradでエラー出る)

```
sudo apt install python3-dev -y
sudo pip3 install setuptools --upgrade
```

---

numpy opencv用

```
sudo apt install -y libhdf5-dev libqtwebkit4 libqt4-test libatlas-base-dev libjasper-dev
```

---

skimage入れた時点でpandasやmatplotなど大体入る

```
sudo apt-get install python3-skimage
sudo apt-get install python3-sklearn
```

---

tensorflow import時にエラーがでるが無視して良いらしい

```
sudo pip3 install tensorflow==1.14
```

---

keras

```
sudo pip3 install keras==2.2.4
```

---

OpenCVは3系を （2020/06/01時点ではまだ4系はバグ有るらしい）

```
sudo apt-get install python3-opencv
```

---

exfat(HDDのEXFAT形式に対応させる為)

```
sudo apt-get install exfat-fuse
```

---

日本語入力出来ない場合 Mozc

```
sudo apt install fcitx-mozc
```

---

ここまでくれば最低限のセットアップは完了。

他に使いたいモジュールがあれば都度インストールすればOKかと。


# VNC ViewerやSSHの有効化

windows側から接続していたいので設定を行う。
SSH接続を有効にする設定も同じ所にあるので合わせて行うと楽。

画面左上のラズパイマークから
`設定` ⇒ `RaspberryPiの設定`を開く。

インターフェースタブを選択して有効にしたい物を選択する。

カメラやSSH、VNCを`有効`にチェックを入れて`OK`を押す。

![2021-07-07-104648_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/f88cb39b-bc8c-61b9-790d-405747fe806e.png)

そうすれば再起動しますと出るので再起動する。

![2021-07-07-104656_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/429a1b38-92b7-c984-01f1-519301c7575c.png)

再起動したら使える様になる。(右上に`VNC`が表示される。)

![2021-07-07-104816_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/8bd7798e-d7e6-475b-d495-ee190f48a371.png)

windows側でVNCViewerを立ち上げて接続先のIPを入れれば接続できる。
初回はログインpassとか求められるのでセットアップ時に設定した物を入力すればOK

![スクリーンショット (279).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/0fdbf122-4a65-a587-1a90-d28d104d8d28.png)

# 外付けHDDのマウント

画像等を保存する際、microSDに保存せず外付けのUSBメモリ等に保存する(はず)
なので、外付けHDDをマウント及び接続先固定を行う。
今回使用するのはWesternDigital製の[WD Elements SE 2TB](https://shop.westerndigital.com/ja-jp/products/portable-drives/wd-elements-se-usb-3-0-hdd#WDBEPK5000ABK-WESN)を使用する。

##①使用HDDのフォーマット
色々なサイトを参考してめちゃくちゃやり方があったがwindows側に接続して
フォーマットするだけで使用可能になる。
windows側ではNTFS形式でフォーマット
マウント後にext4形式でフォーマットする文献が多いがwindows側で認識出来なくなるのでしない。

##②RaspberryPiにHDDを接続する。
普通に接続するとHDDはデスクトップ上に表示される。
この時HDDは`/media/pi/hdd`にマウントされる。
普通に使用する分にはこれでも問題ないと思うが自動マウント設定を行うので特に気にしない。

##③自動マウントの設定
まずはデバイス状況を確認する為、ターミナルを立ち上げる。
ターミナルに以下を打ち込む。

```
df
```

![2021-07-07-113249_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/31d41d7b-ef69-a5cd-0e44-4fe3937db1f6.png)

マウントしたHDDが表示される。
確認したらアンマウントを行う

```
umount /dev/sda1
```

![2021-07-07-114724_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/6a278b22-f3b6-f3d3-ac5c-79799a6a73c8.png)

`df`で確認数するとアンマウトされているこ事が確認出来る。

---

次に接続されているHDD等のデバイスをマウントするディレクトリを作成する。
接続先としては任意でよいがここでは`mnt`直下に作成する。

```
sudo mkdir /mnt/hdd
sudo chmod 777 /mnt/hdd
```

![2021-07-07-115808_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/ab106654-c6ab-efea-7bd4-b00083c2ed7c.png)

外部からアクセス出来る様に権限を『すべて』にする方が楽です。
(Samba使用時の設定にもあるけどやっておいた方が楽かと)


まずは一通りの準備完了。

次にラズパイ起動時に自動マウントされる様に設定する。

---

ターミナルに以下を打ち込む。
作業性向上のため、２つ立ち上げるとやり易い。

```
sudo blkid
sudo mousepad /etc/fstab
```

![2021-07-07-134759_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/5afe0d6e-10c4-6230-40bb-d755c47f5e44.png)

`sudo blkid`でHDDのPARTUUIDを確認する。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/d52c6ba2-a12f-2e1c-33c6-c42c92e2f069.png)

`sudo mousepad /etc/fstab`で立ち上がったファイルに
`PARTUUID=お使いのHDDのPARTUUID /mnt/ext_hdd ntfs defaults,nofail 0 0`を入力して上書き保存する。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/5dd6a6c9-bdbf-8667-fc4d-429ee93ab6c6.png)

入力して上書き保存したら、再起動を行う。

再起動後に`df`でマウント先が変わっている事を確認する。

![2021-07-07-135903_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/34c897b6-a408-5555-a8dd-8c64786b4851.png)

これで設定したHDDは常に同じ場所にマウントされます。
(本体を交換したら再度行う。)

[参考サイト](https://kowaza.blue/post-181/)

##④sambaの導入
これに関しては特に必須という訳でないが
実験環境下でいちいちメディア経由でデータを抜くのがめんどくさいので
sambaを用いてファイル共有を行う。

### 1.Sambaとは？
---

Sambaとは、UNIX系OSとWindows（Windows NT、Windows 2000系）との間で、
ネットワーク上のファイルやプリンタの共有などを実現するソフトウェア。

要はWindows側からファイルにアクセス出来るってシロモノ。

```
sudo apt-get install samba
又は
sudo apt-get install -y samba
```

インストール中、こんな表示が出るけど【いいえ】でOK
![2021-07-07-141157_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/97f45cb5-9451-9a54-e403-215b5a29cfcb.png)

### 2.共有フォルダの設定
---

今回は前述で設定した外付けHDDを共有化する。

```
sudo nano /etc/samba/smb.conf
```
これでconfファイルを開く。(`vi`でもOK)
開いたファイルに設定を追加する。

```
[pi]
   comment = Welcome to pi Server
   path = /
   browseable = yes
   wriable = yes
   guest ok = yes
   force create mode = 0777
   force directory mode = 0777
   read only = no
   create mask =0777
   directory mask = 0777
```

![2021-07-07-142204_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/e81d180a-e386-c1df-3229-5d598bbbbffe.png)

元からある設定の下(赤線部)に追加する。
今回はテストなので誰でもアクセス可能にしているが、ニーズ合わせて設定する。

![2021-07-07-143144_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/730e08bc-6a40-3405-7568-35bab22db8a0.png)

入力はこんな感じ

### 3.Sambaユーザーパスワード設定
---

```
sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.
```

パスワードに関してはRaspberryPiをセットアップした際に設定した物と合わせてますが
こちらも任意です。

設定が完了したら

```
sudo service smbd restart
```

上記でSambaを再起動してOKとなります。

### 4.Sambaへのアクセス
---

Windows側からRaspberryPiにアクセス。
ショートカットを作成し、RaspberryPi側のIPアドレスを入力する(`ifconfig`で確認)

初回接続時はパスワード入力を求められるので設定したパスワードを入力する。

![スクリーンショット (281).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/99995879-68af-6454-980c-ef474ff56d8c.png)

確認出来たら、適当なファイルでも突っ込んで
RaspberryPi側で見れるか確認して問題がなければOK

#Visual Studio Codeのセットアップ
こちらも必須ではなし。
Windows側でVScodeを使用してコーディングしているので使用感を合わせるためにインストールする。
RaspberryPiデフォルトの`Thonny`で問題がないのであれば特に必要では無し。

```
sudo apt update
sudo apt install -y code
```

上記で終了！

正式にRaspberryPi(ARM)に対応したのでこれでOK

`メニュー` ⇒ `プログラミング` ⇒ `Visual Studio Code`
又は
ターミナルに`code`入力すれば立ち上がります。

拡張機能設定に関してはPythonがメインとなるので
・Python
・Japanese Language Pack for Visual Studio Code(純日本人なんで)
・MagicPython
・Pylance
・Python Extension Pack

これくらいです。(自分のWindows環境と合わせた)

詳細等はネットにいくらでも転がっているので好みに応じてです。

# 画面スリープの無効
デフォルトだとすぐにスリープに入るので無効にしてみる。

```
sudo nano /etc/xdg/lxsession/LXDE/autostart
```

開いたファイルの末尾に以下を追加

```
@xset s off
@xset s noblank
@xset -dpms
```

![2021-07-07-163409_1920x1080_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/a24d341a-2a07-df22-fd00-fb0dde9f99c9.png)

こんな感じ

追加したら上書き保存する。

編集が終わったら

```
sudo nano /etc/lightdm/lightdm.conf
```

ファイルを開き、開いたファイルの末尾に

```
[SeatDefaults]
xserver-command=X -s 0 -dpms
```

上記を追加する。

編集後、`sudo reboot`で再起動する。

これでスリープ無効となります。

[参考サイト](https://rikoubou.hatenablog.com/entry/2020/06/11/133716)

# プログラムオートスタート
電源投入で自動的にプログラムを走らせる。

方法は色々ある

参考として確認したのは以下の所
[超参考サイト](https://qiita.com/karaage0703/items/ed18f318a1775b28eab4)

いつもお世話になっております。

今回はその中の`autostart`を実施。

## autostart設定(Raspbian Buster以降)
以下コマンドを実行して、autostartファイルの雛形を、
ホームディレクトリのコンフィグにコピーする。

```
$ mkdir -p ~/.config/lxsession/LXDE-pi
$ cp /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/
```

`~/.config/lxsession/LXDE-pi/autostart`ファイルに実行したいコマンド名を追記する。


![48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/12dad778-5827-6594-df1b-887547c8ca47.png)

↑にファイルがいます。
(隠しファイル表示しないと見えません。)

ファイルに実行したいコマンドを追記する。

![49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/f79f6d51-6d8d-524f-3c26-4807a38c00f8.png)

↑の赤枠の様に追記してますが色々と失敗した挙句の表記です。

今回テストとしてOpenCVでの画像撮影プログラムを作成。
ちなみに

```python:cap_get.py
import os
import sys
import cv2
import numpy as np
from datetime import datetime

save_path = '/mnt/hdd/cap_data'
save_name = 'Picture'
ext_name = '.png'

os.makedirs(save_path, exist_ok=True)
main_path = os.path.join(save_path, save_name)

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 30)

n = 0

while True:
    path, dirs, files = next(os.walk(save_path))
    file_count = len(files)
    n = file_count
    ret, frame = cap.raed()
    cv2.imshow("Picture", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('o'):
        frame2 = cv2.resize(frame, dsize=(224,224))
        cv2.imwrite((main_path + '_' + str(n) + ext_name), frame2)
        n += 1
        print('Picture Save OK!', str(n), '枚目')

    if key == ord('s'):
        print('exit')
        break

    elif n == 500:
        print('Over Capacity')
        break

cap.release()
cv2.destroyAllWindows()
```


とりあえずキーボード`O`を押したらマウントしたHDDに画像を保存して、
windows側から抜き出せるように
適当に作った物です。(モジュールも使わないものも入れてます。)

`.sh`ファイルには

```start.sh
#!/usr/bin/sh
python3 /home/pi/Desktop/Program_files/Cap_get/cap_get.py
```
と記入しとります。

`reboot`で再起動したら問題なく立ち上がりました。

![54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/96690679-6806-531e-8e65-8f9408456dde.png)

やってみて比較的やり易かったのはこれでした。

# バックアップについて
調べたら殆どがWindows機に`Win32 Disk Imager`をインストールしてやる方法だったのでやってみる。

[参考サイト](https://aquarius-train.hatenablog.com/entry/Raspberry_Pi%28%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%29%E3%81%AEOS%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97_%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

## Win32 Disk Imager
ダウンロード・インストールは割愛
[公式サイト](https://ja.osdn.net/projects/sfnet_win32diskimager/releases/)

多分他のサイトを見た方が分かりやすいはず

## バックアップを取る
RaspberryPiをシャットダウンして使用しているmicroSDを抜く
カードリーダー等をWindows機の接続してmicroSDを差す。

`Win32 Disk Imager`を起動する。
![スクリーンショット (285).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/086126f9-f3e0-442c-487d-e3f83cc84e10.png)

`Device` バックアップを取るmicroSDを差したドライブを選択する。
`Imaga File` 保存先を指定する。
今回、`RaspberryPi4_Backup.img`を先に作っておきました。(新規ビットマップ作成⇒名称変更)

両方セットすると`Read`が選択可能になるので問題がなければクリックする。

自分の環境下では大体14~15分位でイメージファイルが完成しました。

注意点としてはこのやり方はmicroSDサイズをフルで取るので
書き込みには同じ容量以上は必要となる事。
(今回は64GBをバックアップ)

## イメージファイルを書き込む
バックアップを行ったイメージファイルを書き込むmicroSDは事前に
`SDcardformatte`を使って先にフォーマットしておく。

![スクリーンショット (287).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/90acea85-7ab5-0c5f-4017-82a20315e00e.png)

フォーマット済みのmicroSDを差し、認識したドライブを選択する。
次に書き込むイメージファイルを選択する。

両方セットすると`Write`が選択可能になるので問題がなければクリックする。

自分の環境下では大体20分位で書き込みが完了しました。

とりあえずバックアップから起動しても取る前と同じ挙動だったので
使った感じ問題ないと思います。

# IPの固定について
ネットワークの確認については

```
ifconfig
```

これでOK

`eth0`が優先、`wlan0`が無線となります。
どちらかを接続していればIPアドレスが表示されると思います。

設定ファイルを開く

```
sudo nano /etc/dhcpcd.conf
```

開いたファイルの末尾に以下を追記する。(数字は適当です。)

```
interface wlan0
static ip_address=192.168.120.112/24
static routers=192.168.120.1
static domain_name_servers=192.168.120.1
```

![343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/2b5a8eca-c960-1bbb-5401-f17dbb6fabb4.png)

上書き保存後、再起動するとIPが固定されています。

# まとめ
最低限使える様にする方法は纏めれたかと
他にもっといいやり方があれば、試した上で修正予定