A4サイズの壁掛けGoogleカレンダーを作る
前回、電子ペーパーの卓上カレンダーがほしいという望みは達成されました。
出来上がった卓上カレンダーを見ていると次の欲望が湧いてきました。「じゃあもっと大きい電子ペーパーを使えば壁掛けサイズができるよね?」
できた。
それだけだとつまらないので、レシピを書いておきます。
材料
電子ペーパー
卓上カレンダー(7.5インチ)の時と同じWaveshareが13.3インチの赤黒白電子ペーパーを出しているので、こちらを使いました。AliExpressとかにあります。
サイズに関しては注意が必要で、私はA4サイズと呼んでいますが実際にA4サイズと同じなのは短辺だけで、長辺は少し短いです。このA4サイズぴったり同じな短辺もフォトフレームに嵌め込むときギリギリで、迂闊に作業すると電子ペーパーが割れます。ていうか割りました。
マイコン
これも卓上カレンダーと同じくESP32-S3-WROOM FN8R8を使いました。ESP32のボードはもっと安いのがたくさんあるのですが、このボードのいいところはFlash 8MB、PSRAM 8MBと余裕がありmicro SDカードスロットも付いているところ。カメラは要らないので本当はこれのカメラ無し版が欲しい。
フレーム
ダイソーでA4用の木目調フォトフレームを買ってきて使いました。電子ペーパーは実際の紙ほど白くなく、ちょっとグレーっぽい色をしているので、フレームは濃い色の方が内側が明るく見えます。ただしバックライトも何もないので、フレームが厚すぎると内側に影が落ちます。何枚も試すとそういうことが分かってきた。
ただし上記のように縦用のフックしかついていないものもあるので…今回は横用のフックがあるフレームの背面だけを移植して流用しています。
保護フィルム
100円ショップのフォトフレームにもプラスチックの保護カバーが付いているのですが、フォトフレームによってはこのカバーがテラテラ反射して見目麗しくありません。電子ペーパーは自発光しないので、グレアフィルムよりノングレアフィルムが向いています。ただ、世に出回っている保護フィルムはノートPC用が多くてなかなかA4サイズのものがなく…探し回っているとエレコムのカットして使うやつを見つけました。
このフィルムがカット無しだとちょうどA4サイズです。マイコンと同じくらいの値段するんですが、サイズ的に使いやすいのがこれしかない。値段の分ノングレアで綺麗です。
ブレッドボード
卓上カレンダーの時はESP32ボードのピンヘッダにそのまま電子ペーパー側のジャンパーを繋いだりしていましたが、配線を横向きにしてスッキリさせたり電池駆動にしたりということを考えるとブレッドボードに装着したほうが便利そうです。
サンハヤト SAD-101 ニューブレッドボードを使いました。
このSAD-101の何がいいかというと、穴が一列に6個あるんですよね。多くのブレッドボードは5個なんですが、5個だとESP32ボードを刺した時片側はボードだけで埋まってしまうんです。6個だとかろうじて1個2個穴が使える。
バッテリー
卓上カレンダーの時はコンセントから電源を取っていましたが、壁掛けとなるとそうも行かないので、乾電池やモバイルバッテリーを試しました。結果ダイソーのモバイルバッテリーが必要十分だったので、これを使っています。
モバイルバッテリーは流れる電流が一定値を下回ると、充電が終わったと判断して給電が止まるものがあります。しかしこのダイソーのモバイルバッテリーは、少なくとも上記のESP32ボードではDeep sleep状態でもちゃんと給電が続きます。そしてメチャクチャ安い。
ケース
ブレッドボードやバッテリーをフォトフレーム背面に固定するためのケースは、ダイソーやキャンドゥに売っているシールケースを利用しています。
このケースのいいところは、電子ペーパーの下側出ているフレキケーブルをちょうど通せる穴が開いているところと、
上部にフックにかけられるような穴があることです。これに紐を通すことで、万が一両面テープが剥がれてもケース部分の落下を防ぐことができます。
コードフック
特筆しておきたいのがキャンドゥで見つけたコードフックです(左側)
この小さい方のコードフックが、電子ペーパーのDriver HATボードを固定するのにぴったりなのです。ブレッドボードやバッテリーは厚みがシールケースにぴったりなので、コードフックなどで水平位置を制限すれば貼り付ける必要はありません。
USBケーブル
USBケーブル(Type A→Type C)も100円ショップにありますが、10cm程度のケーブルでは上のような配置だと短すぎます。今回は家に落ちていた20cm程度のケーブルを使いましたが、まあ美しくないですね…
材料費
上記諸々を合計するとこんな感じ。
だいたい3万2000円で出来ます!
同じ3万円ならEcho Show 15を買ったほうが色々機能もついていて安い!
そう、電子ペーパーって液晶より高いんですよね…
コード
卓上カレンダーの時とほぼ同じですが、毎日0時5分くらいに更新した後1日Deep sleepするコードが追加されています。あと後述の省電力化の色々。
ハマりポイント
とか言って卓上カレンダー(7.5インチ)の時と微妙に電子ペーパーの仕様が違ってハマったポイントがありました。それは…
BUSY信号
7.5インチの電子ペーパーと13.3インチの電子ペーパーではコマンド体系が違うのですが、そこはサンプルコードをコピペしてくれば使えます。ちょっと妙な違いとして、電子ペーパー更新中にHIGHになるBUSY信号線が、7.5インチの場合はSleepコマンドを送信したあとLOWになるのに対し、13.3インチの場合はHIGHのままです。このため、サンプルコード同様にBUSY信号線がLOWになるのを待っているといつまでも返ってきません。
省電力化
さて、最初は7.5インチとほぼ同じコードを使っていたのですが、乾電池で動かしてみるか…と思ってやってみたところ4本の単三電池が一週間で切れました。5000 mAhのモバイルバッテリーも同じくらい。もうちょっと持ってほしいですよね…というわけでいくつか省電力化の工夫をすることにしました。
Wi-Fiをすぐにオフにする
この壁掛けGoogleカレンダーのコードは以下のような動作をします。
SDカードから設定を読み出す
Wi-Fiに接続する
NTPで時刻合わせを行う
Googleカレンダーの.icsをダウンロードし、当月分を抜き出す
祝日カレンダーの.icsをダウンロードし、当月分を抜き出す
LovyanGFXを使用して表示内容を作成する
電子ペーパーに表示内容を転送する
電子ペーパーの更新を待つ(20秒くらいかかる)
次回(0:05)にWakeするよう設定してDeep sleepに入る
この流れで見落としていたのが電子ペーパーに表示する間Wi-Fiがオンのままじゃない?という点です。電子ペーパーに表示内容を送信した後は、ほとんどの時間が電子ペーパーの更新待ちとなるので、その間Wi-Fiをオンにしておく必要はありません。特にどこかにアクセスしているわけではないにせよ、ダウンロードが終わったらすぐに切るようにしました。
電子ペーパー更新中にLight sleepする
上記の電子ペーパーの更新待ちは、BUSY信号がHIGHからLOWに変わるのを待ちます。ESP32にはGPIOの状態を監視して、指定した状態になったらSleepから復帰する機能があるので、どうせならこれを使ってみます。
今回使用した13.3インチの電子ペーパーの場合、全画面更新には22秒かかります。上記2点の変更で、この間のWi-Fi消費電力やCPUの消費電力をちょっと節約します。
ダウンロードを少なくする
おそらく一番電力を消費するポイントは、Wi-Fiを使用してGoogleカレンダーからデータをダウンロードしてくるところです。この壁掛けGoogleカレンダーでは自分のGoogleカレンダーに加えて日本の祝日カレンダーもダウンロードして、祝日は赤色で表示するようになっていますが、祝日カレンダーのような更新頻度が低いものを毎日ダウンロードする必要はないわけです。
そこで、当月分の祝日をダウンロードしたら内容をESP32のフラッシュメモリにキャッシュしておき、月が変わるまではキャッシュを使用することで、毎日祝日カレンダーをダウンロードすることを防止できそうです。
で、実際どうなの…
Echo Show 15より高価な壁掛けGoogleカレンダーですが、実際使ってみると結構いいです。自発光しないので、夜中に更新がかかっても気づきません。土日祝日を派手な赤色にできるのもなかなか世の電子カレンダーに無い機能で、「今日は休みじゃーん!」の実感が違います。
省電力化の検証中とはいえ液晶画面に比べると圧倒的に省電力なので、モバイルバッテリーで動作するため電源コード不要の壁掛けにできます。コンセントからの配線を考えなくていいし、見た目もスッキリします。
ダイソーのモバイルバッテリーはカレンダー更新中、つまり電力消費が大きくなると残量を表示しますが、Deep sleep中は残量表示のLEDも消えます。ただ給電は続くので、一日後にまたカレンダー更新されます。
未来へ…
そんなわけで結構いいものが出来ましたが、まだ改良の夢があります。
省電力化
一ヶ月に一回くらいのバッテリー充電頻度になったらいいですねぇ…あと、最近のモバイルバッテリーって最近のスマホ用なので最低5000 mAhくらいなんですよ。より省電力化すればもっと小さいバッテリーを使えて、背面もスッキリするはずです。
Google Calendar API
これは前から考えていることですが、URL指定だけでログインも何も要らない.ics仕様の方が利便性は上かも…
天気予報
世のカレンダーアプリには結構ついてるんですよね、直近一週間くらいの天気予報表示機能。OpenWeatherMapのAPIなら日に1000回は無料らしいから使ってみたい。
他のESP32ボードを使用する
今回はフラッシュメモリ8MB、PSRAM 8MBの余裕のあるボードを使いましたが、実際そんなに使用してないんですよね…電子ペーパーが960 x 680、黒表示用に1ビットと赤表示用に1ビットなので163,200バイト。この163KBは画面表示用に使用する必要があるので…後はライブラリとカレンダー情報がどれくらいメモリを使用するか。
で、試しにRAMが520KBのM5Stack Basicにカレンダーを表示させたら出来たので…頑張れば(分割したりいろいろ)PSRAM無しでも行けるんじゃないか…?と思いつつあります。
あとmicro SDカード。設定を読み込ませるために便利なのでついつい使ってしまうんですが、HTTPサーバーを動かして初回はそれで設定を行う方法も取れそうです。これもM5Dialでやっているのでなんとかなるのではないか。
PSRAMやmicro SDスロットが要らないとなればボードの選択肢も増えて、不要なカメラ付きボードじゃなくても作れるようになるはずです。
…なんで市販品が無いんだ、壁掛けGoogleカレンダー?規約上なんかあるのかな…