Raspberry Pi でクラウド対応フォトフレーム制作
イントロダクション
私は写真を撮るのが好きです。 2003年あたりからデジタル一眼を購入して今まで撮影に勤しんできました。
そして気づけば総撮影枚数が 388,524 枚。結構な枚数を撮影してきました。
そのため撮影したものを鑑賞する環境が兼ねてから欲しいと思っており、スライドショー形式で表示されるフォトフレームが欲しいと思っていました。
市販品もあるが
市販されているフォトフレームといえば、SDカードやUSBメモリなどにデータを入れてそれを表示するというもの。 画面サイズは7〜10インチ程度のものが多いようです。
Amazon.co.jp デジタルフォトフレームの売れ筋ランキング
私は撮影頻度は週1程度なのですが、一般的なフォトフレームを使った場合、データを入れるのが面倒臭い。と思ってしまいます。
どうせならクラウド型のフォトフレームが欲しい
頻繁にSDカードに写真を入れるのは億劫で、すぐに使わなくなってしまいそうです。 なので、Google Driveなどのクラウドストレージに写真を格納して、それをフォトフレーム上で表示したいです。
そのような需要は無いのか、市販品でそのようなものは見つからず。
無いから作るか
無いなら作るか、ということでクラウド対応型フォトフレームを作成しました。
用意したもの
Raspberry Pi 4
フォトフレームは常時通電するものなので、消費電力が低いものが良いですね。 今回は Raspberry Pi 4 を使いました。
【国内正規代理店品】Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品【RS・OKdo版】
モバイルモニター
写真を表示するためのモニターです。 FullHD&IPSパネルのモバイルモニターです。 モバイルモニターであれば電源も小型で設置自由度も高いと思います。 よくあるフォトフレームはモニター品質をケチっていて、視野角が狭くてがっかりするのですが、この辺のパーツを選べるのが醍醐味ですよね。
モバイルモニター/モバイルディスプレイ/CHONGYICK 15.6インチ FHD/ゲームモニター /72%NTSC色域 IPSパネル 軽薄型 Type-C/HDMI/全CNC製アルミ スタンドカバー付 PS4/XBOX/switch/PC/Mac/サブモニター/交換用液晶パネル 狭額
その他、電源類
その他、RaspberryPiの動作に必要なSDカードや電源を揃えます。
【 サンディスク 正規品 】 2年保証 ドライブレコーダー対応 microSDカード 32GB UHS-I Class10 U3 V30対応 SDSQQNR-032G-GHEIA エコパッケージ
Miuzei Raspberry Pi 4 電源、USB-C(Type C)ケーブル 5.1V 3A 充電器コードスイッチ付き ACアダプタ、互換性ありRaspberry RPi 4 Model B 1GB / 2GB / 4GB / 8GB バージョン PSE認証
システム構成
次に、システム構成を考えます。 RaspberryPi のOSは Raspberry Pi OS を使用します。
OS
Raspberry Pi OS
今回はフォトフレームとして使用するので、Desktopは使用せずにCLIでセットアップします。
画像表示プログラム
画像表示にはCLI上で画像を表示できる fbi を使用します。 ※以前のバージョンでUbuntu上のGUIで動かすものを作ったのですが、不安定で安定運用は断念しました。
クラウドストレージへのアクセス方法
クラウドストレージへのアクセスは rclone を使用します。
Rclone syncs your files to cloud storage
この rclone で定期的に写真をダウンロードして fbi に表示する、という流れになります。
セットアップ
Raspberry Pi OS のインストール
Raspberry Pi Imager を使ってSDカードにイメージを書き込みます。 今回の用途では32bitでも64bitでもどちらでも良いと思います。
fbi のインストール
書き込んで起動したら Raspberry Pi に下記コマンドでインストールします。
pi@photo:~ $ sudo apt-get -y install fbi
パーミッションの付与
そのままだとスーパーユーザー以外はfbiで画像を表示できないのでパーミッションを付与します。
pi@raspi3-photo:~ $ ls -Fla /dev/fb0
crw-rw---- 1 root video 29, 0 Apr 7 10:33 /dev/fb0
pi を video グループに追加します。
sudo usermod -G video pi
rcloneのインストール
下記でインストールできます。
curl https://rclone.org/install.sh | sudo bash
スライドショープログラムの作成
2022/5/22 update : 新バージョンを作りました。立ち上げから表示までの時間を高速化しました。
概要
以下のアルゴリズムとしました。
- rclone ls を使ってクラウドストレージ上の指定のフォルダの一覧を取得する
- ある程度取得できた時点でランダムで画像取得開始
- 取得できた画像から fbi で画像を表示
- その間、一定枚数をバックグラウンドで取得
- 指定時間が来たらランダムで次の画像を表示
- ランダム選択は重みづけを使った。表示したらデクリメントして他の画像を優先的に表示するようにした。
- 週1で rclone ls をしてデーターベースをマージするようにした
- データベースは以前のバージョンでは外部ファイルに json で記録していたがマージが遅いのでメモリに持つようにした
開発言語
言語は勉強も兼ねて python にしました。
2022/5/22 update : 新バージョンはオブジェクト指向にして、Python のお作法に則って作りました。 Udemyの酒井潤さんの講座がおすすめです。
現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
酒井潤公式ブログ
ソースコード
作成したプログラムを github で公開しています。
GitHub - yukishita/photoView4: クラウド対応スライドショープログラム
使い方
起動時にスクリプトを立ち上げるだけです。
私は crontab に以下を追加しました。 @reboot は起動時に起動してくれるWindowsのスタートアップのような役割があるものです。
@reboot /home/pi/photoView4/photoView4.sh
デモンストレーション
完成したフォトフレームのデモンストレーション動画です。
1700%の高速化を実現!!
以前のバージョン
基本的な動きは変わりませんが、一度ファイルリストをすべて取得してから動作するので起動が遅い・・
Tips
指定の時刻でディスプレイの電源を切る
24時間表示だと電気代がもったいないので、HDMIで接続している場合は crontab で以下の記述をすれば良いです。
0 0 * * * /usr/bin/vcgencmd display_power 0
30 6 * * * /usr/bin/vcgencmd display_power 1
上記の例だと 午前0時にディスプレイOFF、午前6時30分にディスプレイONとなります。
人感センサーや照度センサーを使っても良いかもしれません。
まとめ
いかがでしたでしょうか。 今回は Raspberry Pi 4 を使用しましたが、もっと性能が低い Raspberry Pi Zero などでも十分実行できると思います。(最初の起動が時間がかかるかもですが)
課題
今のところなし