カテゴリー
ESP8266+ESP32+RISC-V

省エネ M5Stack Core Ink で Wi-Fi 温湿度センサ送信機

e-Paper 搭載 M5 Core Ink をディープスリープによる間欠駆動させて、低消費電力な Wi-Fi 温湿度センサ送信機を製作します。

e-Paper(電子ペーパー) 搭載

M5Stack製の M5 Core Ink は、電源を供給しなくても表示し続けることが可能な電子ペーパーを搭載しています。

本ブログでは、(意外と難しい)ディープスリープモードと組み合わせて動かす方法について説明します。

M5 Core Ink は、電源を供給しなくても表示し続ける e-Paper (電子ペーパー)を搭載。折れ線グラフ画面に、電池残量(グラフ・上)と湿度(中央)、温度値(下)を表示してみた

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!」などの文字列を表示します。また、右側面の手前にある電源ボタンを押すと、電源が切れます(表示は消えません)。

サンプル・プログラム ex00_hello_wo_lib.ino の実行例。本体ボタンの操作で「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 マイコンを含む電源を切るので、最も低消費電力です。

サンプル・プログラム ex05_humでは、最も低消費電力な M5 Core Ink のハードウェア内蔵RTCで実現するディープ・スリープを使用する

しかし、ESP32 マイコン側のRTCの電源も切れるので、スリープ前の画面の内容を保持することが出来ません。

e-Paper そのものは、電源を切っても表示し続けるので、「そんなの問題ない!」と思うかもしれませんが、現在の表示内容を覚えておかないと、次の描画で全画素を書き直す必要があります。

このため、本サンプル ex05_hum では、起動するたびにe-Paper を消去する方法を用いています。また、前述の ink_println をもとにした関数によるテキスト文字表示としました。

面倒なディープスリープ

前述の「起動するたびにe-Paper を消去する方法」は、一度、全画素を黒で表示してから白に戻すので、各画素の e-Paper の書き換え回数が増えてしまい、e-Paper の寿命に影響する心配があります。

このため、Ink_Sprite では、必要な画素のみを書き換える「部分描画方式」を用いています。そこが、LCDとの違いです。

しかし、必要な画素のみを書き換えるには、現在、描かれている内容を保持しておく必要があります。それが面倒なのです。

サンプル・プログラム ex05_hum_graph では、面倒なディープスリープを使うことで、書き換え箇所を限定しつつ、グラフ表示を実現した

今回、その方法を試行錯誤しながら探し、下記の方法で実現できることが分かりました。

  1. ディープ・スリープ移行前に、予め現在の描画内容を ESP32 マイコンのRTCメモリに保存する。
  2. M5 Core Ink の電源用 DC-DCコンバータを動作させ続けるために、GPIO 12 を Hレベルに維持しておく(参考文献 M5 Core Ink 回路図)。
  3. M5.shutdown()ではなく、ESP32マイコンのディープスリープ esp_deep_sleep(μ秒) を使用する。
  4. ディープスリープからの復帰後、RTCメモリからスリープ前の描画内容を読みだして、e-Paper に再描画する(同じ内容なので実際には描画されない)
  5. 表示内容を変更したい部分だけ、画像を書き換え、e-Paper に転送する。

この面倒な作業をプログラムにしたのが下記です。

折れ線グラフ&ディープスリープ対応版:https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex05_hum_graph

Ambient へ送信

センサ値は、UDPブロードキャスト(CSVxUDP方式)でLAN内に送信するほか、Ambientに送信することも出来ます。送信するには、プログラム内の説明にしたがって、#define Amb_IdとAmb_Keyを設定してください。

センサ値は、UDPブロードキャスト(CSVxUDP方式)でLAN内に送信するほか、Ambientに送信することも出来る

照度センサ版

M5 Stack 純正 DLIGHT HAT を使った照度センサ版も作成しました。

DLIGHT HAT を使った照度センサ版:
https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex03_lum_graph

M5 Stack純正 DLIGHT HAT を使った照度センサの動作例

e-Paper の折れ線グラフ画面に、電池残量(上)と照度値(下)を表示します。

e-Paper の折れ線グラフ画面に、電池残量(グラフ・上)と照度値(下)を表示する

人感センサ版

M5Stack 純正 PIR HATを使った人感センサ版は、人体などの動きを検知すると LINE に通知を送信します。設定方法は、 ex06_pir.ino 内の説明をご覧ください。

https://github.com/bokunimowakaru/m5/tree/master/core_ink/ex06_pir

M5Stack 純正 PIR HATを使った人感センサ版は、人体などの動きを検知すると LINE に通知を送信する

参考文献


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件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es