ラズパイと高精細IGZO液晶で作る高機能フォトフレーム

ラズパイと高精細IGZO液晶で作る高機能フォトフレーム

ラズベリーパイに興味がなく買ったこともなかった当方が、「7.9インチ高精細IGZO液晶ディスプレイ」と組み合わせてデジタルフォトフレームを作りました。

市販のフォトフレームにはない機能が欲しくて以前から自作のものを使っていたのですが、先日壊れてしまい今度は何を使おうかと考えてたどり着いたのが本作です。

ネットで見るラズパイと高精細液晶の記事では、買ってみたとか、とりあえず表示させてみたで終わっている記事が大半で、具体的な製作に及んでいる例はあまり見かけません。

同様の製作をしたいがラズパイ素人だし液晶マニアでもないし、どうやればいいのかよくわからないという方の参考になれば幸いです。

こんな感じのです

デジタルフォトフレーム自作のきっかけとしては、こういうのが欲しかったためです。

夜間や誰もいない時は自動でOFFしたい
日めくりカレンダーを表示したい
天気予報を表示したい
記念日などに特別な写真を表示したい
特別な日や時報として音楽を再生したい
これらをスケジュール設定できるようにしたい

 
秋月電子で売っている「7.9インチ高精細IGZO液晶パネルセット」を使い、設計開始時点で最新の「Raspberry Pi 3 Model B」を使いました。

注意点として、このセットでは横長表示にした場合、ラズパイ側の制約により本来「2048×1536」サイズの液晶パネルであるにもかかわらず「1920×1536」の大きさでしか表示することができないという欠点があります。

仕方がないので、当作では「1536×2048」の縦長(ポートレート)表示モードのまま、液晶を右に90°倒し、表示する画像は左に90°回転して表示させることで、表示エリアをフルに使うようにしました。こういった使い方でなんとかできたのは、静止画像の表示しかやらないフォトフレームがゆえです。

それから、PIC(PIC16F1827)を使った制御基板を自作。コンデンサマイクとCDSによって生活音と光量を検知し、自動ON/OFFの制御を行わせています。

自作のフォトフレーム裏面ラズパイ用のケースを間借りして自作の制御基板を収めました。

フォトスタンド(ケース)もアクリルのフリーカットを利用して自作したものです。

ラズパイには独自に開発したフォトフレームアプリをセットアップ。スケジュールや各種設定に従って、写真や天気予報のサイクル表示、時報の再生などを行います。

自作のフォトフレーム(写真)写真・画像(JPEG・PNG)
音声再生(MP3)

自作のフォトフレーム(日めくりカレンダー)日めくりカレンダー
・平日:黒色
・土曜:青色
・日曜:赤色
・祝日:緑色

自作のフォトフレーム(日めくりカレンダー)天気予報
・1時間ごとの予報
・週間天気予報

黄砂予報画面PM2.5、黄砂予報(※2021/02/14追加)
・6時間ごとの予報
・週間予報

システムの温度表示RTCに内蔵されている温度補償用のデジタル温度計を利用して、カレンダー表示の時に画面の左下に小さくシステム温度を表示します。

本製作例では、室温28℃の連続稼働時、ラズパイのケース内は約43℃になりました。

フォトフレームアプリは、NetBeans IDE(C/C++)で開発しました。SDL2(Simple DirectMedia Layer)を使って画像表示や音声再生などを行っています。

表示内容の切り替えは、3パターンのアニメーションで行うようにしてみました。

自作のフォトフレーム(クロスフェード)クロスフェード

自作のフォトフレーム(忍者屋敷の扉1)回転扉(左から右に流れる)
小分けにされたブロックエリア一つ一つが忍者屋敷の扉のように回転しながら次々に切り替わります。

自作のフォトフレーム(忍者屋敷の扉1)回転扉(ランダム)
こちらは忍者屋敷の扉がランダムで高速に切り替わっていきます。

SDL2によってグラフィックのハードウェアアクセラレーションが効いているようで、思ってたより滑らかに表示できました。切り替えアニメーションのバラエティーは市販品には及びませんが、ソコはあまり重要でないのでこの程度です。

そして、次のいずれかの条件で自動的にOFF(待機モード)に入ります。
・部屋の物音がしなくなって15分経過した場合
・部屋の明るさが真っ暗になって5秒経過した場合
・次のスケジュール実行までに5分以上ある場合

待機中の消費電流は約200μA。引き続き監視を継続し、条件復帰で稼働状態に戻ります。

全体の回路図

ラズパイと制御基板の接続を含む全体の回路図です。

フォトフレーム回路図(小)

まず、ラズパイのI/Oについて。
GPIO 3本を使ってPICと通信します。通信とはいっても、HIとLOで意図を伝え合うだけの簡単なものです。

また、ラズパイとエプソンのRTC(RX8000)をI2Cで接続し、所定の日時にPICに対してアラーム割り込みを伝えるようにしているほか、温度レジスタ値の読み込みも行います。

ラズパイの電源ハイサイドスイッチラズパイへの電源供給は、USBからではなくGPIOコネクタから給電します。非公式ですが結構メジャーな方法らしいです。
そして、液晶パネルとラズパイの電源ON/OFFを、MOSFET(Q1, Q2)のハイサイドスイッチを使って、PICから制御できるようにしています。

PIC自身の電源は、3.3V LDOである NJM2863F33(IC1) のCTRL端子を使ってON/OFFします。タクトスイッチを押すとCTRL端子がHIになり3.3V系がON、PICのファームウェアからRA4をHIにして電源ONをラッチします。組み込みでよくやる方法ですね。

先のMOSFET(Q1, Q2)によるハイサイドスイッチは、立ち上がりが物理的なスイッチよりも鋭いため、5V電源ラインに一瞬ディップが生じます。これによりPICにリセットが生じる可能性があるため、電源供給ラインにCRフィルタ(R17とC12)を入れています。

生活音の検知は、コンデンサマイクで拾った信号を NJM2732 で数百倍に増幅します。

フォトフレーム生活音検知マイク回路
その出力をD3とC10でピークホールドし、D3の漏れ電流とR15とIC3-8の入力バイアス電流(50nA typ)で少しずつ抜いていくことによって、音量の起伏をなめらかに検知するようにしています。

フォトフレームマイクアンプの周波数特性マイクアンプの周波数特性。
(IC3-A 1pin)

高低域のゲインを下げ、中音域を重視する特性にしてあります。
10畳くらいまでの広さを想定していますが、もう少しゲインを上げても良いかも知れません。

明るさの検出にはCDSを使いました。単純にPICのADCを使ってCDS電圧を読み取り、明暗を判断します。

あと、小信号の汎用MOSFETである BSS138(Q5, Q6)を使って、PICから液晶パネルのスタンバイ操作とバックライト操作を行えるようにしています。この端子はスイッチに接続することが想定されていて、ON抵抗10Ωでも操作することができます。

パーツと入手先

今回の部品は、ほとんど秋月電子のネット通販で入手しました。ただ、チップコンデンサと抵抗については、手ハンダしやすい2012サイズが秋月にはあまりないので、以前MOUSERで買いだめしておいたものを使いました。

全パーツリスト(タブ区切り)

主要パーツ

LQ079-IGZO-LCD-SET秋月電子取扱説明書
これがないと始まらない。高精細IGZO液晶ディスプレイセットです。SHARPはもう液晶の会社ではなくなってしまいましたが、自作の電子工作品にIGZOブランドが使えるのは嬉しいですね。

