目次
e-Paper(電子ペーパー) 搭載
M5Stack製の M5 Core Ink は、電源を供給しなくても表示し続けることが可能な電子ペーパーを搭載しています。
本ブログでは、(意外と難しい)ディープスリープモードと組み合わせて動かす方法について説明します。
LCDとは異なる表示方法
Arduino IDE + M5Stack 純正ライブラリ M5CoreInk 環境で M5 Core Ink の e-Paper に表示を行うには、M5.M5Inkと、Ink_Sprite を用います。これらの使い勝手は、他のLCD用のライブラリとは異なります。
そこで、まずは ink_println という関数を定義して使用するようにしてみました。
M5 Core Ink e-Paper 向け Hello, world!
https://github.com/bokunimowakaru/m5/blob/master/core_ink/ex00_hello_wo_lib/ex00_hello_wo_lib.ino
上記の M5 Core Ink 用プログラムをご覧いただくと、他のLCD用のプログラムとはかなり違っている一方で、下記のような見慣れた使い勝手の ink_println も見つけれると思います。
ink_println("Hello, world!");
下図は、実行例です。本体側面のナビゲーションキー(3 Directions Switch)やボタンの操作で「Hello, world!」などの文字列を表示します。また、右側面の手前にある電源ボタンを押すと、電源が切れます(表示は消えません)。
使用するハードウェア
ハードウェアは、以下を使用します。
- M5Stack製 M5 Core Ink
- M5Stack製 ENV II HAT (または ENV III HAT)
ソフトウェア
筆者が作成したソフトウェア(説明は後述)は、下記のリポジトリのcore_inkフォルダ内に保存しました。ページ上部のボタンからGitHubサイトや、ZIP形式での一括ダウンロードが出来ます。
リポジトリm5 (GitHub Pages内):
https://git.bokunimo.com/m5/
厄介前に簡単なディープスリープを試してみる
実は、M5 Core Ink でディープスリープさせる方法は、少し面倒です。
そこで、まずは簡単な方法から紹介します。M5.shutdown(秒数);を使えば、指定した秒数の期間、ディープスリープ状態にすることができます。
簡単なディープスリープ ex05_hum:
https://github.com/bokunimowakaru/m5/blob/master/core_ink/ex05_hum/
お持ちの無線LANアクセスポイントのSSIDとパスワードを、プログラム ex05_hum.ino 内の #define SSID と PASS に設定してから、M5 Core Ink に書き込んでください。
このディープスリープは、M5 Core Ink のハードウェア(内蔵RTC)で実現しており、ESP32 マイコンを含む電源を切るので、最も低消費電力です。
しかし、ESP32 マイコン側のRTCの電源も切れるので、スリープ前の画面の内容を保持することが出来ません。
e-Paper そのものは、電源を切っても表示し続けるので、「そんなの問題ない!」と思うかもしれませんが、現在の表示内容を覚えておかないと、次の描画で全画素を書き直す必要があります。
このため、本サンプル ex05_hum では、起動するたびにe-Paper を消去する方法を用いています。また、前述の ink_println をもとにした関数によるテキスト文字表示としました。
面倒なディープスリープ
前述の「起動するたびにe-Paper を消去する方法」は、一度、全画素を黒で表示してから白に戻すので、各画素の e-Paper の書き換え回数が増えてしまい、e-Paper の寿命に影響する心配があります。
このため、Ink_Sprite では、必要な画素のみを書き換える「部分描画方式」を用いています。そこが、LCDとの違いです。
しかし、必要な画素のみを書き換えるには、現在、描かれている内容を保持しておく必要があります。それが面倒なのです。
今回、その方法を試行錯誤しながら探し、下記の方法で実現できることが分かりました。
- ディープ・スリープ移行前に、予め現在の描画内容を ESP32 マイコンのRTCメモリに保存する。
- M5 Core Ink の電源用 DC-DCコンバータを動作させ続けるために、GPIO 12 を Hレベルに維持しておく(参考文献 M5 Core Ink 回路図)。
- M5.shutdown()ではなく、ESP32マイコンのディープスリープ esp_deep_sleep(μ秒) を使用する。
- ディープスリープからの復帰後、RTCメモリからスリープ前の描画内容を読みだして、e-Paper に再描画する(同じ内容なので実際には描画されない)
- 表示内容を変更したい部分だけ、画像を書き換え、e-Paper に転送する。
この面倒な作業をプログラムにしたのが下記です。
折れ線グラフ&ディープスリープ対応版:https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex05_hum_graph
Ambient へ送信
センサ値は、UDPブロードキャスト(CSVxUDP方式)でLAN内に送信するほか、Ambientに送信することも出来ます。送信するには、プログラム内の説明にしたがって、#define Amb_IdとAmb_Keyを設定してください。
照度センサ版
M5 Stack 純正 DLIGHT HAT を使った照度センサ版も作成しました。
DLIGHT HAT を使った照度センサ版:
https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex03_lum_graph
e-Paper の折れ線グラフ画面に、電池残量(上)と照度値(下)を表示します。
人感センサ版
M5Stack 純正 PIR HATを使った人感センサ版は、人体などの動きを検知すると LINE に通知を送信します。設定方法は、 ex06_pir.ino 内の説明をご覧ください。
https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex06_pir
参考文献
M5Stack公式ページの e-Paper用 API仕様書:https://docs.m5stack.com/en/api/coreink/eink_api
Ink_Sprite.cpp:
https://github.com/m5stack/M5Core-Ink/blob/master/src/utility/Ink_Sprite.cpp
Ambient:
https://ambidata.io/
本ブログ関連サイト
リポジトリm5 (Git Hub Pages内):
https://git.bokunimo.com/m5/
M5Stackのブログ
by bokunimo.net
「省エネ M5Stack Core Ink で Wi-Fi 温湿度センサ送信機」への2件の返信
[…] 省エネ M5Stack Core Ink で Wi-Fi 温湿度センサ送信機 […]
[…] 省エネ M5Stack Core Ink で Wi-Fi 温湿度センサ送信機 […]