M5Stackのあれこれ

I/Oの落とし穴

ただでさえ M5Stack は外に出ているI/Oピンが少ないが、それすら兼用ピンが多く注意を要する。M5Stack Basic について気付いたのは以下の通り。まだ他にあるかもしれない。また、M5Stack Core2とは異同があるので注意。

  • 3 (RXD1), 1(TXD1) : USBシリアル(Serial)と兼用。Serialを使わないなら他に転用できるが、少なくとも書き込み時には外す必要あり。使わないほうがよい。
  • 25(DAC1) : スピーカ出力専用。ただし、M5Stack基板のT1にハンダを盛ってショートさせればスピーカを無効にして25を転用することは可能。詳細は後述。
  • 34(ADC0), 35(ADC1), 36(ADC2) : デジタルで使う場合も入力専用。また内部プルアップ(INPUT_PULLUP)も使用不可。プルアップしたい場合は抵抗を外付けする必要あり。
  • 21(SDA), 22(SCL) : GROVEポートと兼用。I2Cポートして使うなら併用可能。
  • 18(SCK), 19(MISO), 23(MOSI) : LCD, SDカードと兼用。SPIポートして使うなら併用可能だが、要注意。
  • 0(BOOT) : BOOTピン。使用不可。
  • 2 : 内部プルダウンされている。書き込み時は起動時にLowでなければならない。つまり起動時にHighになってはならないので、入力ピンには使いにくい。

【参考】

フォント

フォント番号とフォントサイズの関係がややこしい。

  • M5.Lcd.setTextFont(font) : フォント番号を指定 (font = 1 ~ 8)
  • M5.Lcd.setTextSize(size) : フォントサイズを指定 (1で1倍, 2で2倍, ...)

フォント番号

スプライト

通常の画面描画APIだと、描画の途中が見えて画面がチラつくことがある。スプライトを使って、スプライトに描く→スプライトを表示させる、とすることでチラつきを低減できる。メソッドが通常の画面描画APIとほぼ同様の仕様なので分かりやすい。

画像を表示

アイコンのような画像データをソースに埋め込んで画面に表示させるには、下記のツールを用いるとよい。

コマンドプロンプトで下記のようなコマンドを実行すると16進数の列が吐かれる。

python png2img.py 画像ファイル.png

これをコピペして、const unsigned short の配列を定義し、M5.Lcd.drawBitmapメソッドで描画する。

const unsigned short ICON[] = {
    // ここに16進数の列をコピペ
};

M5.Lcd.drawBitmap(x, y, w, h, ICON);

スピーカーを無効にする

M5Stackの内蔵スピーカーはノイズが出やすい。使わないなら基板のT1をハンダでショートさせてオーディオアンプを無効化するのが確実。T1はM5Stackの基板をシルクの文字の方向に見て、ESP32の左、アンテナの下あたりにある「AMP」の文字の右横にある。これをショートさせるとオーディオアンプに給電されなくなる。詳細は回路図を参照。これにより、25番ピンを他の用途に使用することもできるようになる。

ソフトのみで対応するなら、下記のようにする。ただし、完全にノイズが無くなるわけではなく、また25番ピンを他の用途に使用することもできない。

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