Raspberry Pi 3 Model BRaspberry Pi 3 Model B秋月電子回路図
これもないと始まらない。RS版とelement14版があるようですが、発売元が違うだけで中身は同じものとのこと。amazon(Raspberry Pi 3 MODEL B)でも同じ値段で売ってます。

え~~~~~っ!と思ったんですが、制作をしている間に Raspberry Pi 3 Model B が性能アップしたRaspberry Pi 3 Model B+が発売になりました。マイナーアップな感じで性能が上がっただけなので、変わりなく使えると思います。

3ple Decker3ple Deckeramazon
無数にあるラズパイ用ケースの中から、基板を完全に覆う形のケースで一番小型のものを探した結果、見つけたのがこれです。年中部屋においておくフォトフレームは、こういうケースじゃないとホコリが蓄積していきます。本作では、この中に制御基板も格納します。

PIC16F1827T-ISSPIC16F1827T-I/SS秋月電子データシート
超低消費電力の8ビットPIC、SSOPパッケージ。今回はADCとI2CとTIMER以外の機能は使っていませんが、ほぼ全てのピンを使います。

AE-RX8900AE-RX8900秋月電子取扱説明書
エプソンの高精度RTC RX8900のDIP化モジュール。本作では、フォトフレームの稼働日時になったらPICにINT信号を入れて、システムの電源を入れています。また、内臓のデジタル温度計も利用します。

DMG3415UDMG3415U秋月電子データシート
PチャンネルのMOSFETで、VGS約1.2Vで4A流せます。典型的な大電流スイッチング用のFETですね。液晶パネルとラズパイのハイサイド電源スイッチとして使用します。

J03 S2336J03S 2336秋月電子
ノートパソコンなどで使われるというマイクロスピーカーです。長穴加工が少々面倒ですが、小型なので本作には手頃の品。音質はあまり良くない、というかこのサイズだと普通か?という感じです。

GPE024C-050400-5GPE024C-050400-5amazon
5V4AのACアダプタ。ラズパイは2.5A電源が推奨されており、液晶パネルセットは最大750mA。安くて小型で電流に余裕のあるモノを探しまくって見つけたのがコレです。さらに、DCプラグは音叉型のものに交換します。「たまにおかしくなる」のは嫌ですからね。

2DC-G213-D422DC-G213-D42秋月電子
10A流せる2.1mm標準DCジャック。ただし、音叉型のプラグが必要です。本作では4A近い電流容量を確保しますので、必ずコレと音叉型プラグを使ってください。あまり知られていませんが、マル無線のMJシリーズなどは、せいぜい0.5Aが仕様上の上限なんです。

MP-121CFMP-121CF秋月電子
4A流せる音叉形の2.1mm標準DCプラグ。音叉形プラグはノートパソコンなどでよく使われている形式で、コンタクト部分がフォークのようになっていて端子を挟み込むので電流容量が大きいんですね。ACアダプタのデフォルトのDCプラグと交換します。

A0367スーパースリム HDMIケーブル 0.3mamazon
多分、現時点で最もスリムなHDMIケーブル。一般的なHDMIケーブルでは無駄にかさばってしまうので、本作のような小型のフォトフレームを作るのは難しくなります。

AwinnerAC極スリム 3.5mmオーディオステレオケーブルamazon
小型薄型のフレームに収めるために、このようなスリムでL型のステレオプラグが必要です。もったいないですが、カットしてL型の部分だけを使います。

フリーカットアクリル板フリーカットアクリル板はざいや
アクリル板はフリーカット(オーダーメイド)で用意しました。価格はさほど高くはありません。「photoframe_outline.zip」に含まれるアクリルオーダー図面を参考にしてください。はざいやでは自動見積りできますし、フォトスタンド脚なども売ってます。

化粧飾止化粧飾止 8mm クロームamazon
フォトフレームスタンドでよく見るピカピカしたやつです。
今の時代、何でもありますね。

超低頭ビスそれから、本作ではなるべく薄型するために一部で低頭ビスを使っています。

写真はハンズで売っている超低頭ビス。

最初のセットアップ

初めて液晶パネルを表示させるまでと、ラズパイの設定などについてまとめておきます。

液晶パネルセットの動作確認

必要な手順は全て取扱説明書に書かれていて、その通りにやれば表示できます。
SHARP 7.9インチ高精細IGZO液晶パネルセット 1536×2048ドット ラズパイ用

準備するもの

ラズパイ(Raspberry Pi 3 Model B)
USB電源(2.5A + 750mA 以上推奨)
USBケーブル(MicroUSB)2本
HDMIケーブル
micro SDHCカード 16GB
USB有線マウスとキーボード

フォトフレームとしてはACアダプタを使用しますが、それまでの電源としてUSB充電器などを用意します。液晶パネルと合わせて2ポート必要ですね。

スマキューブタブ(SmaCube Tab) USB 充電アダプタ 高出力 4.8A 2ポートUSB充電器2ポート合計4.8A
この容量では恐らく現時点で一番小型のものです。価格も安く、ラズパイ実験用の電源としてオススメです。

マウスは無くても表示はできますが、やはり少しは操作してみたくなるというもの。また、後でリモート接続する場合でも、一度は必要になるので用意しておきます。

液晶パネル表示までの手順

OSのインストール

OSのイメージやインストール方法はいくつかありますが、本作では下記のページからダウンロードできる「RASPBIAN STRETCH WITH DESKTOP」を使います。[Download ZIP]でZIPファイルをダウンロードしてください。
Download Raspbian for Raspberry Pi

次に「Win32DiskImager」を下記のページからダウンロード、インストールします。このツールを使って、先程のZIPファイルを解凍して出てくる「YYYY-MM-DD-raspbian-stretch.img」というイメージファイルをSDカードに書き込みます。
(イメージは不定期に更新されています。当方の場合 2018-04-18 でした)
Win32 Disk Imager download

ディスプレイ設定

秋月電子から液晶パネル用の設定ファイル「config.txt」をダウンロードして、SDカードのルートディレクトリにある config.txt と置き換えます。念のため元のファイルはリネームしておくと良いでしょう。テレビ等で表示させる時は元のファイルを使います。
秋月電子の設定ファイル:7.9インチ Raspberry Pi用 config

それから、秋月の config.txt(2017.05.02 rev1.0)には凡ミスがありますので、下記の修正が必要です。
19行目の「dmi_force_hotplug=1」を「hdmi_force_hotplug=1」に修正。
先頭の「h」が抜けていますね。この影響は次で…

起動

SDカードをラズパイにセットします。取説では、その後
→液晶パネルにDC5Vを給電し、青色LEDが点滅するまで約8秒待ちます。
 →ラズパイにDC5Vを給電します。
  →映像が表示されます。
となっています。

config.txt がミスったままでは、先に液晶パネルを起動しないとダメなんですが、先程の修正をしてやると液晶パネルが後でもちゃんと表示されるようになります。

ラズパイのセットアップ

液晶パネルの表示ができたら、普通はとりあえず有線のUSBマウスとキーボードを接続して各種設定などを行うんですが、7.9インチ1536×2048の高精細液晶パネルでは文字が小さくて見にくいし、不安定な状態でゴソゴソやっているとパネルやフレキシブルケーブルなど、デリケートな部分を傷つけてしまうかもしれません。

