↓ メインコンテンツへスキップ

もっと、思い出をePaper に映そう!

·2877 文字·6 分
わて
著者
わて

作ったもの
#

以前の記事でePaper に写真を表示できるようにしました。

当時はローカルから写真をランダムから選ぶ仕組みだったのですが、今回はNAS 越しに写真が選ばるようにし、投影される写真の種類を一気に増やしたいと思います。

NAS もラズパイと外付けSSD で自作します。そのNAS にePaper で表示したい写真の抜粋ディレクトリを作り、Samba で公開します。

さらに、それをePaper を制御するラズパイ(ラズパイ zero)でマウントしランダムに抽出してePaper に移すというものです。

※ガバガバ設定のNAS で良ければ別用途で作成したものもあるので参考にどうぞ、 [参考]。

 +-----------+           +----------------+           +--------------+
 |           |           |                |  display  |              |
 |           |           |     python  ---+-----------+->  image     |
 |           |  pick up  |       ↑        |           |              |
 |  images --+-----------+-->  shell      |           |              |
 |           |           |                |           |              |
 |           |           |                |           |              |
 |           |   Samba   |                |           |              |
 +--- DIR ---+ ----------+-->  mounot  ---+           +--------------+
 
 [==  NAS  ==]           [== raspi zero ==]           [==  ePaper  ==]

なぜNAS からの共有?
#

思い出が増えていくほど、写真も増えていきます。そして、その写真はNAS に保管されます。それと同時にePaper に表示したい写真も、ちょっとずつ増えて行くはずです。

ただ、NAS とePaper 動作用のラズパイの2箇所に同じ写真を保存しておくのがちょっと面倒です。

なので、NAS 写真からePaper に映したい写真だけ抜粋して、それをSamba で共有するようにしたいと思います。そうすれば保存される写真はNAS だけに置いておきながらePaper 投影用にも共有されます。

抜粋するときに便利なのがシンボリックリンクです。

シンボリックリンクとは、ショートカットみたいなもので、実態はないが、参照先を記録したファイルのことです。容量も圧迫せずスマートに管理ができます。

Samba で共有するディレクトリもシンボリックリンクを集めたものとします。

 +----------------------------------+
 |  +----------+                    |
 |  |          |     +-----------+  |
 |  |  image   |     |           |  |  
 |  |  image  =========  s.link  |  |
 |  |  image  =========  s.link  |  |     
 |  |  image   |     |           |  |   Samba
 |  |          |     +- pickups -+--+------------> 
 |  +- images -+                    |  
 +----------------------------------+
 
            [==  NAS  ==]

正直なところ、筆者はシンボリックリンクの存在意義がよくわからなかったのですが、必要に駆られてそのありがたみを知りました。

登場人物と作る手順
#

この作業では2種類のラズパイが登場するので先に名前を付けときます。

  • ラズパイ NAS : NAS を構築したラズパイ(ラズパイ4)
  • ラズパイ zero : ePaper 表示用のラズパイ(ラズパイ zero WH)

実装手順はこんな感じです ↓

  1. ラズパイ NAS にてSamba の設定
  2. ラズパイ zero にてSamba で公開されたディレクトリをマウント
  3. そのディレクトリから写真をランダムに選択するShell を実装
  4. それを ePaper に投影

ラズパイ NAS の詳細
#

  • ラズパイ4(メモリ 4GB モデル)
  • 外付けSSD (HD-PCG2.0U3-GBA) ファイル形式 → exFAT
~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo

ラズパイ zero の詳細
#

  • ラズパイ zero WH
