前提条件
記事執筆時点のM5Stackシリーズの以下ライブラリ(Arduino IDEで使用可能)を使用した場合で、将来的に変わってしまう可能性がある。(と、いうか変わってほしい。でも、バージョン間の互換性が保てないので大きく変わることはないとも考えている)
- M5Stackライブラリ:バージョン 0.3.1
- M5StickCライブラリ:バージョン 0.2.0
- M5Atomライブラリ:バージョン 0.0.1
M5StackシリーズはモデルによってM5.begin()の引数が異なる
M5StackシリーズのM5Stack Gray、M5Stick-C、Atom Liteを使ってサンプルで遊んでいる時に開始関数であるbegin()関数がそれぞれ違うことに気がついた。
// M5Stack.h(M5Stack用)
void begin(bool LCDEnable = true, bool SDEnable = true, bool SerialEnable = true, bool I2CEnable = false);
// M5StickC.h(M5Stick-C用)
void begin(bool LCDEnable=true, bool PowerEnable=true, bool SerialEnable=true);
// M5Stack.h(ATOM用)
void begin(bool SerialEnable = true, bool I2CEnable = true, bool DisplayEnable = false);
各引数は対応デバイスを初期化するかしないかのフラグだが、モデルによって引数の数も順番も全く違う。見やすいようにまとめると、
モデル | 使用 ライブラリ | 第1引数 | 第2引数 | 第3引数 | 第4引数 |
---|---|---|---|---|---|
M5Stack Gray | M5Stack | LCD (省略時:初期化する) | SD (省略時:初期化する) | UART (省略時:初期化する) | I2C (省略時:初期化しない) |
M5Stick-C | M5StickC | LCD (省略時:初期化する) | AXP (省略時:初期化する) | UART (省略時:初期化する) | なし |
Atom Lite | M5Atom | UART (省略時:初期化する) | I2C (省略時:初期化する) | LED (省略時:初期化しない) | なし |
モデルに固有のデバイス(SDとAXP)はともかく、I2C用に引数があるモデル(M5Stack GrayとAtom Lite)と引数がないモデル(M5Stick-C)、I2Cの引数省略時に初期化されるモデル(Atom Lite)と初期化されないモデル(M5Stack Gray)まである。
また、LCDとLEDのようにデバイスは異なるがU/Iとしては似たようなデバイスに対して引数省略時に初期化されるモデル(Atom Lite)と初期化されないモデル(M5Stack Gray)がある、という風に非常に複雑怪奇(私見)になっている。
M5.begin()の引数はどうしたらいいか?
M5Stackシリーズのライブラリに付属しているサンプルスケッチではおおむね次のようになっていた。
setup(){
// M5Stackの場合
M5.begin();
}
setup(){
// M5Stick-Cの場合
M5.begin();
}
setup(){
// ATOMの場合
M5.begin(true, false, true);
}
サンプルスケッチとはいえモデルごとにM5.begin()の引数は異なっている。
1つのモデルを使うだけならもちろんM5.begin()の引数が異なっていても問題ないのだが、例えば液晶が付いていてデバッグしやすいM5Stack Gray/M5Stick-Cで開発/デバッグしたスケッチを小型で低消費電力のAtom Liteで動作させようとするとM5.begin()の部分まで書き換える必要が出てくるのが悩ましい。書き換えるのはメンテナンス性も良くないし、バグの温床になる。書き換えるのは1行でも少ない方が良い。
とは言え、
- ふんだんなリソースを持つわけではないM5Stackシリーズでは独自ライブラリを作るのはあまり得策ではない。(バイナリの肥大化、消費電力の増大、オーバーヘッド増大)
- 実稼働させる場合は消費電力やオーバーヘッドを削るために不要なデバイスは動かしたくない(初期化したくない)ので、結局モデルごとに引数が異なってしまう。
- 互換性を重視し引数を省略して実装したとしても、処理や接続するデバイスの組み合わせでモデルごとに引数を変更する必要が出てくる。
といった事を考えるとモデルごとに引数を変更するように実装せざるをえない、というのが結論。(あくまで個人的、今のところだが・・・)