M5StickCとM5StickC Plusの違い

概要

M5StickCとM5StickC Plusを主にArduino IDEで開発する場合の違いを調べてみました。

上記の記事も参考にしてください。

スペックの違い

M5StickCM5StickC Plus
TFTコントローラーST7735SST7789
液晶サイズ0.96インチ1.14 インチ
画面サイズ80×160135×240
6軸IMUSH200Q or MPU6886MPU6886
ブザーなしGPIO2
バッテリー95 mAh @ 3.7V120 mAh @ 3.7V
PINポートG0, G36, G26, G32, G33G0, G25/G36, G26, G32, G33

まず本体サイズは同じなのですが、液晶サイズが異なっています。また、解像度が上がっている関係で同じ画面を表示してもM5StickC Plusの方が小さく表示されます。また、コントローラーが違うので同じライブラリでは動作しません。

またM5StickCの初期はIMUにSH200Qが使われていましたが、現在はMPU6886のみになっています。初期のM5StickCに対応する場合には注意が必要です。

M5StickC Plusにはブザー(GPIO2)とGPIO25が増えています。ブザーは圧電ブザー的なのが内蔵されており、ちょっとした音を出すことができます。GPIO2はDAC出力できる端子ではないので、音声などを喋らせることはできません。またGPIO25が追加されていますが、GPIO36と同じピンにでていますので同時に利用することができませんので注意しましょう。GPIO36を利用する場合にはGPIO25をpinMode(25, INPUT)にしてハイインピーダンスにしておく必要があります。

ライブラリの違い

M5StickCとM5StickC Plusは利用するライブラリが異なります。しかしながら同じように使うことができるようにはなっています。

M5StickC PlusでM5StickCのFactoryTestを動かしてみる

includeを書き換える

//#include <M5StickC.h>
#include <M5StickCPlus.h>

利用するライブラリを切り替えるために、上記の行を書き換えます。基本的にはこれで大体のスケッチが動くのですが、IMU周りの差異でこのままだと動かない場合があります。

IMU周りの対応

M5StickCはIMUが違う端末がある関係でSH200QクラスとMPU6886クラスがあり、自動判定をして呼び分けるIMUクラスもあります。基本的にIMUクラスを読み出せば内部で自動判定をする形なのですが、直接MPU6886クラスを呼び出すことも可能です。また、IMUクラスにはどっちのIMUかを判定する関数などが追加されています。

M5StickC PlusはIMUがMPU6886の端末しかありませんので、MPU6886クラスしかありません。しかし、呼び出しはM5.IMUになります。そのためM5.MPU6886で呼び出しているスケッチは書き直す必要があります。

M5StickCのFactoryTestはM5.MPU6886を呼び出しているのでこのままだとエラーになります。。。GitHubにある最新バージョンはM5.IMUを呼び出すように変更されているのですが、逆にIMUの判定をしている関数を呼び出しているのでそのままだと動きません、、、

#include <M5StickCPlus.h>
#define MPU6886 IMU

M5.MPU6886でエラーがでた場合には上記のようにIMUに書き換えるか、M5.MPU6886をM5.IMUに置換してください。

        //if(M5.IMU.imuType == M5.IMU.IMU_SH200Q)
        //{
        //    imuName = "SH200Q";
        //}
        //else if(M5.IMU.imuType == M5.IMU.IMU_MPU6886)
        //{
        //    imuName = "MPU6886";
        //}

M5.IMU.imuTypeでエラーが出た場合には、エラーがでた場所をコメントアウトしてみてください。

FastLED関係

M5StickCのFactoryTestで誤ってFastLEDが読み込まれています。FastLEDをインストールするか該当部分をコメントアウトしてください。

//#include <FastLED.h>

//#define NUM_LEDS 3
//CRGB leds[NUM_LEDS];

上記の3行になります。ここ結構ハマっている人が多いのでご注意を、、、

GitHubの最新版だとここが削られています。

パーティションテーブル変更

/*
    note: need add library FastLED from library manage
    Github: https://github.com/FastLED/FastLED

    note: Change Partition Scheme(Default -> NoOTA or MinimalSPIFFS)
*/

M5StickCのFactoryTestには一番上にこのコメントがあります。このコメント見落としている人が多いのですが、そのままビルドするとフラッシュが足りなくてエラーになります!