~$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 13 (trixie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.4
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"

Samba の設定
#

ラズパイ NAS にて、Samba の設定します。

  1. インストール
  2. 公開ディレクトリの作成とその所有者
  3. Samba の公開設定

インストール
#

まずは、インストールから↓

sudo apt install -y Samba

公開ディレクトリとその所有者
#

Samba で公開するため兼数ある写真を抜粋するためのディレクトリの設定をします。

パーミッションはフルアクセスとします。

このユーザーはSamba でのみ使用し、ログインの必要がないので以下のように作成します。また、そのユーザーをディレクトリの所有者にし、Samba 専用のパスワードも設定します。

sudo mkdir -p /smb/share/pickups
# -p: 途中のディレクトリも無ければ作る

sudo chmod -R 777 /smb/share/pickups
# -R: 中身のファイルとかディレクトリも全部まとめて操作

sudo useradd -M -s /sbin/nologin share
# -M: ホームディレクトリを作らない
# -s: このユーザーにログインしたときのデフォルトのログインシェルを /sbin/nologin にする(ログインを拒否する)

sudo chown -R share:share /smb/share/pickups

sudo smbpasswd -a share
# -a: 追加

Samba の公開設定
#

Samba は/etc/Samba/smb.confファイルを編集することで設定できます。今回は Share という名前で公開されるようにしました。

/etc/Samba/smb.conf
[Share]                             # 公開名
   path = /smb/share/pickups        # 公開するディレクトリのパス
   browsable = yes
   writable = yes
   read only = no
   guest ok = no
   valid users = share              # share というユーザーのみに公開
   create mask = 0777
   directory mask = 0777

   follow symlinks = yes            # シンボリックリンクも共有
   wide links = yes
   allow insecure wide links = yes

設定が完了したら、Samba サービス再起動します。

sudo systemctl restart smbd

ファイアーウォールも設定します。

sudo ufw allow Samba 

ラズパイ zero でテスト
#

以下のコマンドで見れればok

sud mkdir /mnt/share

sudo mount -t cifs //192.168.10.5/Share /mnt/share -o username=share,password=password

df -h
# //192.168.10.5/Share   28G  4.4G   24G  16% /mnt/share

ラズパイ zero の設定
#

前回の記事で作成したものは、shell でランダムに写真を選び、そのパスを引数としてpython に渡し、電子ペーパーに写真を映すものでした。

今回変更するのはshell での写真の選び方で、以下のような変更を加えてます。

  • NAS をマウントして写真を選ぶ
  • マウントできなかったらローカルから選ぶ

ディレクトリ構造もおさらいします。以前からの追加で、Samba で共有されるディレクトリのマウント先があるのですが、/mnt/share にマウントすることとします。

ePaper
 |-- images      # 写真を集めたディレクトリ
 |-- main.py     # ePaper に写真を表示するスクリプト
 |-- main2.sh    # 写真を選択 & main.py を呼び出し
 └-- e-Paper     # Waveshare が提供するライブラリ

/mnt/share
 └-- 写真たち     # シンボリックリンク

写真のパスを選ぶshell は以下のように書きました。

後にcronで動作させるので、コマンドを使う場合はその絶対パスを指定します。

これは、cronで動作させる場合、セキュリティの観点から、引き継がれるPATH が限定的で、mountやpythonなどのコマンドがそのままでは動作しないためです。

例 → mount ではなく/usr/bin/mount

どこにコマンドがあるかわからないときはwhich mountのようして確認できます。

main2.sh
#! /bin/bash

cd /home/pi/ePaper

# 引数として渡されたディレクトリのパスからランダムで一つのファイルを選択
# arg1: path
get_image() {
        shopt -s nullglob
        images=("$1"/*)
        count=${#images[@]}

        if [ "$count" -eq 0 ]; then
                echo "there are no images in $1" >&2
                return 1
        fi

        rand_index=$(( RANDOM % count ))
        selected_image="${images[$rand_index]}"
        echo "$selected_image"
}

Samba_mount() {
        IMAGES_DIR="/mnt/share"

        # 既にマウントしてるかチェック → してなかったらマウント
        if ! mountpoint -q "$IMAGES_DIR"; then
                # password はSamba さっき設定したもの
                /usr/bin/mount -t cifs //192.168.10.5/Share "$IMAGES_DIR" -o username=share,password=password
                sleep 2
        fi

        # マウントできたらNAS から、できなかったらローカルから写真を選ぶ
        # 選んだ写真でPython 実行
        if mountpoint -q "$IMAGES_DIR"; then
                image_path=$(get_image "$IMAGES_DIR")
                if [ -n "$image_path" ]; then
                        /usr/bin/python3 main.py "$image_path"
                fi
                /usr/bin/umount "$IMAGES_DIR"
        else
                image_path=$(get_image "images")
                if [ -n "$image_path" ]; then
                        /usr/bin/python3 main.py "$image_path"
                fi
        fi
}

Samba_mount

最後に、cronの設定をします。cronはユーザーごとに設定可能ですが、今回はmountを挟むのでrootで行います。

今回は午前と午後の3時に写真が切り替わるようにしました。
朝起きたときと仕事帰りで写真が変わっていることが狙いです。

したがって、編集する際も以下のように実行します。

sudo crontab -e

また、途中で出てくるログなどは/dev/nullに向かわせ、無効にしてます。

crontab
0 3,15 * * * /home/pi/ePaper/main2.sh > /dev/null

@reboot sleep 60 && /home/pi/ePaper/main2.sh > /dev/null

まとめ
#

この記事では、以前作成したePaper に写真を映す機能に、写真を外部のラズパイから持ってくるような仕組みを作りました。

ラズパイ間のディレクトリ共有にはSmaba を用いて、必要なディレクトリを公開し、以下のような状況を実装しました。

 +-----------+           +----------------+           +--------------+
 |           |           |                |  display  |              |
 |           |           |     python  ---+-----------+->  image     |
 |           |  pick up  |       ↑        |           |              |
 |  images --+-----------+-->  shell      |           |              |
 |           |           |                |           |              |
 |           |           |                |           |              |
 |           |   Samba   |                |           |              |
 +--- DIR ---+ ----------+-->  mounot  ---+           +--------------+
 
 [==  NAS  ==]           [== raspi zero ==]           [==  ePaper  ==]

何かしら参考になれば嬉しいです。