見出し画像

Raspberry Pi Zero W を使って畑(ベランダ菜園)の状態を定期撮影する

2024/06/29 記事の追記完了しました


環境構築

1 ハードウェア環境

  • Raspberrypi Zero WH(以降は Pi Zero と記載)

  • Micro SDカード(今回は San Disc Urtra 32GB HC を使用)

  • SDカードリーダー(Micro SDカードが挿せるもの)

  • picamera v2

  • Witty Pi 3 Mini(電源管理用) ※記事が長くなってしまったので電源管理は別記事に移動します。記事作成次第リンク記載します。

  • 乾電池式モバイルバッテリー(USB出力)※Pi Zeroは電圧 3.3V くらいまでは動作するようです。電圧が 3.3V を下回らないように注意。推奨は5V。今回は単三電池4本のものを使用

  • USB to Micro USB ケーブル

  • 乾電池(乾電池式モバイルバッテリーに合わせて4本)

  • 初期設定用PC(今回は MacBookPro を使用。以降は PC と記載)

2 ソフトウェア環境

  • WiFi (今回は家庭用インターネット回線を使用)

  • Raspberry Pi Imager


Raspberry pi Imager の準備

  1. Raspberry Pi Imager の公式ダウンロードページを開く

  2. "Download for XXX"(ご自身のPC環境に合ったもの)をクリックし、インストーラーをダウンロード

  3. ダウンロードしたインストーラーをダブルクリックし、画面の指示にしたがってインストールを完了させる

  4. インストールが完了したらRasoberri Pi Imagerを起動


Raspberry Pi OS イメージの書き込み

1.OSイメージを書き込む`Micro SDカード`をSDカードリーダーに挿し、PCに接続(bootfsがマウントされることを確認)
2.Raspberry Pi Imagerの`デバイスを選択`をクリック
3.Raspberry Pi Zero を選択
4.OSを選択をクリック
5.Raspberry Pi OS (other)を選択 > Raspberry Pi OS Lite (32-bit)をクリック(A Port of Debian Bookworm with no desktop environmentと説明書きがあるOS)
※Pi Zeroは64-bitに対応していないため注意。64-bitを選択してしまうと起動時にbootが始まりません。
6.ストレージを選択をクリック
7.OSイメージを焼くSDカードを選択

8.次へをクリック
9.Use OS Customization 画面で`設定を編集する`をクリック

10.一般タブをクリック

11.ホスト名にチェックを入れ任意のホスト名を入力(後続処理でIPアドレスを使用せずに、ここで設定したホスト名で ssh 接続できる)
12.`ユーザ名とパスワードを設定する`にチェックを入れ`ユーザ名``パスワード`を入力(後続処理で ssh 接続する際に使用)
13.WiFiを設定するにチェックを入れ使用するSSID、WiFiパスワードを入力。
※Pi Zero は 5GHz 周波数帯を認識できません。2.4GHz のSSIDで設定してください。
次に、日本国内で使用するWiFiであればWiFiを使う国JPを選択
14.ロケールを設定するにチェックを入れ任意のタイムゾーン、キーボードレイアウトを選択
15.`サービス`タブをクリック

16.SSHを有効化するにチェックを入れ任意の認証方法を選択する
17.オプションタブをクリック

18.終わったときにメディアを取り出すのチェックを外す
19.保存をクリック
20.Use OS Customization 画面に戻るので`はい`をクリック
21.警告画面が表示されるのではいをクリック

22.OSイメージの書き込みが始まるので完了するまで待つ(5分ほどでは終わる)
23.書き込み終了メッセージが表示されたら続けるをクリック

24.bootfs/config.txt ファイルを開き[all]以下に dtoverlay=dwc2 を追記しファイルを保存

...
[all]
+ dtoverlay=dwc2

25.cmdline.txt ファイルを開き rootwait quiet の間に modules-load=dwc2,g_ether を追記しファイルを保存

... rootwait modules-load=dwc2,g_ether quiet ...

26.bootfs のマウントを解除しSDカードリーダーから Micro SDカード を取り出す


