Raspberry Pi + Google Drive でクラウド対応フォトフレームを自作する【rclone + fbi + Python】
Image credit: Tomokatsu Yukishita写真が趣味で、2003年からデジタル一眼を使い始めて今に至ります。気づけば総撮影枚数は388,524枚。これだけ撮り溜めた写真を、スライドショー形式でリビングに飾りたいと思っていました。
市販のデジタルフォトフレームでは解決できなかった問題
市販のフォトフレームは、SDカードやUSBメモリにデータを入れて表示する仕組みが主流です。7〜10インチのものが多く、Amazonのランキングでも選択肢は豊富にあります。
ただ、週1ペースで写真を撮り続ける身としては**「毎回SDカードに写真を入れ直す」運用が億劫**で、すぐに使わなくなりそうでした。

Google Driveなどのクラウドストレージから自動で写真を取得して表示するフォトフレームが欲しかったのですが、市販品では見つからなかったため、自分で作ることにしました。
用意したもの
Raspberry Pi 4
常時通電するフォトフレーム用途には、消費電力が低く小型なRaspberry Piが適しています。

モバイルモニター
写真を表示するためのモニターです。FullHD・IPSパネルのモバイルモニターを選びました。市販のフォトフレームは視野角が狭いパネルが多いですが、パーツを自分で選べるのが自作の醍醐味です。モバイルモニターは電源が小型で設置の自由度も高いです。

microSDカード・電源


システム構成
OS:Raspberry Pi OS
Raspberry Pi OS をSDカードに書き込んで使います。フォトフレーム用途なのでデスクトップ環境は不要で、CLIのみの Lite 版でセットアップします。
画像表示:fbi
CLIから直接フレームバッファに画像を表示できる fbi を使います。以前はUbuntu上のGUIで動かすバージョンも作りましたが動作が不安定だったため、CLIベースの構成に切り替えました。
クラウドストレージとの連携:rclone
rclone を使ってGoogle Drive上の写真を定期的にダウンロードします。Google Drive以外にもDropbox・S3など70以上のクラウドサービスに対応しています。
rcloneで写真をダウンロード → fbiでスライドショー表示、という流れです。
セットアップ
Raspberry Pi OS のインストール
Raspberry Pi Imager を使ってSDカードにイメージを書き込みます。

32bit・64bitどちらでも問題なく動作します。
fbi のインストール
sudo apt-get -y install fbi
パーミッションの付与
デフォルトではスーパーユーザー以外は fbi で画像を表示できません。pi ユーザーを video グループに追加します。
pi@raspi3-photo:~ $ ls -Fla /dev/fb0
crw-rw---- 1 root video 29, 0 Apr 7 10:33 /dev/fb0
sudo usermod -aG video pi
rclone のインストール
curl https://rclone.org/install.sh | sudo bash
インストール後、rclone config でGoogle Driveとの認証設定を行います。
rclone config 実行中にブラウザ認証用のURLが表示されます。そのURLをPC側のブラウザで開いてGoogleアカウントを認証してください。スライドショープログラムの実装
アルゴリズム
以下の流れで動作します。
rclone lsでクラウドストレージ上の指定フォルダの画像一覧を取得- 一定数取得できた時点でランダムに画像のダウンロードを開始
- ダウンロードできた画像から順に
fbiで表示 - バックグラウンドで次の画像を取得し続ける
- 指定時間が来たらランダムに次の画像へ切り替え
- 重み付きランダム選択で、表示済み画像の優先度を下げ偏りを防ぐ
- 週1回
rclone lsでデータベースをマージして新着写真を反映 - データベースはファイルではなくメモリ上に保持(マージ速度改善)
言語:Python
スライドショー制御スクリプトはPythonで実装しました。オブジェクト指向で設計し直した改良版では、起動から最初の画像表示までの時間を旧バージョン比1700%高速化しています。
Pythonの学習には 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用(Udemy) が参考になりました。
ソースコード
作成したプログラムはGitHubで公開しています。
GitHub - yukishita/photoView4:クラウド対応スライドショープログラム
使い方
crontab に以下を追加して、起動時に自動実行します。
@reboot /home/pi/photoView4/photoView4.sh
デモンストレーション
改良版(v4)のデモ動画です。旧バージョンと比べて起動から表示までの時間が大幅に短縮されています。
旧バージョン(参考)
ファイルリストをすべて取得してから動作するため起動が遅い版です。
Tips:指定時刻にディスプレイの電源を切る
24時間表示し続けると電気代がかさむため、HDMI接続時は vcgencmd で電源スケジュールを設定できます。
0 0 * * * /usr/bin/vcgencmd display_power 0
30 6 * * * /usr/bin/vcgencmd display_power 1
上記の例では午前0時にOFF・午前6時30分にONとなります。人感センサーや照度センサーと組み合わせてさらに自動化することも可能です。
まとめ
| 構成要素 | 役割 |
|---|---|
| Raspberry Pi 4 | メインコンピューター(低消費電力・常時稼働) |
| モバイルモニター | FullHD・IPS・高視野角で写真を高品質表示 |
| fbi | CLIからフレームバッファに直接画像を表示 |
| rclone | Google Driveから写真を自動ダウンロード |
| Python | スライドショー制御・重み付きランダム選択 |
Raspberry Pi 4を使いましたが、Raspberry Pi Zero 2 Wでも同様の構成で動作可能です。常時通電する用途なので、消費電力の小さい機種を選ぶとランニングコストを抑えられます。