電子ペーパーカレンダー(Googleカレンダー同期)作ってみた:序

7 min read読了の目安(約6300字

2017年にMagic Calendarというデバイスが発表されました。
※YouTube紹介動画:https://www.youtube.com/watch?v=2KDkFgOHZ5I

すごく欲しいと思ったのですが、何年経っても発売どころか続報が全く出てこない状況です。
そこで電子ペーパーもドライバーボードも、どこで買えるの?どうやって使うの?レベルの初心者ですが、自分で似たようなものを作ってみました。

本記事はその備忘録です。

長くなりそうなので記事をいくつかに分けます
序:本記事。材料の調達からサンプルプログラムの動作確認。
破:執筆中。カレンダー描画機能の作成、Googleカレンダーとの予定同期機能の作成。

(ほぼ)完成品

作り方

材料

ハードウェア

合計で5000円弱でした。2020/11/28 に注文し、2020/12/21 に届きました。
国内のお店で代替品があれば、そちらで購入した方が早く入手できて良いと思います。
esp32とe-paper

この他esp32はmicroUSB端子で給電、PCと通信を行いますが、それにはスマホ用などで家にあった適当なUSBケーブルを使用しました。

ソフトウェア

基本的にはESP32のWikiとDocumentを読んでいくことになります。
E-Paper ESP32 Driver Board

私の開発環境はWindows10のため、以降はそれを前提に説明していこうと思います。

  • Arduino IDE

  • Arduino-ESP32.zip

    1. Arduinoディレクトリ配下の、下記のパスを開く(なければディレクトリを作る)
      C:\Program Files (x86)\Arduino\hardware\espressif\esp32
    2. そこに下記リンクからArduino-ESP32.zipをダウンロードし、展開する。
      https://codeload.github.com/espressif/arduino-esp32/zip/master
    3. 下記ファイルを管理者として実行する。
      C:\Program Files (x86)\Arduino\hardware\espressif\esp32\tools\get.exe
    4. Arduinoを起動し、ツール > ボード > ESP32 Arduino > ESP32 Dev Module を選択する。
      ESP32 Dev Module
  • ESP32サンプルプログラム

    1. 下記リンクを開く
      https://www.waveshare.com/wiki/File:E-Paper_ESP32_Driver_Board_Code.7z
    2. E-Paper_ESP32_Driver_Board_Code.7zをダウンロードする。
    3. 適当なディレクトリに展開する。
    4. サンプルプログラムのライブラリファイルをArduinoのインクルードディレクトリにコピーする必要があります。
      examples\esp32-waveshare-epd\srcフォルダをC:\Users\ユーザ名\Documents\Arduino\librariesにコピーしておきます。
    ここから ここへ

組み立てと動作確認

  1. e-PaperとESP32を接続します。差込口の反対の黒い部分を上に引き上げるとケーブルが抜き差しできます。[1]

    直接接続する場合 ケーブル接続する場合[2]
    直接接続している写真 ケーブル接続している写真
  2. 使用しているe-Paperに合わせてスイッチ(画像赤枠)を切り替えます。
    User Manualの表によると、今回使用する4.2inch e-PaperはBにセットすべきようです。

  3. USBケーブルでPCと接続します。
    接続すると、赤いライト(右下)が点灯しました。テンション上がりますね。
    スイッチセット画像

  4. E-Paper_ESP32_Driver_Board_Code.7zを展開して出てきたフォルダの中から、
    E-Paper_ESP32_Driver_Board_Code\examples\esp32-waveshare-epd\srcを確認します。

  5. サンプルプログラム[3]epd4in2bc-demoをArduinoで開きます。

  6. 選択できるシリアルポートを選択します。

  7. 左上の ➡ ボタンを押して、サンプルプログラムをコンパイルしてESP32に書き込みます。

    しばらくすると、以下のような出力とともに、書き込みが完了します。

最大1310720バイトのフラッシュメモリのうち、スケッチが269637バイト(20%)を使っています。
最大327680バイトのRAMのうち、グローバル変数が16316バイト(4%)を使っていて、ローカル変数で311364バイト使うことができます。
esptool.py v2.6
Serial port COM3
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: ac:67:b2:00:98:6c
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 10922.6 kbit/s)...
Hash of data verified.
Compressed 17392 bytes to 11186...
Wrote 17392 bytes (11186 compressed) at 0x00001000 in 0.2 seconds (effective 818.4 kbit/s)...
Hash of data verified.
Compressed 269760 bytes to 120948...
Wrote 269760 bytes (120948 compressed) at 0x00010000 in 2.2 seconds (effective 978.7 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 2730.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
  1. 15秒超の激しい明滅の後に、以下のようなイメージが表示されることを確認できました。
    表示1 表示2

動作確認2(WiFi)

E-Paper_ESP32_Driver_Board_Code直下のLoader_esp32wfがWiFi接続を行うサンプルのようです。

  1. こちらも同様にArduinoで開きます。
  2. srvr.hを開き、PCが接続しているWiFiのSSIDとパスワードを記入します。
    srvr.h
  3. コンパイルしてESP32に書き込みます。
  4. ツール > シリアルモニタ を開いておきます。
    シリアルモニタ
  5. シリアルモニタの右下のセレクトボックスが115200 bpsになっていなければ変更しておきます。
    115200
  6. ESP32のENボタン[4]を押すと、WiFiに接続されます。
    ENボタン
  7. 最後の方に表示されているIPアドレスをウェブブラウザで開きます。
    (この場合は192.168.0.8です)
  8. このようなページが表示されます。左下からボードのタイプ(4.2b)を選択しておきます。
  9. 左上のSelect Image Fileをクリックし、電子ペーパーに表示したい画像ファイルを選択します。
    画像サイズは横400px, 縦300pxに合わせるようにしましょう。
  10. 以下のいずれか、好みのフィルタを適用しましょう。
  • Level: mono
  • Level: color
  • Dithering: mono
  • Dithering: color
  1. Upload Imageボタンを押すと、電子ペーパーに画像が表示されます。
  2. いえーい!

参考文献

脚注
  1. 私はこれになかなか気がつけず、ずっと針に糸を通せない人みたいになっていました。 ↩︎

  2. FFC(Flexible Flat Cable)と呼ばれる ↩︎

  3. Arduinoではスケッチを呼ぶようです ↩︎

  4. ENはリセットボタンの意味のようです ↩︎