パーティションテーブルを変更してください。ちなみにGitHubの最新版だとがんばって圧縮してデフォルト設定でビルドできるようになっています。

MahonyAHRSに注意

M5StickCにはありますが、M5StickC Plusには存在しませんので注意してください。

全般的にバージョンが、、、

In_eSPIクラスの中身がちょっと違うので、サポートしている関数が違ったりしています。完全互換性はありませんので注意してください。。。

1バイナリで対応したい場合

M5StickCとM5StickC Plusを同じバイナリファイルで対応いたい場合には、公式ライブラリを使うのを諦める必要があります。

グラフィックライブラリにはLovyanGFXを利用すると、内部で自動判定してくれますので画面サイズが違うだけで、同じようにプログラムを組めますし高速描画が可能です。

#include <LGFX_TFT_eSPI.hpp>
#include "AXP192.h"
#include "utility/Config.h"
#include "utility/SH200Q.h"
#include "utility/MPU6886.h"
#include "utility/Button.h"
#include "utility/CommUtil.h"
#include "RTC.h"
#include "IMU.h"

#define BLACK               0x0000
#define NAVY                0x000F
#define DARKGREEN           0x03E0
#define DARKCYAN            0x03EF
#define MAROON              0x7800
#define PURPLE              0x780F
#define OLIVE               0x7BE0
#define LIGHTGREY           0xC618
#define DARKGREY            0x7BEF
#define BLUE                0x001F
#define GREEN               0x07E0
#define CYAN                0x07FF
#define RED                 0xF800
#define MAGENTA             0xF81F
#define YELLOW              0xFFE0
#define WHITE               0xFFFF
#define ORANGE              0xFD20
#define GREENYELLOW         0xAFE5
#define PINK                0xF81F

class M5StickCBoth {
  public:
    void begin(bool LCDEnable = true, bool PowerEnable = true, bool SerialEnable = true) {
      if (SerialEnable) {
        Serial.begin(115200);
        Serial.flush();
        delay(50);
        Serial.print("M5StickC initializing...");
      }
      if (PowerEnable) {
        Axp.begin();
      }
      if (LCDEnable) {
        Lcd.begin();
      }
      if (SerialEnable) {
        Serial.println("OK");
      }
      Rtc.begin();
    }
    void update() {
      BtnA.read();
      BtnB.read();
    }
    TFT_eSPI Lcd;
    AXP192 Axp = AXP192();
    const int DEBOUNCE_MS = 10;
    Button BtnA = Button(BUTTON_A_PIN, true, DEBOUNCE_MS);
    Button BtnB = Button(BUTTON_B_PIN, true, DEBOUNCE_MS);
    RTC  Rtc;
    IMU Imu;
    CommUtil I2C = CommUtil();
    MPU6886 Mpu6886;
    SH200Q Sh200Q;
};

static M5StickCBoth M5;

void setup() {
  M5.begin();
}

void loop() {
  M5.Lcd.fillScreen(WHITE);
  delay(1000);
  M5.Lcd.fillScreen(BLACK);
  delay(1000);
}

ざっくりM5StickCのライブラリ互換で、LovyanGFXを利用するサンプルです。とはいえ、実際にはM5StickCのライブラリも内部にあって、無駄に容量を食ってしまいます。

本当はAXP192、RTC、IMU周りのクラスが独立してあればM5StickCライブラリに依存しないのですが、今の所個別ライブラリがないんですよね、、、

何故かRTCとAXP192の初期化部分は独立して使えるライブラリを開発中なので、IMUまわりの互換ライブラリも作って公開するかもしれません。そうすればM5Stackの公式ライブラリではなく、互換ライブラリを自分で組み合わせて使えるようになってハッピーな人が増えるかもしれません、、、

まとめ

M5StickCとM5StickC Plusのライブラリが別なのはちょっとがっかりでした。最近Arduinoライブラリの整備が遅れている気がするので、そろそろ公式ライブラリを捨ててもいいかなって思うようになってきました。

M5StickCは結構プルリクエストを書いて、取り込んでもらいましたが公開がなかなかされないんですよね。ATOMも色がおかしいのが修正されませんし、M5Stackのライブラリも混沌としている気がします、、、

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。