鳥なき里のマイコン屋(113) M5Stack、M5ez、本当にイージー

Joseph Halfmoon

M5StackやWio Terminalなどある程度の大きさのディスプレイとキーなど備えたデバイスの場合、GUIを載せて操作したくなります。でも自分で書くのはメンドイ。きっと先行してどなたか開発された良いモノがある筈。と思っていたらM5Stack用ありました。M5ez。GUIだけに留まらずM5Stackのプログラミングをイージーにしてくれる優れもの。

※「鳥なき里のマイコン屋」投稿順Indexはこちら

GUIは部品の位置や大きさ、色など動かしてみないと感じがつかみ難いです。変更の度にビルドしてデバイスのフラッシュに書き込むという繰り返しでは効率が悪い。そこで探し始めた当初の期待は、「GUIの設計」はPC上で出来て、大体出来上がったところでデバイス用のアプリプログラムにマージしてビルドして書きこむというもの。以下にリンク先のURLを掲げましたうち、GUIsliceという環境はまさにそういう環境です。デバイス側のオブジェクトにリンクして載せるGUIライブラリとそれを使うためのPC(またはMAC/LINUX)上のビルダ。ターゲットとなるデバイスもM5Stackだけでなくいろいろあり、搭載可能な部品も多種でカッコいいです。これで決まりか、とも思ったのですが、もう一つ良さげなものがありました。下の方 M5ez というもの。

M5ezはその名の通り、こちらはM5Stack向けのソフトウエア・ライブラリ。GUIsliceと異なりPC上のGUIビルダがあるわけでもなく、用意されているGUI部品も必要最低限という感じです。しかし上のURLを辿って読んでいくうちに、なかなか良いものじゃないか、と思えてきました。

    • GUIだけでなくアプリの実行環境的な役目も果たす
    • M5Stackのハードウエアに密着、必要機能を即使用可能
    • シンプルなのでごく短いコードで効果が得られそう

本格的なRTOSでも走っていれば、表のGUIと、裏のアプリや通信プログラムを並行動作させるのは問題ないでしょう。しかし今回使用するつもりのArduino環境ではタイマ割り込みくらいは使えるものの、OSと言える程の環境があるわけではありません。GUIの反応と測定や通信を両立させるのは工夫がいります。M5ez使うと「その辺の折り合いつけて」くれます。RTOSのような実時間性は期待できないですが、常にGUIが動いている裏で何か計測プログラムが動いているかのように見せかけられる、です。また、M5Stackのハードウエアを十二分に使い切っています。WiFiへの自動接続機能や、それをつかってRTCをNTPで初期化するような機能も提供してくれています。それだけでなくちょっと驚いたのが

たった3つのボタンで任意の英数字文字列を編集できる

エディタ機能です。最初、3ボタンの編集機能の説明を文章で読んだときには「操作方法複雑で良く分かんない」と思えたのですが、実際に使ってみたら意外に簡単。WiFiパスコードの入力ぐらい何のこともない(ちゃんとM5StackのNVS(不揮発メモリ領域)に保存してくれるので、プログラムを書き換えても再入力の必要なし。)

インストールも簡単。ArduinoIDEのライブラリマネージャからM5ezを探してインストールするだけです。

M5ez found in Libmanager
上のM5ezのページのインストールのガイドでは、M5ezだけでなくezTimeというライブラリも探してインストールせよ、と書かれているのですが、手元の

ArduinoIDE 1.8.13

では、以下のようなウインドウが開くので、Install all すれば両方入れてくれました。

ezTimeInLibmanager最初はスケッチ例をやってみよ、とあるのでやってみました。一番簡単なM5ezのHello_World。

M5ez_Helloスケッチ例の全体を引用させていただきますが、これだけ。

M5ez Hello World Exampleしかし、いろいろやってくれちゃうので、結構メモリは使います。こんな感じ。

M5ez Hello memory usageこのサンプルスケッチ例が動作しているところを最上部のアイキャッチ画像に掲げました。スマホよろしく、上の方にアンテナマーク(WiFi)やら電池マークが見えているの分かりますでしょうか。下の方のsettings(真ん中ボタンを押すと入れる)から、WiFiのアクセスポイントをスキャンしてパスコードを入力してセットすればWiFiに繋がり、実時間タイマのメニューから地域を jp と指定すればちゃんと東京のタイムゾーンにしてくれます。いやはやお手軽。

早速、自分のコードを組み込んでみることにいたしました。Startメニューで毎秒1回処理(後でセンサの読み取り機能でもいれるつもりですが、とりあえずカウンタを+1するだけ)を開始。Stopメニューで毎秒処理を停止。Showメニューで処理結果(カウンタ)を表示。SettingsメニューでM5ezのWiFiなどの設定メニュー呼び出し。使用したソースコードは末尾に掲げましたが、ごくごくささやかなコードでそういうことが出来てしまいました。超お手軽。

実際に動作しているところがこちら。

M5ezMyFirstMenuいや~もっと前に気付いて、使うべきだった。。。

鳥なき里のマイコン屋(112) NucleoでArduino, PWM編 へ戻る

鳥なき里のマイコン屋(114) RISC-VデバッガでESP32デバッグ? へ進む

今回使用したソースコードはこちら。

#include <M5Stack.h>
#include <M5ez.h>

int counter;
uint16_t interval;

uint16_t mytask() {
  counter++;
  return interval;
}

void setup() {
  ez.begin();
  counter = 0;
  interval = 1000;
}

void loop() {
  ezMenu myMenu("Control Task:");
  myMenu.addItem("Start");
  myMenu.addItem("Stop");
  myMenu.addItem("Show");
  myMenu.addItem("Settings");
  myMenu.runOnce();
  if (myMenu.pickName() == "Start") {
    interval = 1000;
    ez.addEvent(mytask);
  }
  if (myMenu.pickName() == "Stop") {
    interval = 0;
  }
  if (myMenu.pickName() == "Show") {
    ez.msgBox("Counter:", String(counter), "Ok");
  }
  if (myMenu.pickName() == "Settings") {
    ez.settings.menu();
  }
}