M5Stack CoreInk発売

概要

スイッチサイエンスさんにて11月12日にCoreInkが発売されましたので購入してみました。結構昔から情報は公開されていまして、あまり期待していなかったのですが触ってみると予想以上にいい製品かもしれません。

商品

毎回思いますが、正式な製品名がよくわかりません。Core Inkだと思っていましたが、スイッチサイエンスさんの商品名はCoreInkです。公式ドキュメントの中身もCoreInkなのでスペース無しが正しいようです。

今月末にはM5PAPERの販売が控えていますので、こちらのCoreInkはあまり盛り上がっていませんでした。とはいえ、これCoreって名前がついているので力作だと思います。

パッケージは最近採用しているスリムパッケージです。日本での送料などを考えて薄型にしているのかな。

下の部分にはUSBケーブルが収納されています。最近の製品はUSBケーブルが添付されなくなったのですが、やっぱり接続できないって問い合わせが増えたのでしょうか?

電源を入れると表示がキリッと黒くなります。ただRTCは設定されていない状態なので、初回起動時からの経過時間が表示されます。この製品は初期に入っているファームウエアで全数動作確認をしているっぽくて、製造日がわかります!

裏側です。MI-BUSという2×8のピンがありますね。リセットは横ではなくて裏面に配置されています。

上の面にはM5StickCと同じ配置のHAT端子と、緑LEDが配置されています。

PIRハットを接続してみました。M5StickC用なのでちょっと隙間ができますが使うことができます。ただし緑LEDは隙間からちょっと見えるぐらいで隠れてしまいます。

あと、外部給電の場合にはM5のロゴの下辺りに赤色LEDが光っていました。

開発方法

ライブラリマネージャにCoreInkライブラリはすでに登録されていますので追加することで利用できます。M5StickC Plusライブラリはライブラリマネージャ登録されないのはなぜ???

以下スケッチ例の解説です。

HelloWorld

基本的な表示方法の確認用スケッチです。個人的には定期的に描画するスケッチがCoreInkに入っていると画面が消耗しちゃうので、このスケッチで上書きして置くといいと思います。

Button

ボタンの使い方を確認するスケッチですが、一度見ればいいかな?

RTC_BM8563

んー、物足りないです。Wi-Fiを使わないサンプルなのでRTCの値が適当なんですよね。せめてコンパイル時間を設定してほしかったです。

#include "M5CoreInk.h"
#include <WiFi.h>
#include "time.h"

Ink_Sprite InkPageSprite(&M5.M5Ink);

const char* ssid       = "";  // 無指定は最後に接続した設定
const char* password   = "";

const char* ntpServer =  "pool.ntp.org";

void setup() {
  M5.begin();
  M5.M5Ink.isInit();
  M5.M5Ink.clear();
  InkPageSprite.creatSprite(0, 0, 200, 200, false);

  // connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  if (strlen(ssid) != 0) {
    WiFi.begin(ssid, password);
  } else {
    WiFi.begin();
  }
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");

  // Set ntp time to local
  configTime(9 * 3600, 0, ntpServer);

  // Get local time
  struct tm timeInfo;
  if (getLocalTime(&timeInfo)) {
    Serial.print("NTP : ");
    Serial.println(ntpServer);

    // Set RTC time
    RTC_TimeTypeDef TimeStruct;
    TimeStruct.Hours   = timeInfo.tm_hour;
    TimeStruct.Minutes = timeInfo.tm_min;
    TimeStruct.Seconds = timeInfo.tm_sec;
    M5.rtc.SetTime(&TimeStruct);

    RTC_DateTypeDef DateStruct;
    DateStruct.WeekDay = timeInfo.tm_wday;
    DateStruct.Month = timeInfo.tm_mon + 1;
    DateStruct.Date = timeInfo.tm_mday;
    DateStruct.Year = timeInfo.tm_year + 1900;
    M5.rtc.SetData(&DateStruct);
  }

  // disconnect WiFi
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop() {
  RTC_TimeTypeDef RTCtime;
  RTC_DateTypeDef RTCDate;
  char timeStrbuff[64];

  M5.rtc.GetTime(&RTCtime);
  M5.rtc.GetData(&RTCDate);
  sprintf(timeStrbuff, "%d/%02d/%02d %02d:%02d:%02d",
          RTCDate.Year, RTCDate.Month, RTCDate.Date,
          RTCtime.Hours, RTCtime.Minutes, RTCtime.Seconds);
  InkPageSprite.drawString(10, 100, timeStrbuff);
  InkPageSprite.pushSprite();

  M5.update();
  if (M5.BtnPWR.isPressed()) {
    Serial.printf("Btn %d was pressed \r\n", BUTTON_EXT_PIN);
    digitalWrite(LED_EXT_PIN, LOW);
    M5.PowerDown();
  }

  delay(15000);
}