Pi Zero の設定

以下の設定を行います

  • ネットワーク設定(PC側から Pi Zero を操作するため)

    • WiFi:無線接続で操作できるようにする

    • 有線接続用設定:WiFiを介さずに USBケーブルで有線接続して操作できるようにする(USB-OTG)

  • picamera v2 の設定:Pi Zero 単体では画像を撮影するためのカメラがないので Camera モジュールを接続して使えるようにする

  • Witty Pi 3 Mini の設定:Pi Zero は省電力な端末ですが、常時電源ONだと単3電池 4本でも1日持たない。必要な時(画像撮影時)のみ電源ONにできるように、電源管理モジュール接続し省電力化する

Pi Zero はメモリが少なく、ディスプレイを接続してのGUI操作に不向きなため、今回は全てターミナルからの操作で設定します。
順番に行っていきます。

Pi Zero の起動&初回接続

  1. SDカードを Pi Zero に指す

  2. Pi Zero の内側のMicro USBとPCのUSBをケーブルで接続する。(Pi Zero には Micro USB が2つあり、有線接続用の設定を行うためには内側のUSBコネクタへの接続が必要です)
    Raspberry Pi Zero の電源がONになり初回起動が始まるので、5分ほど待つ。
    PC側は "Pi Zero の設定 No13" で設定した SSID の WiFi に繋いでターミナルで sudo watch arp-scan -l を実行し Raspberry Pi Foundation が表示されるまで待つ
    以下のようにIPアドレスMACアドレスが表示されます。

192.168.0.2     aa:bb:cc:dd:ee:ff       Apple, Inc.
192.168.0.3     a1:b2:c3:e4:d5:e6       (Unknown: locally administered)
192.168.0.4    g0:f0:e0:d0:c0:b0       Intel Corporate
192.168.0.5    b8:27:eb:66:e5:6f       Raspberry Pi Foundation

3.Raspberry Pi Foundation の左に表示されるIPアドレスをコピーする(上記の例だと"192.168.0.5"
4.PC側のターミナルで`ssh <Pi Zero の設定 No12で設定したユーザ名>@<コピーしたIPアドレス>`を実行し`Raspberry Pi Zero`にssh接続。
(ここまでの実行例だと piuser@192.168.0.5 となります)
以下のような接続確認の表示が出る場合は yes と入力し Enter で続けます

$ ssh piuser@192.168.0.5
The authenticity of host '192.168.0.5' can't be established.
ED25519 key fingerprint is SHA256:*****************************.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

"Pi Zero の設定 No16”でパスワードを設定した場合は、パスワードの入力を求められるので、入力し Enter で続けます。

Pi Zero のShellに接続します。もし、上記の手順でRaspberry Pi Zero のShellに接続できない場合は、以下の点を中心に、手順に誤りが無いか確認してみてください。
① 手順"Raspberry Pi OS イメージの書き込み No5"で32-bitのOSを選択しか。64-bitだと Pi Zero が認識できないので、電源を入れてもbootが始まらず、PC側でsudo watch arp-scan -l を実行しても Raspberry Pi Foundation は表示されません。
② 手順"Raspberry Pi OS イメージの書き込み No13"で 2.4GHz 周波数帯のSSID、WiFiパスワードを入力しているか。Pi Zero は5GHz 周波数帯のWiFiを認識できません。そのため、PC側でsudo watch arp-scan -l を実行しても Raspberry Pi Foundation は表示されません。
③手順"初回起動&ネットワーク設定 No4"で実行したsshコマンドの@前後の文字列が正しいか。@より前がユーザ名、@より後が接続先になります。ここの指定が誤っていると、ログインユーザ名、接続先が認識できずにssh コマンドが失敗します。
以降のコマンド実行は接続したPi Zero 側のターミナルでの実行になります。

5.以下のコマンドで OS の確認。(最新の OS の bookworm であることが確認できます。)

$ cat /etc/os-release 
# 以下のようにOS 情報が出力される
# PRETTY_NAME="Raspbian GNU/Linux 12 (bookworm)"
# NAME="Raspbian GNU/Linux"
# VERSION_ID="12"
# VERSION="12 (bookworm)"
# VERSION_CODENAME=bookworm
# ID=raspbian
# ID_LIKE=debian
# HOME_URL="http://www.raspbian.org/"
# SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
# BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

USB接続用の設定

1.ファイルの編集で vim を使用します。
デフォルトのままだとカーソル操作が"A, B, C"といった入力操作として認識されてしまうので、以下の設定を行い vim で正しくカーソル操作ができるようにします。

# echo "set nocompatible" > ~/.vimrc
# 設定を読み込む 再起動後はこの操作は不要になります。
source ~/.vimrc

2.有線接続用の設定を行っていきます。以下のコマンドを実行しNetWorkManagerの設定画面を起動する。

$ sudo nmtui

Edit a connection > <Add> > Ethernet の順に選択し、Ethernet接続新規作成画面を起動する。以下内容で設定する。

  • プロファイル名 : usb0

  • デバイス : usb0

  • Ethernet : デフォルト設定のまま

  • 802.1X Security : デフォルト設定のまま

  • IPv4 設定 : <Link Local>

  • IPv6 設定 : <Ignore>

  • 自動的に接続する : チェックをつける(デフォルト)

  • 全ユーザに使用可能 : チェックをつける(デフォルト)

<OK>を選択しEnterNetWorkManagerの設定画面が閉じます)
3. 設定画面から設定できない項目をコマンド実行で編集します。

