7色カラー表示電子ペーパーを使ったフォトフレーム


はじめに

以前モノクロの電子ペーパーを使用してフォトフレームを作成しましたが,やはりモノクロでは表現力がいまいちでした. 7色表示が可能なカラーの電子ペーパーを入手したので,これを使ってフォトフレームを再度作りました.

ハードウェア

回路図
配線した状態
カバーを付けた状態

今回使用したカラーの電子ペーパーは,Waveshareの5.65inch e-Paper (F)というものです. 解像度は600x448で,色は黒,白,緑,青,赤,黄,橙の7色を表示できます. 前回使用した素の電子ペーパーデバイスと異なり,3.3Vを与えてSPIでデータを送るだけで簡単に画像を表示できます.

電子ペーパーの制御にはESP32を使います. 画像データをESP32のフラッシュメモリに格納するため,通常より大きい16MBのフラッシュメモリを搭載したものを使いました. 電源は単3電池2本を使い,未使用時はESP32をディープスリープさせます. この電子ペーパーはスリープ時にも550μA程度の電流を消費してしまうので,FETを使って未使用時には電子ペーパーに電流が流れないようにします. 画面書き換え時の消費電流は,ESP32と電子ペーパーを合わせて55mA程度でした.

2つのタクトスイッチを使って,表示する画像を切り替えたりデータ転送のモード切り替えを行います. ディープスリープからの復帰に使う場合はマイコンの内部プルアップ機能が使えないので,抵抗でプルダウンしています.

電子ペーパーは写真立てに収めて,裏側は3Dプリンターでカバーを作りました.

ソフトウェア

動作モード

このフォトフレームは通常はディープスリープでマイコンを停止しています. 設定したスリープ時間が経過するか,2つのタクトスイッチからの入力があると以下の動作を行います.

設定モードでは,アクセスポイントモード(親機)でHTTPサーバーを動かします. スマホやタブレットで接続して,転送モードで使うアクセスポイントのSSID,そのパスワード,およびスリープ時間(単位は秒)を設定します (任意のキーと値のペアを登録できるので,それぞれ"SSID","PASS","SLEEP"というキーに対する値として登録します). 設定した値はフラッシュメモリ上に保存されます.

画像転送モードでは,ステーションモード(子機)でアクセスポイントに接続してFTPサーバーを動かします. FTPクライアントソフトで接続して,画像ファイルのアップロードや削除を行います. ESP32のデータ領域のフラッシュメモリは,LittleFSをファイルシステムに使いファイルを管理しました. フォトフレームで表示させる画像ファイルは全てルートディレクトリに置きます. 前回のモノクロ版フォトフレームではWebのユーザーインターフェースでファイルをアップロードしましたが,多数のファイルをコピーしたり削除するのが面倒でした. そこで今回はWindowsやLinuxからファイル操作が行いやすいようにFTPを使うようにしました. ArduinoのライブラリにあったSimpleFTPServerというものを使用しました. ESP32用のSimpleFTPServerはデフォルトではファイルシステムとしてSPIFFSを使うので,LittleFSを使う場合はFtpServerKey.hのDEFAULT_STORAGE_TYPE_ESP32をSTORAGE_SPIFFSからSTORAGE_LITTLEFSに変更します.

画像データ

表示する画像データは,GIFフォーマットで格納することにしました. デコードのアルゴリズムがそれほど複雑ではなく,圧縮してサイズを減らすことができ,また既存の画像ビューアーでの確認が容易にできます.

このpalette.pngという7色のパレットを含む画像を使用して,以下のようにImageMagickのconvertコマンドとPythonを使い適切な色とサイズを持つGIF画像へ変換しました.

convert INPUT.jpg -rotate '-90<' -dither FloydSteinberg -resize 600x448 -gravity Center -extent 600x448 -remap palette.png tmp.png
python3 -c "from PIL import Image;img=Image.open('tmp.png');pal=[0,0,0,255,255,255,0,255,0,0,0,255,255,0,0,255,255,0,255,127,0];img.save('OUTPUT.gif',interlace=False,palette=pal,comment='');"

画像フォーマットを決め打ちしているため,色数やサイズが異なったり,コメント等の拡張情報が存在するファイルは表示できません. 16MB版のESP32でデータ領域を最大限使用するために,Arduino IDEの"No OTA (1MB APP/3MB SPIFFS)"の設定を変更しSPIFFS用メモリに12MB追加して,16MBのフラッシュメモリのうち1MBをプログラム,15MBをSPIFFS (LittleFS)で使うようにしました. 画像にもよりますが,1ファイルの大きさは70kB程度となったので,200枚以上格納することができます.

GIFファイルのデコーダーは自前で用意しました. メモリを節約するために,1ラインをデコードするたびに電子ペーパーへデータを転送します. パソコン上では動いたコードがESP32で暴走することがありましたが,少し大きめのローカル変数を確保してスタック領域があふれていたようだったので,ヒープメモリを使うようにしたら直りました. 電子ペーパーに描画を行う場合,仕様書では最初に画像の消去を行ってから新しい画像を表示するよう指示されていますが,その場合2倍の描画時間がかかるのと現状では残像等の問題は起きていないので,消去処理は省いています.

使った感想

表示例1
表示例2

電源を切っても表示できるカラーの電子ペーパーはおもしろいデバイスだと思います. 前回作成したモノクロのフォトフレームに比べて,よりフォトフレームらしくなりました. しかしながらフォトフレームとして使うにはまだいくつか問題があります. 例えば,コントラストが低くて描画に時間がかかります(約30秒). また7色しか使えないためディザリングを適用していますが,そのため解像度がかなり悪化します. 画像によっては比較的きれいに表示できますが,色使いが複雑で細かい画像の表示は得意ではありません. 改良すべき点として,バッテリー残量も表示すれば便利だったと思います.

ダウンロード


[Back]
2022-04 製作
2022-05-10 ページ作成
T. Nakagawa