ですので、普段使っているPCからリモート接続して操作することを強くオススメします。ラズパイ内蔵のWi-Fiを使うと、本体にはUSBケーブルを一本つないで電源供給するだけで済みますし、断然やりやすいです。

テレビやモニターのHDMIを利用する手もありますが、リモートに比べると不便です。

ラズパイ(WITH DESKTOP)の初期状態

・ホスト名:raspberrypi
・デフォルトユーザー名:pi
・パスワード:raspberry
・rootのパスワード:未設定(ログインできない)
・起動時はpiユーザーで自動ログイン
・ロケールは英語圏になっている
・Chromiumブラウザ(Chromeの前身)がインストール済み

予備知識
・sudoコマンド… root権限でコマンドを実行するコマンド
・nanoコマンド … シンプルなテキストエディタ
・raspi-config … ラズパイ設定コマンドツール

ラズパイ設定ツール(CUI版)キャラクタベースのラズパイ設定ツール。

起動は、コンソールから sudo raspi-config と入力します。

ラズパイ設定ツール(GUI版グラフィックベースのラズパイ設定ツール。

raspi-configのGUI版。スタートメニュー→[設定]→[Raspberry Pi の設定]で起動できます。VNC接続後はこちらの方もどうぞ。

以下の設定は、フォトフレームとしてだけでなく、ラズパイを使う前にやっておいた方が良いこととして一般的なものも含むので参考にしてください。
WiFi設定
リモート接続(SSH)
システムアップデート
ロケールの設定
NTPの設定
リモート接続(VNC)
完全日本語化
ホスト名の変更
パソコンとファイル共有
音声出力先の設定
GPIOの設定
I2Cの設定
カメラをOFFにする
無操作ブランク画面の無効化
SDカードの未使用領域の開放
メディアプレイヤー
ライブラリのインストール
アプリ用フォント
その他

WiFi設定

リモート接続する前に、まずはラズパイ内蔵のWiFiを使えるようにします。もちろんLANケーブルでもOKですが、いずれにせよWindowsと同じくらい簡単です。しばらくLinuxを触っていなかった身からすると「ここまで来たか」という感じです。

ラズパイのWIFI設定(SSIDの選択)タスクバーのネットワークアイコンをクリックして、目的のSSIDを選択し、暗号化キーを入力するとすぐに接続されます。

ネットワークアイコンを右クリックすると、IPの設定ができます。
IPアドレスはデフォルトでは自動(DHCP)になっていますが、固定に変えてもOK。
自動の場合は、ホスト名の後ろに「.local」を付けた名前でアクセスできます。
(デフォルトのホスト名だと「raspberrypi.local」になる)

パソコンから、pingコマンドで接続を確認できます。
ping raspberrypi.local

※追記(2018/09/16)
今年中頃のWindows10のアップデートによりmDNS周りの仕様が変更されたため、そのままでは「.local」を付けたホスト名でアクセスすることができなくなっている模様です。今後のことも考慮し、固定のIPを割り当てることをおすすめします。

リモート接続(SSH)

SSHを使うとコマンドベースのリモート操作ができます。まずはこれで接続します。

ラズパイのコンソール画面で sudo raspi-config と入力。[5 Interfacing Options]からSSHをEnableにします。
または、ラズパイのスタートメニューから[Preferences]→[Raspberry Pi Configuration]と進み、[Interfaces]タブでSSHをEnableにします。

次にパソコン側からアクセスします。ターミナルは「Tera Term」がオススメ。
Tera Term(窓の杜)

Tera Termを起動して新しい接続からSSHを選び、以下を入力すると接続できます。
・ホスト名:raspberrypi.local
・ユーザー名:pi
・パスフレーズ:raspberry

ラズパイログイン画面これ以降はラズパイ側での操作は不要になります。USBで給電するだけでOK。
Tera Termのデフォルトの表示は見にくいので、フォントや色などを適当に設定します。

もう一つ、SSHを有効にすると、ラズパイの起動時にpiユーザーのパスワード変更を促すWarningが表示されるようになります。
公開されているデフォルトパスワードのままでは危険というわけですが、とりあえず passwd コマンドでパスワードを変更しておきます。(sudo raspi-config からでも可能)

システムアップデート

次のコマンドを続けて実行し、システムのアップデートを行います。これをやっておかないと、以後のインストール作業でエラーが出ることがあります。また、早い段階でやっておかないと設定が上書きされてしまうものもあるようです。

sudo apt-get update …パッケージリストの更新
sudo apt-get dist-upgrade …ディストリビューションの更新

ディストリビューションの更新はWindows Updateのようなもので10分程かかります。

ロケールの設定

SSH接続から sudo raspi-config を実行し、[4 Localisation Options]から次の3つの項目を日本用に設定します。
・[I1 Change Locale]→ ja_JP.UTF-8 UTF-8
・[I2 Change Timezone]→ Asia Tokyo
・[I4 Change Wi-fi Country]→ JP Japan

設定を終了して再起動します。
ちなみに[I3 Change Keyboard]はラズパイにキーボードを接続して設定しますが、今回はSSHを使うので基本不要です。

NTPの設定

ラズパイはRTCを持っていないので、起動の度に日時を設定する必要があります。しかし、常時稼働させておくわけではないので、定期的な時刻同期までは必要ありません。つまり、起動時に一度だけ時刻を同期するように設定します。

ネット上では、ntpデーモンをインストールする方法が多く見られますが、これは無駄にNTPサーバーを稼働してしまうことになるためオススメしません。ここでは、軽量なNTPクライアント(ntpdate)を使うようにします。
sudo apt-get install ntpdate

利用するNTPサーバーを設定します。デフォルトでは海外のサーバーになっているので、これをNICT(ntp.nict.jp)へ変更します。
NICTとは、国立研究所が公開している無料のNTPサービスです。
NICT公開 NTPサービス

sudo nano /etc/default/ntpdate

元々ある NTPSERVERS の行頭に”#”を付けてコメントアウトし、新しい行を追記保存。

次に、ntpdateを起動するスクリプトを作ります。
sudo nano /usr/local/bin/ntpdate.sh

スクリプトの内容はこちら。ntpdateの実行前にsleepを入れないと、WiFiの接続が完了していないので”name server cannot be used”というエラーが発生します。

保存したら実行属性を付けます。
sudo chmod 700 /usr/local/bin/ntpdate.sh

次に、起動時にスクリプトを実行するように設定します。
sudo nano /etc/rc.local

rc.localファイルの最後の方、”exit 0″ の直前に次の一行を追記します。

保存したら、ラズパイを再起動してntpdateのログが記録されているかを確認します。
sudo reboot
cat /var/log/syslog | grep ntpdate

問題なく実行できている場合は、最後に次のようなログが出ているはずです。
“ntpdate[744]: step time server 133.243.238.244 offset 9.178031 sec”

リモート接続(VNC)

コマンドベースではなくGUIベースのリモート接続で、これができると結構便利です。

ラズパイのコンソール画面で sudo raspi-config と入力。[5 Interfacing Options]からVNCをEnableにします。

続けて解像度を設定します。[7 Advanced Options]から[Resolution]で1280×720くらいに設定した後再起動します。

パソコン側にVNC Viewerをダウンロードしてインストールします。
Download VNC Viewer

VNC Viewerを起動し、Fileメニューの[New connection]を選択、VNC Serverにホスト名(raspberrypi.local)かIPアドレスを入力してOKします。

ラズパイにVNC接続したところ接続をダブルクリックして開始すると、最初に暗号化されていないという警告が出ますが、そのままContinueして、ユーザーpiとそのログインパスワードを入力すると接続できます。

タスクバーにVNCアイコンが表示されるので右クリックでオプション設定ができます。

以後は raspi-config の代わりに、GUIの「Raspberry Pi の設定」もリモートでOK。

完全日本語化

日本語フォント
デフォルトのままでも一応日本語は表示されますが、一部文字化けするので有名なフリーの日本語フォント(IPAフォント)をインストールします。(インストール後再起動)
sudo apt-get install fonts-ipafont fonts-ipaexfont
sudo reboot

VNCビューアからデスクトップを右クリック、[デスクトップの設定]→[System]にて、Fontを「IPAexゴシック」へ変更します。

日本語入力システム
こちらも名の知れている日本語入力のようです。インストール後再起動します。
sudo apt-get install fcitx-mozc
sudo reboot

ラズパイ キーボード設定これで変換システムは使えるのですが、このままではVNC Viewer からの半角/全角キー操作が効かないので次の設定をします。

タスクバーにあるキーボードのアイコンを右クリック、[現在の入力メソッド]をクリックして[全体の設定]タブを表示します。

ラズパイ 入力メソッドの設定

「入力メソッドのオンオフ」の右側をクリックして半角/全角キーを押すと、「Zenkakuhankaku」から「Hankaku」に変化します。ラズパイにキーボードを直接つないでいるときは前者なんですが、VNCからの操作だと後者になるんですね。
これでOKです。テキストエディタで日本語変換を試してみてください。

ホスト名の変更

デフォルトの「raspberrypi」から「photoframe」へ変更しました。
VNCを使ってスタートメニュー→[設定]→[Raspberry Pi の設定]を起動すると、ホスト名の入力欄が出ているのですぐに分かります。

当然ですが、SSHやVNCの接続先ホスト名も「photoframe.local」へ変更になります。

パソコンとファイル共有

パソコンのファイルマネージャーから、ラズパイのファイル操作ができるようにします。
まず、お決まりのsambaをインストール。
sudo apt-get install samba

設定ファイルを編集します。
sudo nano /etc/samba/smb.conf

ファイルの最後に下の内容を追記して保存します。

[photoframe]は共有名で、ファイルマネージャーで表示されるフォルダ名になります。
pathは共有したいディレクトリです。

以降、パソコンのエクスプローラーのアドレス欄にホスト名(\\photoframe.local)を入力すると「/home/pi」の内容が表示されることを確認します。

音声出力先の設定

音声デバイスは、ラズパイ本体と、IGZO液晶パネルセット(HDMI経由)にもありますが、どちらで出力するかを設定します。
ラズパイ オーディオ選択
タスクバーにあるオーディオアイコンを右クリックすると選択できます。本作では液晶パネルに付いているオーディオプラグを利用しますのでHDMIを選択します。

ボリュームもここですね。

GPIOの設定

本作では3本のGPIOを使っています。フォトフレームアプリの中からでもGPIOの設定はできるのですが、アプリを起動していなくても制御基板との通信が行えるよう、ラズパイを起動した時にもGPIO設定を行うようにします。

GPIOのそもそもの初期値を変える方法もありますが、ここではラズパイ起動時に実行されるスクリプトを作り、その中からgpioコマンドを使って設定する方法をとります。
sudo nano /usr/local/bin/gpio_init.sh

スクリプトの内容はこちら。

保存したら実行属性を付けます。
sudo chmod 700 /usr/local/bin/gpio_init.sh

次に、起動時にスクリプトを実行するように設定します。
sudo nano /etc/rc.local

rc.localファイルの最後の方、”exit 0″ の直前に次の一行を追記します。

保存したら、ラズパイを再起動してGPIOの設定がされているかを確認します。
sudo reboot
起動したら、gpio readallを実行。

GPIOの設定すると、このように全てのGPIOの現在の状態が表示されるので、GPIO.9(BCM=9)とGPIO.10(BCM=10)のモードがOUT、GPIO.11(BCM=11)のモードがINになっていることを確認します。

Raspberry Pi 3 Model B GPIOGPIOのピンソケットを上から見た配置。

なお、gpioコマンドの使い方は次の通りです
(※GPIO.10を操作する場合の例)

gpio -g mode 10 out … I/Oを設定(in or out)
gpio -g write 10 1 … ポートへ出力(0 or 1)
gpio -g read 10 … ポートから入力して表示

I2Cの設定

RTC(RX8900)と通信するための12Cを設定します。
VNCを使ってスタートメニュー→[設定]→[Raspberry Pi の設定]を起動し、インターフェイスからI2Cを有効にします。この設定は再起動しても保持されるので、以降は触る必要はありません。

なお次のコマンドで、接続しているI2Cデバイスを確認することができます。
sudo i2cdetect -y 1

I2Cの設定制御基板を接続した状態で実行したところ。
RX9800(Slave ID=0x32)と接続できていることが確認できます。

カメラをOFFにする

ラズパイのデフォルトではカメラが有効になっていますが、それだけでメモリを消費するとのことなので無効にします。
VNCを使ってスタートメニュー→[設定]→[Raspberry Pi の設定]を起動し、インターフェイスからカメラを無効にします。

無操作ブランク画面の無効化

ラズパイのデフォルトでは、10分間操作がなかったらブランク画面になるのですが、これを抑止します。
sudo nano /etc/lightdm/lightdm.conf

このファイルに、次の内容を追記します。

保存して再起動します。
sudo reboot

SDカードの未使用領域の開放

これは、念のため実行しておきます。
sudo raspi-config を入力、[7 Advanced Options]から[A1 Expand Filesystem]を実行。その後、ラズパイを再起動します。
多分、NOOBSを使ってインストールした場合に意味があるんじゃないかと思います。

メディアプレイヤー

メディアプレイヤーをインストールすることで、ラズパイでも動画ファイルやAACやMP3などの音声ファイルが再生できるようになります。当作では、よく知られるプレイヤーの一つ「VLC」をインストールし、フォトフレームアプリ内部から利用する形で音声ファイルを再生します。

ただし当作では、フォトフレームとして画面を横にして使っているため、残念ながら動画再生の利用は(画面の向きが違うため)できません。

sudo apt-get install vlc

ライブラリのインストール

フォトフレームアプリに必要なライブラリです。

①WiringPi
よく知られるラズパイのGPIO制御ライブラリ。
ネット上では、WiringPi を使うためにはいくつかのインストールやビルドが必要とされていますが、何もしなくても使える状態でした。(OS(Raspbian)のバージョンによるのかも知れません)

gpioコマンドが使えるなら WiringPi が使えるということになるようですが、もし入っていないようであればインストールします。

②SDL2.0
本作では、SDL(Simple DirectMedia Layer)使って描画などの各機能を実現します。
sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-net-dev

③OpenSSL
天気予報や黄砂予報をWebサイトから取得する際、サイトによっては「https」でないとアクセスできないことがあります。今作では黄砂情報の取得先がそうでしたので、OpenSSLを使ってC言語のソケット通信にてhttps接続を行っています。

ラズパイには、元々OpenSSLのバイナリは含まれていますがヘッダは入っていないので、OpenSSLの開発パッケージをインストールしてヘッダファイルを取得します。
sudo apt-get install libssl-dev

アプリ用フォント

デスクトップは先のIPAフォントで良いのですが、フォトフレームアプリで表示する書体としては標準的すぎてイマイチなので、もう少し洒落っ気のあるフォントを使います。
M+FONTS

このフォントのインストールでは apt-get は使えないので、上記サイトからフォントファイル(mplus-TESTFLIGHT-*.tar.xz)をダウンロードして解凍し、出てきたファイルを次のディレクトリに置きます。

/usr/share/fonts/truetype/mfont/

実際使っているのは「mplus-2p-regular.ttf」と「mplus-2p-bold.ttf」の二つ。

なお、これ以外のフォントを使うには、フォトフレームアプリのソースコードの変更とビルドが必要になります。表示位置の微調整も必要かも知れません。

その他

Bluetoothアイコン・Bluetoothを無効にした。
 →タスクバー上のアイコンからOFFにできます。

「Mathematica」と「Wolfram」アイコン・アプリ起動アイコン「Mathematica」と「Wolfram」を消した。
 →アイコンを右クリック→アプリ起動バーを編集できます。

フォトフレームのラズパイデスクトップ
後はデザイン的なもの、タスクバーを下にしたり背景を変えたりテーマを変えるなどして、最終的なVNCからのデスクトップの見た目はこんな感じに。

この後、アプリケーション開発環境をセットアップしてフォトフレームアプリの開発を行いました。ソフトウェア

製作手順

制御基板を作る

ガラスコンポジット感光基板を使って、小型の制御基板を作ります。

より詳しく⇒プリント基板の自作!感光基板を使った作り方で簡単製作

自作フォトフレームの制御基板使う基板サイズは 75x100x1mm。

緑色は銅箔、灰色はジャンパーなどを表す補助線です。黄色は裏側(パターン面)の部品外形、青色は表側の部品外形です。

インクジェットフィルムへ印刷サンハヤトの感光基板専用インクジェットフィルムPF-3R-A4にパターンを印刷。
「photoframe-board.pbf」をmikanで開いて、外形、hole、solder、裏B、裏C の5つのレイヤを印刷します。

今回は裏面から見たデザインですので、必ず反転印刷するようにしてください。

感光基板の現像現像が終わったところ。

エッチング中エッチングしています。

エッチング液が少々古くてチョット汚い…

エッチング完了それでも、ちゃんとエッチングできました。

基板製作完了穴あけとカッティングを終えたところ。
薄くて加工しやすいガラスコンポジット基板なので楽勝です。

PICをハンダ付けするパターンPICをハンダ付けするパターン。
今回のPICは、SSOP-20パッケージ(0.65mmピッチ)ですが、さほど難しくはありません。

PICのハンダ付け2最初に、一番端のピンをハンダ付けして固定し、その後全ピンを一気に処理します。

NJM2732Vのハンダ付けNJM2732V はこんな感じです。

裏面終わったところ裏面終わったところ。

次は表面ですが、タクトスイッチとマイク、ピンソケット(40P)の、3つ以外の部品を全てハンダ付けします。

ラズパイとピンソケット表面が終わったら、次にピンソケットです。

設計上は、制御基板から2mm程浮かせてハンダ付けすれば良いんですが、念のため現物合わせをします。

制御基板の仮止めまず、制御基板を仮止めします。
スペーサーは、M3x3mmを2つ。

※写真ではタクトスイッチも付いていますが、本来はまだ付いていません。

ピンソケットのハンダ付けピンソケットをラズパイに挿入したら、ケースを完全に閉じてハンダ付けします。
これで高さが合いますね。

ソケットとラズパイ基板側も、2mmほど隙間を開けておきます。

裏面完成写真制御基板を外して軽く洗浄し、ハヤコートを吹き付けます。そしたらタクトスイッチとマイクをハンダ付けして、裏面完成です。

表面完成写真AE-RX8900は、J1端子をハンダ付けしてプルアップを有効にします。J2/J3は未接続。

最後にジャンパー線も配線して表面完成です。

マイクのハンダ付けマイクは表面でこの様にハンダ付け。

PICファームの書き込みここまで来たら、PICのファームウェアをビルドして書き込みます。

ラズパイを接続しなくてもPICKit3からのパワーサプライで動作するので、各I/Oやマイクアンプなどの動作確認をしておきます。

ラズパイケースを加工する

「photoframe_outline.zip」に含まれる、参考用の加工図面を参照してください。

マイク穴の穴あけまず、ケース上面の穴から6.5mm離れた位置にタクトスイッチ用の穴(Φ4)を開けます。

次に、基制御基板を仮止めしてマイクとボリュームの位置にキリで印を付けて穴を開けます。マイク穴はΦ5。

ボリューム調整穴ボリューム調整用穴はΦ2.5。

奥に見えるDCジャック奥に見えるDCジャックの中心をケーブルが通るように、幅10mmほどの切り欠きを入れます。

幅10mmほどの切り欠きを入れる作業ドリルやリーマーや精密ノコ、ヤスリなどを駆使して仕上げます。

まぁこの部分は下部にあって見えない部分なので適当で良いでしょう。

仕上がりイメージ仕上がりイメージ。

この大きさでは自由に抜き差しできませんが、年中通電する使い方をするので良しとします。

冷却用穴あけ最後に、ケース下部に冷却気流を作るための穴あけを行います。6.5Φで適当に開けました。
これをやらないと、結構熱がこもります。

これで、ラズパイケースの加工は完了です。

フォトスタンド(ケース)を作る

リアパネルの加工まず、リアパネルの加工。
「photoframe-case.pbf」を印刷し、キリで印を付けて穴あけを行います。

・液晶基板用:Φ2.5下穴(M3タップ)×4
・ラズパイ用:Φ2.5下穴(M3タップ)×4
・スピーカー用:Φ8 ×4(穴二つ接続加工)
・スタンド脚用:Φ3.5 ×2
・ケーブル用:Φ8 ×2(穴二つ接続加工)

タッピングしているところ8箇所の穴はタッピングします。(後ろにナットを付けるスペースがないため)

工具がないとかでタッピング加工ができない場合は、タッピングネジを使うとか工夫次第でなんとかできると思います。

リアパネル完了リアパネル完了。

スピーカーとケーブル用の穴は、ニッパーやヤスリなどを使って仕上げました。
結構疲れます。

次からアクリル板の接着を行っていきます。ポイントはアクリル接着を使うこと。他の接着剤ではハミ出たりして仕上がりが悪く、見た目も強度も弱いので失敗の元です。

アクリル接着剤 30ml 14-3201アクリル接着剤 30ml
注射器付き。水のようにサラサラした液体で、隙間に染み込ませて使います。アクリルだけでなくABS樹脂などにも使えます。

フォトスタンド枠の接着最初に枠組みを作ります。

枠組みの接着枠組みを接着します。図面に合わせてずれないようにしつつ…

重しを乗せて接着本などの重しを乗せて枠を固定し、アクリル接着剤を隙間に染み込ませていく感じで接着します。数分で結構強く固着します。

以上で、ケースは完了。

全体を組み立てる

最初に準備作業です。

QIコネクタ(6Pin)ケーブルを用意しておきます。

より詳しく⇒コネクタの自作!電子工作の圧着工具と圧着方法

コネクタケーブルの圧着PA-09を使って、芯線部は1.6mmダイス、被覆部は1.9mmダイスで圧着します。
液晶基板の電源ラインはAWG24、他の信号線はAWG28を使いました。
配線の長さはとりあえず25cmくらいにしておきます。

PA-09精密圧着ペンチ PA-09
小型コネクタ向けの圧着ペンチです。ダイスのサイズは1.0mm~1.9mmで、PH、EH、XH、QIコネクタ等が圧着可能です。

この時点では、まだハウジングには挿入しません。
今考えると、圧着作業は後で配線の長さが確定してからにした方が良いかも知れません。

ACアダプタプラグの加工ACアダプタのDCプラグを、音叉型のプラグに交換します。

音叉型プラグ用のジャックを使いますので、普通のプラグのままだと触っただけで電源が切れたりと、接触がかなり悪いです。

余計な出っ張りをカットする液晶基板の加工。
HDMIコネクタの端が無駄に出っ張っているのでカットします。カットしないと液晶に当たると思われます。

それから、表にある青LEDが明るすぎるので黒マジックで塗りました。

HTMLコネクタの保護カバーをカットHDMIケーブルコネクタの片方の保護カバーをカットしておきます。スペース的にギリギリなので、やっとかないと結構きついです。

液晶パネルの変換基盤の処理液晶パネルの裏面に、200×150 にカットした0.1mm厚のプラ板を貼り付けて絶縁します。
その後、変換基板をマスキングテープで固定。実際に組み立てると少し押さえられる形になるのでこれで十分かと思います。

液晶パネル固定スポンジ液晶パネルを後ろから軽く押さえる1cm角のスポンジを用意。
アクリルケース側に、両面テープで隅っこと真ん中付近に貼り付けます。

液晶基板のハンダ付け液晶基板の5V電源入力と、KEY1/2端子にコネクタケーブルをハンダ付け。
KEY端子のGND側は配線不要です。

CDSにもハンダ付けしておきます。

ステレオケーブルとスピーカーをハンダ付けステレオケーブルを切断し、スピーカーと接続する準備。

このケーブルは思った以上に高品質だったので少々もったいない。配線の色と内容は次のようになっていました。
赤:GND、青:R、銅:L

液晶基板とスピーカーを取り付けて配線し、ラズパイを取り付けます。配線のハンダ付け部分は熱収縮チューブを使います。

スピーカーの取り付け具合スピーカーの取り付け具合。

ラズパイとの接続コネクタケーブルにハウジングを取り付けて、制御基板にこんな感じで接続します。
確認のためACアダプタのプラグも挿入。

最終配線作業2マスキングテープや結束バンドも使いました。

CDSは宙ぶらりん状態にしましたが、何かで固定した方が良いかもしれません。

背面から見たところ背面から見たところ。

液晶パネルの取り付けいよいよ液晶パネルの取り付けです。FFCケーブルを接続してパタンと閉じる感じですね。
見ての通り、液晶基板を固定するビスは低頭ビスじゃないと液晶パネルに当たります。

FFCケーブルは多少折り曲げても大丈夫。
フォトスタンド脚の取り付けもしておきます。

枠紙の加工液晶パネルのフチを隠す枠紙を作り。
「photoframe-frame.pbf」を、厚手のマット紙に印刷して切り抜きます。0.22mm厚の両面つや消しを使いました。

四辺のビス穴は穴あけポンチを使いましたが、デザインナイフとかでもできそう。

枠紙完成加工完了。

フロントパネルの組み立てフロントパネルに取り付けます。

秋月でも売っている丸型両メネジ(10mm)と3mmの中空スペーサー、化粧飾止とM3x10mmの皿ビスを使います。(こういった物もパーツリストに記載しています)

化粧飾止化粧飾止のインナー。後ほど、これにキラキラしたキャップを取り付けます。

フロントパネルとリヤパネルを合体フロントパネルとリヤパネルを合体します。

フロントパネルとリヤパネルを合体こんな感じ。

フロントパネルとリヤパネルを合体制御基板が歪んでますが、仮止め的に適当に挿入しているからです。

真上から見たところケースを閉じて真上からみたところ。

底部を見たところ底部はこんな感じです。
なんとかいい具合にケーブルを引けました。

化粧飾止の取り付け具合化粧飾止もいい感じです。

フォトフレームの初期デバッグラズパイケースの上部のフタを外している状態だと、こんな感じでICSPできます。

フォトフレームに通電したところ通電&起動。
タクトスイッチを押して電源を入れます。SSHからgpio -g write 9 1と入力して液晶パネルをONにして、VNCで操作。

とりあえずRadioTunesで音楽を視聴してスピーカーのテストです。

完成裏面背中にラズパイを付けている姿は二宮金次郎スタイルとでもいいましょうか。

後、ラズパイの赤色LEDが明るすぎる気がしています。これもマジックで塗ったほうが良いかもしれませんね。

マイク感度調整用のボリューム(VR1)は、左に回すと感度が上がりますので感度最大(数Ω)にしておきます。後のマイク閾値設定と合わせて、必要に応じて感度を下げるようにします。

製作にオススメのアイテム
SL-54インスペクションルーペ SL-54
電子工作、特に表面実装部品のハンダ付けに超オススメ!というか、これがないと作れないと言ってもいいんじゃないでしょうか。
ハンドタップT型ラチェット式タップハンドル
ちゃんとしたものを作るには必ず必要になるといっても良いアイテム。使用頻度は高くないですが、あるととても助かります。
S120-K精密のこぎり S120-K
電子工作のケース加工やヒートシンクの加工などに重宝するのこぎり。折り畳めるので、省スペースで収納できるところも良い。

アプリをセットアップする

ハードウェアが完成したら、フォトフレームアプリのインストールと設定を行います。

フォトフレームアプリは、画像処理だけでなくGPIOを介して制御基板と連携しますので、これを起動しないと(手動でGPIOの操作をしない限り)LCDの電源も入らないし、タクトスイッチを長押ししてもシャットダウンや電源OFFができません。

アプリは、公開しているものをそのまま利用してもかまいませんし、必要に応じてカスタマイズすると良いです。次章ソフトウェアを参照してください。

インストール

ラズパイ側のファイルマネージャを使ってビルド済みのアプリを解凍し、出てきたファイル一式を「/home/pi/PhotoFrame/」ディレクトリ下にコピーするだけです。

フォトフレームアプリ一式(etc.. in ZIP)※令和対応済み

ディレクトリ構成

フォトフレームアプリディレクトリ構成設定や画像ファイルは、実行時のカレントディレクトリに置く必要があります。

標準では、実行ファイル(photoframe)を実行するときは、その位置をカレントディレクトリとします。

このビルド済みのアプリファイル一式では、サンプルとしてフリー素材によるいくつかの画像や鳥の鳴き声が、一定間隔で再生されるようにしてあります。

ちなみに、実行ファイルは、共有ディレクトリ経由でコピーしても属性が引き継がれないため、実行ファイルではなくなってしまいます。Windows上で解凍せずに、SSHやVNCを使ってラズパイ上で解凍&コピーしてください。

起動と終了

通常は自動起動になりますが、テストやデバッグなどで手動で起動したい場合。

VNCを使って、ラズパイ側のファイルマネージャから実行ファイルをダブルクリックで起動できます。この場合、カレントディレクトリは実行ファイルと同じ位置になります。

終了は、アプリ画面を右クリックです。

もしうまく動作しない場合は、最初のセットアップ-ラズパイのセットアップにある手順を全て実行しているかを確認します。

自動起動の設定

GUIアプリの起動なので、Windowsのスタートアップに相当する、デスクトップの autostart を利用します。

SSHより次のコマンドを入力し、
sudo nano ~/.config/autostart/photoframe.desktop

次の内容を記載します。

ここでは、コマンドライン引数で実行時のカレントディレクトリを指定しています。
この引数が指定されていると、ラズパイの電源ONによる自動起動とみなし、システムが安定するまで20秒待機してから動作を開始するようになっています。

保存したらsudo rebootで再起動し、次のように動作することを確認。
・OS起動後、20秒ほどで液晶パネルが表示されること。
・タクトスイッチ長押し後、15秒ほどで電源OFFすること。

スケジュールがない場合は、すぐにシャットダウンして待機モードに入ります。

動作を設定する

アプリケーションの設定

アプリ一式に含まれる設定ファイル「Setting.ini」を編集します。また、表示させたい画像ファイル(JPG or PNG)や音声ファイル(MP3)を所定の位置に配置します。

設定ファイル(Setting.ini)

・稼働時刻(1時間単位で有効無効を設定)
・画像表示時間(秒)
・カレンダー表示時間(秒)
・天気予報表示時間(秒)
・天気情報クエリ設定 ※制限事項を参照のこと
・黄砂/PM2.5予報表示時間(秒)
・黄砂/PM2.5情報クエリ設定 ※制限事項を参照のこと
・特別画像表示設定(ファイルパスとワイルドカード日時)
・特別画像表示時間(秒)
・サウンド再生設定(ファイルパスとワイルドカード日時)
・スタートアップ時に再生する効果音

再生ファイルの配置

各ディレクトリにファイルを置きます。

calender ディレクトリ
日めくりカレンダーの1月~12月までの背景画像ファイル。2048×1536サイズを配置します。ファイル名は、image01.jpg~image12.jpg です。

photo ディレクトリ
任意の通常表示画像ファイル。中にサブフォルダを作って置いてもOK。画像は 2048×1536サイズを、左に90°回転させた 1536×2048 で配置します。

たくさんある場合は一括で変換しないと大変です。当方ではフリーの画像編集ソフト XnView を使いました。XnView(窓の杜)
XnView 一括変換設定ファイル

special ディレクトリ
任意の特別表示画像ファイル。配置方法はphotoと同じです。

sound ディレクトリ
任意の音声ファイル。

制御基板の設定

タクトスイッチを操作して、次の設定を行います。

マイク閾値設定(誰もいないと判断する検知音量)
人が居ないくらい部屋を静かにして、その時の検知音量を記録させます。その音量以下の時は誰も居ないと判断されます。
通常稼働している時に、制御基板のLEDで音の検知状態がわかるので確認してください。静かな時は消灯していますが、喋ったり物音がすると点灯します。

光量閾値設定(就寝消灯したと判断する光量)
夜間に部屋の電気を消して、その時の光量を記録させます。その光量以下の時は就寝したと判断されます。

最大光量設定(バックライトを最も明るくする光量)
部屋の中を一日で一番明るい状態にして、その時の光量を記録させます。バックライトの自動調整で使います。

バックライト操作原点
バックライトの明るさ調整の現在の設定値について、液晶パネル側と制御基板側との間で認識のズレをなくすために行う設定です。
液晶パネルは、バックライト操作によって設定された値を不揮発性メモリに記録しているため、一度ズレると電源を切ってもズレたままになるんですね。

デフォルトは当方環境での大体の値になっていますので、正式設定する必要があります。設定操作の方法はソフトウェア-制御基板-設定操作についてを参照してください。

ソフトウェア

制御基板側

開発環境は C言語(MPLAB XC8)です。
PICのクロックは、内蔵OSCで500KHz駆動。

タイマ割り込み処理にて、マイクの音量検知やCDSの光量検知、LEDのブリンク処理を行っています。メインループでは、ウェイトなしでグルグル回っています。

フロー図

稼働モード(通常稼働時)
制御基板フロー図(稼働モード)

待機モード(スタンバイ時)
制御基板フロー図(待機モード)

状態遷移図

制御基板の状態遷移です。操作遷移も表しています。

制御基板の状態遷移

設定操作について

稼働モード又は待機モードの時にタクトスイッチを押すと、設定モードに入ります。その後、希望の項目を選び、そこで長押しするとその設定が実行されます。
※上の状態遷移図を参考にしてください。

設定モードでは、LEDの点滅で状態を確認できます。

設定モード時のLED点滅イメージ
マイク閾値
長押しすると、約11秒後に4秒間、音量検出と記録の処理が行われます。11秒は長いですが、操作音が影響しないようにするためです。

CDS閾値、最大光量:
長押しすると、約3秒後に4秒間、光量検出と記録の処理が行われます。

バックライト原点
長押しすると、約3秒後に設定実行中になります。バックライトが最大の明るさになるまでタクトスイッチを押した後、再度長押しすると設定が記録されます。

なお、設定値はPIC内臓のEEPROMに記録されるので、電源を断っても保持されます。

ソースとビルド

ソース一式を解凍し、出てきた Controll フォルダをパソコン上の適当な場所にコピーして、MPLAB X で開けばビルドできます。

ソースファイル(c/hファイル in ZIP)

使用したIDEのバージョンは下記の通り。以降のバージョンでも問題ないでしょう。

MPLAB X IDE:v4.15
XC8:v1.45

MPLAB- X IDE | Microchip Technology Inc.

※追記(2018/09/21)
最近、XC8コンパイラがv2.00にバージョンアップし、デフォルトがC99になっています。そのため、v2.00以降でそのままコンパイルすると割り込みハンドラの記述でエラーになりますので、C90に設定するか、次のように変更する必要があります。

これまで:void interrupt Interrupt(void)
v2.00以降:void __interrupt() Interrupt(void)

書き込みやデバッグには PICkit3 を使いました。

PICkit3PICkit3
Microchip正規品。PICへのプログラムの書き込やデバッグができます。最近では安い中国製の互換品も出回っていますが微妙です。

定数値の調整
「部屋が静かになって何分したら待機モードになる」とか、そういったパラメータはソース上で #define していますので、必要に応じて調整します。

ラズパイ側

フォトフレームアプリは C/C++ で開発し、SDL2を使っています。

SDL2には、基本機能に加えて4つの拡張機能(SDL_image, SDL_mixer, SDL_net, SDL_ttl)が用意されていますが、全ての拡張機能を使っています。

利用している主なSDL2のAPI

SDL_CreateWindow()…ウィンドウの作成
SDL_GetWindowSurface()…ウィンドウのサーフェイスを取得
SDL_CreateRGBSurfaceWithFormat()…サーフェイスの作成
SDL_FillRect()…サーフェイスを塗りつぶす
SDL_BlitSurface()…サーフェイスのコピー
SDL_UpdateWindowSurface()…ウィンドウの全体を更新
SDL_UpdateWindowSurfaceRects()…ウィンドウの一部を更新
SDL_CreateSoftwareRenderer()…2Dレンダラの作成
SDL_CreateTextureFromSurface()…サーフェイスからテクスチャを作成
SDL_RenderCopyEx()…テクスチャをレンダラにコピー
IMG_Load()…画像ファイルのロード
TTF_OpenFont()…フォントのロード
TTF_RenderUTF8_Blended()…テキストのレンダリング
Mix_LoadMUS()…音声ファイルのロード
Mix_PlayMusic()…音声ファイルの再生
SDLNet_ResolveHost()…ホスト名解決
SDLNet_TCP_Open()…ソケット接続
SDLNet_TCP_Send()…ソケット送信
SDLNet_TCP_Recv()…ソケット受信

SDL 2.0 日本語リファレンスマニュアル

フロー図

全体の処理を大まかに表したフローです。

フォトフレームアプリフロー図

クラス構成

全部で8つの小規模クラスで構成されています。

主なクラス
CApplicationメインメッセージループ処理を含んでいて、各処理の呼び出しの起点となるクラスです。サウンド再生も含まれます。
CDisplay全ての描画処理を含んでいます。フォントや表示をカスタマイズする場合は、このクラスを改修します。
CWeather天気予報を取得するクラス。天気情報の取得方法を変更したり、別の実装にする場合は、このクラスを改修します。
CKosaPM2.5や黄砂予報を取得するクラス。https接続にて取得します。別の実装にする場合は、このクラスを改修します。
CCtrlBoard制御基板を抽象化したクラス。
GPIOへのアクセス処理を記述しています。
CScadulerスケジュール管理。
次の予定時間の算出や、RTCアラームをセットしたりします。

開発環境のセットアップ

NetBeans を使って、普段使っているパソコン上からラズパイのリモート開発が簡単にできます。(内部的にはSSHを使って実現されている)
コンパイルやデバッガはラズパイ上で動作しますので、それをリモート操作する感じになります。

※追記(2021/03/21)NetBeans は2016年にOracleからApacheに譲渡されています。現在リリースされているもの(NetBeans 9以降)は、本作で使った NetBeans 8.2 とは若干仕様が異なっていて、日本語環境も整っていません。

Oracle、統合開発環境「NetBeans IDE」をApacheソフトウェア財団へ譲渡

今のところ、NetBeans8.2 はOracleの次のページからダウンロード可能なようですが、いつ消えるかわらないですね。
NetBeans8.2のダウンロードページ

NetBeans 9以降で本作の開発ができるかどうかは試していませんが、多分大丈夫・・?

NetBesans のダウンロードとインストール。
サポートテクノロジーを選べますが、本作では最低限C/C++があれば大丈夫です。
※サポートテクノロジーの選択が出ないインストーラの場合は、インストール後プラグインの設定で「C/C++」を有効にします。

NetBeans IDE ダウンロード

リモート開発に必要な設定。
ビルドホストにラズパイを登録するだけで、リモート開発ができるようになります。

NetBeansビルドホストの登録新規ホストの追加で、「PHOTOFRAME」を追加します(ホスト名を RaspberryPi → Photoframe へ変更してあるので)

この時、設定を済ませた(少なくともSSHを使えるように設定した)ラズパイを起動しておけば、接続リストに自動的に表示されるので選択するだけでOKです。

ビルドホストにラズパイを登録したところpiユーザーとパスワードを入力していくと、最終的にこのように登録が完了します。

これで、リモート開発の準備はできました。後はプロジェクトで、今追加したビルドホストを選択するだけです。

ビルドホストにプロジェクトを作成ビルドホストはプロジェクトのプロパティーで設定することもできますが、このように右クリックすることでも、そのホスト上にプロジェクトを作ることができます。

ホストとの接続が切れると、プロジェクト内のファイルはリードオンリーになって編集できなくなります。左のコンテキストメニューの「接続」で再接続します。

デフォルトでは、プロジェクトは「/home/pi/NetBesansProjects/{ProjectName}/」に作られ、ソースコードもそこに格納されます。

ビルド後の実行ファイルは、/home/pi/NetBesansProjects/{ProjectName}/dist/」下に出力されます。

ソースとビルド

ソース一式を解凍し、出てきた PhotoFrame フォルダをファイル共有を使って、/home/pi/Projects/下に配置します。

ソースファイル(c/hファイル in ZIP)

フォトフレームアプリソースの配置このように配置します。

※NetBeans のデフォルトのプロジェクト置き場は「/home/pi/NetBesansProjects/」ですが、長いので「Projects」に変更しました。

「build」と「dist」はビルドすると自動的に作られます。

フォトフレームアプリソースを開く1NetBeans を起動し、登録したビルドホストを右クリックして「プロジェクトを開く」を選択。

フォトフレームアプリソースを開く2/home/pi/ 以下のファイルリストが表示されるので、先程コピーした PhotoFrame を選択してプロジェクトを開きます。

ビルドすると「dist」下に実行ファイルができます。

デバッグ方法

NetBeans でリモートデバッグできるんですが、一つ問題があります。

それは、普通にデバッグを開始すると、コンソールベースで起動されるためか、SDL_Init() によるビデオの初期化でエラーになってしまうということです。

なので、VNCを使いファイルマネージャからダブルクリックで普通に起動した後、[デバッグ]メニューにあるデバッガのアタッチを使ってデバッグしました。

GDBの起動設定あたりでなんとかできる?とは思うんですが、よく分かりません。

制御基板とラズパイの連携

制御基板とラズパイ間の制御シーケンスです。

ラズパイの起動

シーケンス(ラズパイの起動)

ラズパイ側からのパネル制御

シーケンス(ラズパイ側からのパネル制御)

ラズパイ側からの終了

シーケンス(ラズパイ側からの終了)

制御基板側からの終了

シーケンス(制御基板側からの終了)

制限事項など

当然ですが、環境音が大きい環境、例えば、交通、ペット、家電、近隣騒音などある場合には、生活音検知による自動スタンバイは、うまく動作しないかもしれません。

でも、自動でスタンバイにならないというだけで、フォトフレームとしては普通に動作します。使い方によっては稼働時間の設定だけで事足りるでしょう。

天気予報や黄砂予報の取得について

当記事で公開しているソースに含まれる天気予報や黄砂情報の取得機能は、当方が個人的に利用するために作成したプログラム例を紹介するものです。特定の地域以外での動作確認も行っておりませんし、HTMLの仕様変更があるとコードの改修も必要になるかも知れません。

ですので、情報取得のための設定(URLのクエリ部分)は空文字としています。

このような目的のために、天気情報を取得できる無料のサービスがありますので、ある程度のスキルは必要ですが、そういったところを利用されることをおすすめします。

OpenWeatherMap

ダウンロード・ツール

製作に使用した全ファイルです。無断で二次配布することはご遠慮ください。ご紹介いただく場合は当記事へのリンクを張ってください。連絡は不要です。

制御基板 回路図(pngファイル)
制御基板 パターン図(pbfファイル in ZIP)
フォトスタンド加工図(pbf/pngファイル in ZIP)
全パーツリスト(タブ区切り)
フォトフレームアプリ一式(etc.. in ZIP)※令和対応済み
ソースファイル一式(c/cpp/hファイル in ZIP)
XnView 画像一括変換設定(xbsファイル in ZIP)

秋月電子 液晶パネル設定:config.txt
ラズパイOS:Raspberry Pi Downloads
フォトフレームアプリ用フォント:M+FONTS

pbfファイルを開くツール:mikan基板CAD
PICファームウェア開発環境:MPLAB-X IDE
フォトフレームアプリ開発環境:NetBeans IDE
ターミナルソフト:Tera Term(窓の杜)
VNC Viewer:Download VNC Viewer
画像加工ソフト:XnView(窓の杜)

参考

Raspberry Pi(ラズパイ公式)
Raspberry Pi 2 Model B の回路図

SDL 2.0 日本語リファレンスマニュアル

ポケットサウンド(フリー効果音素材)
ウェザーニュース