$ sudo nmcli con mod usb0 connection.autoconnect-priority 0

4.USB接続のルールを作成します

$ udevadm info /sys/class/net/usb0 | grep ID_PATH=
# 出力された`platform~.usb`の文字列をコピー
$ sudo vi /etc/udev/rules.d/85-usb-otg.rules
# 以下の内容を1行で記述する。<コピーした`platform~.usb`の文字列>部分は書き換えること。
SUBSYSTEM=="net", ACTION=="add|change|move", ENV{DEVTYPE}=="gadget",ENV{ID_PATH}=="<コピーした`platform~.usb`の文字列>", ENV{NM_UNMANAGED}=""
# Escape & :wq & Enter (保存してファイル編集を終了)

再起動時に上記のファイルが読み込まれ、USB接続が有効になります。
再起動の前に他にも初期設定を行っておきます。

WiFiネットワーク接続を追加・削除したい場合

Raspberry Pi Imager で設定したWiFiは初期設定で NetworkManager"preconfigured" という connection名で設定されています。
WiFiで新しいSSIDに接続したい場合や、設定されている接続を削除したい場合は以下の手順で接続・削除できます。

新しいWiFiの接続設定

1.WiFi接続情報を作成

$ CON_NAME="任意の接続名"
$ SSID="接続する WiFi の SSID " # 2.4GHz周波数帯のみ接続可能
$ PSK="SSIDのパスワード"

$ sudo nmcli connection add con-name $CON_NAME \
type wifi \
ifname wlan0 \
connection.autoconnect yes \
wifi.mode infrastructure \
wifi.ssid $SSID \
802-11-wireless-security.auth-alg open \
802-11-wireless-security.key-mgmt wpa-psk \
802-11-wireless-security.psk $PSK \
ipv4.method auto \
ipv4.never-default no \
ipv6.method disabled

2.接続情報を再読み込み

$ sudo nmcli c reload

3.接続を有効化

$ sudo nmcli c up $CON_NAME

接続に成功すると"successfully" が表示されます

すでに接続済みのネットワークを削除する

必ず削除対象のネットワーク以外に Pi Zero に接続する方法を準備してから行ってください。例えば "USB接続用の設定" を行って、USB経由の接続で Pi Zero に ssh 接続した後に行うなど。必ず1つ以上 Pi Zero に接続する手段を残しておかないと Pi Zero が文鎮化してしまいます。

例として初期設定のWiFi接続情報"preconfigured"を削除していきます。
1.接続情報を無効化

$ sudo nmcli c down preconfigured

2.接続情報の削除

