GUGEN2015の秋月賞の副賞で頂いた高精細IGZOパネルに、Rapsberry Piを組み合わせてDropboxと同期するクラウド型デジタルフォトフレームを作ってみました。IoTかな?
綺麗で高精細なIGZOパネルを活かせるアプリとして、フォトフレームしか思いつかなかった(^_^) Raspberry Piを使ったので、周辺に色々繋いでクラウドとも連携させればIoTっぽいことができるかと思います。
フォトフレームに見える防犯システムとか、高齢者見守りとか、家電コントロールとか、、、、
今回、PICは出てきません。
高精細IGZOパネル
写真を撮り忘れたので、秋月さんのサイトから借用させていただいたIGZOパネルの裏面と制御ボード。
アクリルパネル
秋月さんから頂いたアクリルパネル。まだ保護紙が貼ってある。L字のものは表裏のアクリル板を挟むときに四隅に入れるもの。IGZOパネルの厚みとほぼ同じ。
フレーム作り
額縁部分の光漏れ防止は、ASCII.jpさんの記事、7インチWUXGA液晶をキットと100円ショップのフォトフレームで自作してみたを参考にさせて頂いた。
100均の黒画用紙をアクリルパネルサイズに切り取り、内側をIGZOの表示サイズに合わせてくり貫く。写真上にある短冊状のものは、側面からの光漏れ防止と黒画用紙をアクリルパネルに密着させるために、厚紙を張り合わせたもの。
細い黒い線は四隅からの光漏れを防止するため、黒画用紙を細長く切ったもの。
フレーム作り
厚紙の短冊は4辺にこんな感じで配置し、この中にIGZOパネルを置く。
この後、厚紙の短冊は額縁になる黒画用紙に両面テープで貼り付けた。
接着式サポート ペテット
制御ボードをアクリルパネルの背面に取り付けるのにこの部品を利用。これも賞品に含まれていた。感謝。
写真を撮り忘れたので秋月のサイトからお借りした写真です。
IGZOパネル装着
ビスとスペーサを使ってIGZOパネルを挟み込むように組み立て。
スペーサは写真下側の2本が長くなっていて、そのままフレームを立てる際の支えとなる。
完成
ラズベリーパイに繋いでみたところ。
完成
上から見た様子。
もっと細くて柔軟性のあるHDMIケーブルがあるとよい感じ。
Raspberry Pi 2
秋月さんでRaspberry Pi 2、ケース、16GB microSDカード、USBタイプの2A ACアダプタ、USBケーブルなどを調達。色々とお世話になりました。
OS Raspbianインストール
NOOBSというインストーラタイプと、OSのイメージディスクからインストールする方法があるが、前者でインストールしたらIGZOパネルに何も表示されなかった。当初簡単そうなNOOBSでインストールしていて、表示されずに大いに悩んだ。
IGZOパネルの設定
/boot/config.txtを取説の通りに設定する。表示は4方向に回転可能なので、ケーブルの引き出し方向に応じてconfig.txt内を書き換えればOK。
無線LAN接続
以下のサイトがとても詳しく解説されていたので参考にさせて頂き、定義ファイルを設定した。しかし、全然繋がらず悩みまくった。無線LANのアクセスポイントを再起動したり、他のサイトの記事も参考にしたがダメだった。
Raspberry Piに無線LANのUSBアダプタをつける
色々試し、疲れ果てた数日後、以下のサイトの手順でコマンドレベルで順次実行したら繋がった。一度繋がったあとは、再起動しても問題なく繋がり、原因がよくわからないが結果よし。
Dropbox API
Linux版でDropboxにアクセスする方法を探し、以下のサイトを参考にさせて頂いてセットアップ。こちらは一発でうまくいった。
Raspberry PiでDropboxにファイルをアップロードしてみた
コマンドラインからファイル一覧を取り出したり、ダウンロード/アップロードができて便利。ただし、自動的に同期する機能はない模様。そこで、同期の仕掛けは自分で作ることにした。
フォトフレームアプリ(Python)
実はPythonを使うのは初めて。ネットで色々探していたら、jpgなどの表示はpygameというライブラリを使えば簡単そうなことがわかった。その後Pythonの書き方をネットで探していたら子供がPythonの入門書を貸してくれた。いつの間にプログラミングなどやっていたのか? 親知らずであった。
デバッグ中にiPhoneからDropboxへ写真をアップしたら、縦向きの写真が横向きで表示されることが判明。どうやらiPhoneで撮った写真の回転方向はEXIFとして格納されており、実体は常に横向きのようだ。EXIFを読んで回転方法を補正するのは面倒そうだったので、jpgをダウンロードしたらexiftranというツールを使って必ず補正回転するようにした。
全体のフローは以下の通り(Python書式風)
繰り返し Dropboxにある写真一覧を取り出す ローカルにある写真一覧を取り出して、比較する ローカルに足りない写真はダウンロードし、回転方向を補正 ローカルにある余分なファイルは削除 ローカルにある写真一覧を取り出す 一覧分の繰り返し 写真をロードして表示 表示時間のウェイト前述の通り、Pythonは初めて使ったのでこれで正しいのか、最適な方法なのか不明ですが、ソース photoframe.pyです。バグがあるかもしれません、無保証です。著作権は留保しますが、改変などご自由にどうぞ。
デバッグ用にprint文が入っています。コマンドラインから実行すると動作がわかります。
写真のスライドショーの時間間隔は、最初の方でひとまず2秒に定義している。実際はファイルのロード時間もあって4〜5秒程度で切り替わる。
【制限事項】
Dropbox上の写真とローカルの写真の比較はファイル名のみで行って同期させているので、同一ファイル名で写真を入れ替えても更新(ダウンロード)しない。 日本語のファイル名は対象外です。iPhoneからDropboxにアップしたら日本語のファイル名になりました。アップ後にファイル名を英数字に変更すれば大丈夫。 その他、ソース参照 Raspbianデスクトップからの自動起動
OSが起動し、デスクトップが立ち上がったら自動的にフォトフレームが立ち上がるように、ホームディレクトリ下の.configディレクトリにautostartディレクトリを作り、photoframe.desktopファイルを置く。
/home/pi/.config/autostart/photoframe.desktop
[Desktop Entry] Type=Application Name=photoframe Exec=/home/pi/photoframe/photoframe.py Terminal=Fales
写真表示
写真のアスペクト比を維持して最大に表示できるようにした。4:3の写真はこんな感じ。
写真表示
16:9の写真例。
写真表示
iPhoneで撮った縦構図の写真。実体は横構図だがEXIF情報で縦の構図に変換して表示。
背面の様子
ミニイーゼル
前述のASCII.jpの記事にあった100均のミニイーゼル(\150)に載せてみた。
動画
Raspbian起動からフォトフレームが立ち上がり、Dropboxと同期して写真がスライドショーする様子。そのあとメイキング。