M5Stackでできること 〜M5Unifiedライブラリ

私はこれまで、何種類かのM5Stack社製マイコンデバイスを使ってきました。

M5Stack社製の多くのマイコンデバイスには、ディスプレイやボタン、スピーカーなどが搭載されており、初心者でもそれらを扱うプログラム(スケッチ)を簡単につくることができます。
とても便利なデバイス群ですが、何しろデバイスの種類がとても多く、それぞれでスケッチの書き方が若干異なっていたりもします。
そのため、とあるデバイス向けにスケッチをつくる際には、以前つくった同デバイス向けのスケッチを見直したり、その都度ネットで検索したりと、結構面倒な想いをしてきました。

これに対して「M5Unified」というライブラリがあります。
「M5Stack.h」「M5StickC.h」など、デバイス固有のライブラリを include する代わりに、「M5Unified.h」を include することで、デバイスの種類毎に別々のスケッチをつくることなく、ひとつのスケッチで複数種類のデバイスに対応できるというものです。

私の場合、異なる種類のデバイスに同一内容のスケッチを適用したいというような機会はあまりないのですが、それでもスケッチの書き方がデバイスの種類に依存せずに同じというのは非常に魅力的です。
そんな訳で、今回は「M5Unified」ライブラリを試してみようと思います。

「M5Unified」ライブラリでは、スピーカーやデバイス内蔵IMUセンサなどを扱うこともできますが、今回は私がよく使う「画面表示」と「ボタン操作」について試してみます。

Arduino IDEの「ツール」>「ライブラリを管理…」でライブラリマネージャを開き、「M5Unified by M5Stack」をインストールします。このライブラリをインストールする際には、同時に「M5GFX by M5Stack」もインストールされます。「M5GFX」はM5Stack社製ディスプレイデバイス用のグラフィックスライブラリです。
今回はどちらのライブラリとも、バージョン「0.1.17」をインストールしました。

スケッチは以下のとおりです。

#include <M5Unified.h>

String name;
String pins;
int w;
int h;

boolean flag = false;

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);

  // 画面描画用設定
  M5.Display.setTextColor(TFT_WHITE);
  M5.Display.setTextDatum(MC_DATUM);
  M5.Display.fillScreen(TFT_BLACK);

  // デバイス名を取得
  switch (M5.getBoard()) {
    case m5::board_t::board_M5Stack:        name = "M5Stack";        break;
    case m5::board_t::board_M5StickCPlus:   name = "M5StickCPlus";   break;
    case m5::board_t::board_M5StackCoreInk: name = "M5StackCoreInk"; break;
    case m5::board_t::board_M5AtomS3:       name = "M5AtomS3";       break;
    default:                                name = "New Device";     break;
  }
  // I2Cピン名を取得
  pins = "[I2C] SDA:" + String(M5.Ex_I2C.getSDA()) + " SCL:" + String(M5.Ex_I2C.getSCL());
  // 画面サイズを取得
  w = M5.Display.width();
  h = M5.Display.height();
}

void loop() {
  M5.update();
  if(M5.BtnA.wasPressed()) {
    flag = !flag;
    if(flag) {
      M5.Display.fillCircle(w/2, h/4, min(w/2, h/4), TFT_WHITE);
      M5.Display.drawString(name, w/2, h*5/8, 4);
      M5.Display.drawString(pins, w/2, h*7/8, 2);
    } else {
      M5.Display.fillScreen(TFT_BLACK);
    }
  }
}

デバイスの名前と、そのデバイスのI2Cピン番号を取得します。
デバイスのAボタンを押すと、ディスプレイの上半分に円を描画し、下半分にデバイス名とI2C番号を表示します。
スケッチの先頭で「M5Unified.h」を include していますが、「M5Stack.h」「M5StickC.h」などのデバイス固有のライブラリは include していません。

今回は、このスケッチを「M5Stack Basic」「M5StickC Plus」「ATOMS3」「M5Stack CoreInk」という4つのディスプレイ付きデバイスに書き込んでみます。

「M5Stack Basic」での動作確認結果はこちらです。

Aボタン(前面下に3つ並んでいるボタンの左側)を押すとこのように表示されます。

「M5StickC Plus」での動作確認結果はこちらです。

「M5StickC Plus」では、前面の下部にある「M5」と書いてあるボタンがAボタンになります。

「ATOMS3」での動作確認結果はこちらです。

「ATOMS3」ではディスプレイの底にAボタンがあり、ディスプレイを押すと描画されます。

「M5Stack CoreInk」での動作確認結果はこちらです。

「M5Stack CoreInk」の右側面に多機能ボタンがあり、これを上に動かすとAボタンになります。

全く同じスケッチで、異なる種類のデバイスを動かすことができました。

今回のスケッチでは、円の大きさは画面サイズに応じて調整していますが、テキストのサイズは何も調整していないため、デバイスによっては文字が少しはみ出したりしています。この辺りもきちんと調整すれば、完全にひとつのスケッチで複数デバイスに対応できそうです。

少なくとも「M5Unified」ライブラリを使うことで、デバイス毎のスケッチの書き方の違いを気にする必要はなくなります。
最近の「モジュール」や「ユニット」では、スケッチ例でも「M5Unified」ライブラリを使っているものが多いようですので、私も今後は「M5Unified」ライブラリを積極的に活用していこうと思います。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。