$ sudo nmcli c delete preconfigured

削除に成功すると"successfully" が表示されます

Swap領域の拡張

Pi Zero はメモリが少ないためパッケージの upgrade でハングしてしまうことがあるようです。Swap領域を拡張しておくことで回避します。

swap領域の確認

$ sudo free -h
               total        used        free      shared  buff/cache   available
Mem:           427Mi       103Mi       114Mi       960Ki       258Mi       324Mi
Swap:           99Mi          0B        99Mi

設定ファイルの編集

$ sudo vi /etc/dphys-swapfile
# CONF_SWAPSIZE=100 # <- コメントアウト
CONF_SWAPSIZE=2048 # <- 行追加 (2GB)

# Escape & :wq & Enter (保存してファイル編集を終了)

dphys-swapfile サービスを再起動する

$ sudo service dphys-swapfile restart

再度swap領域の確認。Swapの行が "2.0Gi" になっていることを確認

$ sudo free -h
               total        used        free      shared  buff/cache   available
Mem:           427Mi       103Mi       113Mi       960Ki       259Mi       324Mi
Swap:          2.0Gi          0B       2.0Gi

パッケージの最新化

1.パッケージリストの最新化

$ sudo apt update
# 大量の出力が出ますが完了までしばらく待機

以下のようなWarningが表示される場合があります。

W: http://raspbian.raspberrypi.com/raspbian/dists/bookworm/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

対処していきます。

$ sudo apt-key list | grep -A4 "trusted.gpg$"
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2012-04-01 [SC]
      A0DA 38D0 D76E 8B5D 6388  7281 9165 938D 90FD DD2E
uid           [ unknown] Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <mpthompson@gmail.com>

pubの次の行の後ろから8文字分を繋げた文字列を使って以下のコマンドを実行。上記の実行結果によって 90FDDD2E 部分を置き換えてください。

$ sudo apt-key export 90FDDD2E | sudo gpg --dearmor -o /tmp/raspi.gpg
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

$ file /tmp/raspi.gpg
/tmp/raspi.gpg: OpenPGP Public Key Version 4, Created Sun Apr  1 21:02:33 2012, RSA (Encrypt or Sign, 2048 bits); User ID; Signature; OpenPGP Certificate

$ sudo apt-key del 90FDDD2E
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
OK

$ sudo mv /tmp/raspi.gpg /etc/apt/trusted.gpg.d/

2.インストール済みパッケージの更新

$ sudo apt full-upgrade -y

以上で初期設定は完了です。
以下のコマンドでシャットダウンし続きの設定を行っていきます。

sudo shutdown -h now

Pi ZeroのLEDがしばらく点滅して消えます。消えたら電源を抜いてOKです。


picamera v2の設定

最新の Raspbian GNU/Linux 12 (bookworm) は デフォルトで rpicam-* コマンドが使えるようになっています。コマンドの詳細をご覧になりたい方は公式ページを確認してください。

1.電源OFFの状態で picamera v2 を Pi Zero に接続したら、電源を投入し、PC側から ssh で Pi Zero のShellに接続します。(picamera の接続は向きがあるので注意)

2.Pi Zero が camera を認識できているか確認するには以下のコマンドを実行します。
(ディスプレイが接続されている場合、5秒間カメラに写っている映像をプレビュー表示するコマンドです)

$ rpicam-hello
# 以下のような大量のログが出力されます
[0:16:40.618310977] [742]  INFO Camera camera_manager.cpp:313 libcamera v0.3.0+65-6ddd79b5
[0:16:40.844905847] [747]  WARN RPiSdn sdn.cpp:40 Using legacy SDN tuning - please consider moving SDN inside rpi.denoise
[0:16:40.860663769] [747]  WARN RPI vc4.cpp:392 Mismatch between Unicam and CamHelper for embedded data usage!
[0:16:40.866249741] [747]  INFO RPI vc4.cpp:446 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media0
[0:16:40.868080732] [747]  INFO RPI pipeline_base.cpp:1104 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
Preview window unavailable
Mode selection for 1640:1232:12:P
    SRGGB10_CSI2P,640x480/0 - Score: 4504.81
    SRGGB10_CSI2P,1640x1232/0 - Score: 1000
    SRGGB10_CSI2P,1920x1080/0 - Score: 1541.48
    SRGGB10_CSI2P,3280x2464/0 - Score: 1718
    SRGGB8,640x480/0 - Score: 5504.81
    SRGGB8,1640x1232/0 - Score: 2000
    SRGGB8,1920x1080/0 - Score: 2541.48
    SRGGB8,3280x2464/0 - Score: 2718