Wi-Fiに接続してNTP同期するスケッチ例はこんな感じでしょうか?

RTC_WakeUp

こちらはGitHub上でしかないかな。省電力系はまだサンプルが怪しいので今後検証したいと思います。

HelloWorld

メインのスケッチ例ですが、動作確認用のスケッチが入っていますのでかなり長いです。おそらくENV IIユニットをGroveコネクタに接続して、MI-BUSとHAT端子にも検証用装置をつなげた段階で、再度ボタンを押し込みながら起動してテストモードに入ってから、動作検証をしています。

電源オフ?

スケッチ例を見ると電源オフは自分で電源ボタンのGPIOを見て呼び出しています。ただ電源落ちないような。。。USB接続を外した状態でリセットボタンを押すと画面が薄くなって電源OFFになる?

画像や日本語フォント

検証中ですが、公式ライブラリの描画まわりは貧弱なので、LovyanGFXなどのスプライト上に描画して、その結果を表示するようにしたほうが良さそうです。

#include "M5CoreInk.h"
#include <LovyanGFX.hpp>

Ink_Sprite InkPageSprite(&M5.M5Ink);
static LGFX_Sprite sprite;

void setup() {
  M5.begin();
  M5.M5Ink.isInit();
  M5.M5Ink.clear();
  InkPageSprite.creatSprite(0, 0, 200, 200, false);

  // スプライト作成
  sprite.setColorDepth(2);
  sprite.createPalette();
  sprite.createSprite(200, 200);
  sprite.clear(TFT_WHITE);

  // 描画テスト
  sprite.drawLine(0, 0, 199, 199, TFT_BLACK);
  pushSprite();

  delay(5000);

  // 描画テスト
  sprite.drawLine(0, 0, 199, 0, TFT_BLACK);
  pushSprite();

  delay(5000);

  // 描画テスト
  sprite.clear(TFT_WHITE);
  sprite.drawLine(0, 10, 199, 10, TFT_BLACK);
  pushSprite();
}

void loop() {
  delay(10000);
}

void pushSprite() {
  InkPageSprite.clear();
  for (int y = 0; y < 200; y++) {
    for (int x = 0; x < 200; x++) {
      uint16_t c = sprite.readPixel(x, y);
      if (c == 0x0000) {
        InkPageSprite.drawPix(x, y, 0);
      }
    }
  }
  InkPageSprite.pushSprite();
}

ちょっと実験段階ですが、上記ようなもので描画ができました。もう少し検証してから使い方の解説を説明したいと思います。

まとめ

事前の期待を裏切り、非常に好印象なボードです。ちょっとE-INKを使っている関係で価格が高いのですが、まっとうに進化している感じです。

いままで、ばらまく用途にはM5Stackがいいかなって思っていましたが、CoreInkの方がスッキリと利用できる場合がありそうです。特に自宅とかの環境センサーとかは夜中に液晶が光ると困ることもあるので、E-INKの利点が生きると思います。

CoreInkは気に入ったので、継続的に研究をする予定ですので期待してください。あとイベントとかで名刺としてぶら下げるのはこの端末が紐を通しやすい穴があるので、ベターだと思われます。

コメント

タイトルとURLをコピーしました