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

上記の記事も参考にしてください。
スペックの違い
M5StickC | M5StickC Plus | |
TFTコントローラー | ST7735S | ST7789 |
液晶サイズ | 0.96インチ | 1.14 インチ |
画面サイズ | 80×160 | 135×240 |
6軸IMU | SH200Q or MPU6886 | MPU6886 |
ブザー | なし | GPIO2 |
バッテリー | 95 mAh @ 3.7V | 120 mAh @ 3.7V |
PINポート | G0, G36, G26, G32, G33 | G0, 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のライブラリも混沌としている気がします、、、
コメント