picamera を接続していない状態で rpicam-hello コマンドを実行すると エラーメッセージ no cameras available が表示されます。

$ rpicam-hello
[0:01:59.236228351] [617]  INFO Camera camera_manager.cpp:313 libcamera v0.3.0+65-6ddd79b5
Preview window unavailable
ERROR: *** no cameras available ***

picamera を接続しているにもかかわらず、このエラーが表示される場合は、camera をうまく認識できていないので、1度Pi Zeroの電源をOFFにして、再度picameraを接続し直してみてください。

3.続いて、rpicam-jpegコマンドを使って camera に写っている映像をjpeg ファイルとして保存します。
少し強引ですが、応急的に窓際にこのようにPi Zeroを設置しました。(定期撮影の際にはちゃんと固定設置します)


rpicam-jpegコマンドはデフォルトだとプレビュー ウィンドウを 5秒間 表示した後に画像を保存します。
今回はディスプレイを接続していないので-n 引数をつけることでプレビュー表示を省略します。

$ rpicam-jpeg -n --output test.jpg

2秒ほど時間がかかりますが、画像が保存されます。ls コマンドで test.jpg が作成されていることを確認できます。

$ ls
test.jpg

3.Pi Zeroにディスプレイを接続していないので、そのままだと画像を開いて見ることができません。
PC側にファイルをコピーして確認してみます。
PC側のターミナルで以下のコマンドを実行してダウンロードフォルダに test.jpgをコピーします。
piuserraspberrypi.local の部分は、自身で設定したユーザ名、ホスト名に置き換えて実行してください。(ホストPCがWindowsの場合は ~/Downloads/test.jpg も %USERPROFILE%\ Downloads\test.jpg に置き換える)

$ scp piuser@raspberrypi.local:/home/piuser/test.jpg ~/Downloads/test.jpg

sshでパスワードを使用してPi Zeroに接続している場合は、パスワード入力を求められるので入力しEnterを押下する。
ダウンロードフォルダに test.jpg がコピーされているので開いて見ることができます。

撮影できましたが、逆さまですw
rpicam-jpegコマンドの実行時に--vflip引数をつけると上下を反転して画像を保存できます。

$ rpicam-jpeg -n --output test.jpg --vflip

上下を反転したことで、左右も逆になってしまったので、こちらも調整します。
--hflip引数で左右反転できます。

$ rpicam-jpeg -n --output test.jpg --vflip --hflip

左右反転して画像を保存できました。

--rotation <回転角度を整数で指定> 引数でも画像を回転できます。(整数部分は 0-180の間の整数のみ受け付けます)
180度回転して保存します。

$ rpicam-jpeg -n --output test.jpg --rotation 180

正しい位置で保存できました。
もし、Pi Zeroを斜めにしか設置できないなどの制限がある場合は--rotation引数で角度調整を行うと良いです。

rpicam-jpegコマンドはデフォルトだと画像サイズが1.4MBほどになるので、解像度を調整して撮影します。また、合わせて撮影範囲の調整もします。横サイズは --width <intピクセル> 縦サイズは --height <intピクセル> で調整できます。
我が家のベランダに合わせて調整してみます。

$ rpicam-jpeg -n --output test.jpg --rotation 180 --width 2816 --height 1280

植物たちが良い感じに写って、余分に写っていた空も削れました。画像のサイズも839 KBに抑えることができました。

Witty Pi 3 Mini(電源管理)の設定

別記事にします

いいなと思ったら応援しよう!