- 2016.08.09
- 技術ブログ
【完成編】Raspberry Piで作ろう!手作りスマートミラー
札幌大通りのビアガーデンも始まり、いよいよ夏本番となった札幌です。
今年もビアガーデンに通いたいtacckです。
さて、いよいよ今回はRaspberry Piで作るスマートミラーの最終回。
実際に組み立ててスマートミラーとして動作させてみようと思います。
ラズパイをスマートミラー専用に
Raspberry Piの電源オン後に、ブラウザをフルスクリーンで自動起動してコンテンツを表示させるようにします。
そのため、コンソールの操作はsshで行えるようにしておきましょう。
また、Firefoxの"ホームページ"をhttp://localhost/
へ設定を済ませた状態としておいてください。
ブラウザの自動起動
前回のコンテンツ編では、手動でブラウザを起動してコンテンツを表示しましたが、今回はスマートミラー専用のラズパイとするために、「起動直後にブラウザをフルスクリーンで起動し、コンテンツを表示する。」ということを行います。
Firefoxのコマンドラインオプションではできないようなので、アドオンを使って実現します。
フルスクリーン化できるアドオンはいくつもあるようですが、今回はmfull
というものを利用しました。
アドオンのインストール後、下記設定して"OK"ボタンをクリックし、Firefoxが再起動するとフルスクリーンとなります。
- "Basic"タブの"Always start in full screen"にチェックを入れる。
- "Appearance1"タブの"Show Toolbars"のチェックを外し、"Auto hide"のチェックを入れる。
- "Appearance2"タブの"Show Sidebar"のうち"None"を選択する。
次に、起動直後にFirefoxを起動してコンテンツが表示されるように設定します。
(一緒に、スクリーンがオフとならないような設定と、マウスカーソルを非表示とする設定も行っています。)
1 2 3 4 5 6 7 8 |
@lxpanel --profile LXDE-pi @pcmanfm --desktop --profile LXDE-pi @xscreensaver -no-splash @xset s off @xset -dpms @xset s noblank @unclutter -idle 1 -root & @firefox |
電源を挿したら、フルスクリーンでFirefoxが起動されコンテンツが表示されました。
OverlayFS
家電は、電源を簡単にオン・オフできてこそ家電であるといえます。
今回のスマートミラーも、特に電源を簡単にオフにできるようにしないと、使い勝手が悪いものとなってしまいます。
Raspberry Pi(今回使用するOSであるRaspbian)は、SDカードをディスクとして動作するLinuxシステムです。
つまり、一般的なLinuxと同じように、各種情報はSDカードに対して読み書きを行っています。
そのため、特にディスクへの「書き込み」が発生している時に電源が切れてしまうと、ディスクの内容を破壊してしまう可能性があります。
そこで、「OverlayFS」化することで、システムがSDカードに書き込みを行わないようにします。
これは、SDカードの内容は「読み込み専用」とし、書き込み先は「OverlayFS(RAMディスク)」を使う、というものです。
こうするとSDカードへの書き込みは発生しないので、どのような状態でも電源が切ることができ、家電としての利便性を確保することができます。
まずは、ログファイルなど書き込みが発生しやすい箇所を"tmpfs"化します。
手順やスクリプトについては、こちらのサイトを参考とさせていただきました。
この手順通りに作業を行えば良いです。
次に、システム全体にRAMディスクを重ねてマウントし、そこにファイル書き込みできるようにする「OverlayFS」の対応を行います。
これについてはこちらのサイトを参考とさせていただきました。
ただ、何点か追加で対応した点があるので、そちらを補足させていただきます。
/etc/init.d/mount-overlay
で指定されている/fsprotect
ですが、存在していないはずなので、事前に作成しておく必要があります。
また、③の/etc/rc.local
については、下記部分だけ追記します。
1 2 3 4 5 6 |
cd /boot file=noprotect if [ -e ${file} ]; then mount -o rw,remount / mount -o rw,remount /boot fi |
ここまでできたら、下記コマンドを実行します。
1 2 |
chmod a+x /etc/init.d/mount-overlay sudo update-rc.d mount-overlay defaults 01 10 |
最後に、今後メンテナンスを行う場合には、OverlayFSの機能をオフにしたいため、こちらのサイトにあるスクリプトを利用させてもらって、切り替えられるようにします。
/usr/local/bin/noprotect
と/usr/local/bin/protect
を作成し、下記コマンドを実行します。
1 |
chmod a+x /usr/local/bin/noprotect /usr/local/bin/protect |
これで、準備ができました。
/usr/local/bin/noprotect
を実行して再起動した場合と、/usr/local/bin/protect
を実行して再起動した場合について、ディスクのマウント状況を確認します。
1 2 3 4 5 6 7 8 9 10 |
pi@raspberrypi:~ $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/root 15334608 3762820 10894184 26% / devtmpfs 469544 0 469544 0% /dev tmpfs 473876 0 473876 0% /dev/shm tmpfs 473876 6492 467384 2% /run tmpfs 5120 4 5116 1% /run/lock tmpfs 473876 0 473876 0% /sys/fs/cgroup /dev/mmcblk0p1 64456 21080 43376 33% /boot tmpfs 94776 0 94776 0% /run/user/1000 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
pi@raspberrypi:~ $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/root 15334608 3762828 10894176 26% / devtmpfs 469544 0 469544 0% /dev tmpfs 473876 0 473876 0% /dev/shm tmpfs 473876 6496 467380 2% /run tmpfs 5120 4 5116 1% /run/lock tmpfs 473876 0 473876 0% /sys/fs/cgroup /dev/mmcblk0p1 64456 21080 43376 33% /boot tmpfs 473876 92 473784 1% /fsprotect overlay 473876 92 473784 1% /etc overlay 473876 92 473784 1% /home overlay 473876 92 473784 1% /root overlay 473876 92 473784 1% /var overlay 473876 92 473784 1% /usr tmpfs 32768 272 32496 1% /var/log tmpfs 16384 0 16384 0% /var/tmp tmpfs 32768 8 32760 1% /tmp tmpfs 94776 0 94776 0% /run/user/1000 |
これで、準備ができました!
/usr/local/bin/protect
を実行して再起動した状態にしておけば、ディスクへの直接の書き込みが行われなくなるので、簡単に電源を切っても安全になります。
外観
では、「スマートミラー」として組み立てていきます。
今回はミラー部分は、「準備編」でも使用したアクリル板のハーフミラーをベースに、モニターのサイズに合わせた形でアクリル板を組み合わせていきます。
ただ、ここでミスが。。
接着剤使用時のマスキングが不十分であったため、接着剤がミラー部分についてしまい一部お見苦しい状態に。。
これを、イーゼルに立てかけ、ラズパイを収めた箱と並べます。
裏側は、このような感じで配線しています。
表側はこのような感じとなりました。
コンテンツを表示すると、このようになります。
まとめ
さぁ、これでマジックミラーとして、作成できました!
パーツさえそろえれば、後は組み上げていくだけでスマートミラーにできることが伝えられたかと思います。
特にコンテンツについては、通常のWebフロントエンドの技術なので、簡単に専用コンテンツを作り上げることができます。
ブログのシリーズとしては今回で一区切りつけますが、個人的には上記のミスのリベンジを行いたいと思います!
(これについては、別の機会にお伝えできればと思います。)