M5Stack:LED Dot Matrix Module

MAX7219 LED Dot Matrix Module を M5Stackから使いたい!せっかくだから、俺はこの赤い M5Stack FIRE で使ってみたい!

M5Stack FIREには、外部接続用の端子として、ポートA / ポートB / ポートC の3つのGROVE端子が付いています。

それぞれにはピン番号が割り振られ、ポートごとに役割が決まっている感じです。
ポートAはI2C(G21/G22)、ポートBはI/O(G26/G36、G36はINPUTのみ)、ポートCはUART(G16/G17)です。

この割り振りだと、汎用I/Oに仕えそうなのはポートBだけ。しかも、OUTPUTに使えるピンはG26ピンだけです。MAX7219 LED Dot Matrix Moduleを使うには、3本必要なので、繋ぐのは無理ですね…。


ポートAとポートCも、汎用の用途に使えないだろうかと、M5Stack FIRE買ってからいろいろ試してみていたのですが、結果としては、I2C用のポートAの2本、UART用のポートCの2本とも、汎用I/Oとして使うことができました。

I2Cの2本は、内部的に9軸センサモジュールMPU9250と繋がっているので、このピンを汎用I/Oで使うと、なんらかの誤動作を引き起こす可能性はあります。最悪、故障する可能性もなくは無いかと思います。UARTの方は…本来の目的に使ったことが無いので、正直よくわからないのですが、指定外の使い方なので、何か誤動作が起きるかもしれないです。
少なくとも、内蔵のMPU9250を使いたい時は、ポートAはI2Cとして使わないとダメでしょうね。

(画像は https://m5stack.github.io/m5-docs/#/en/product_documents/m5stack-core/m5core_fire より)

このあたりは「自分で楽しむだけなので、少々誤動作しても別にOK!最悪、壊れたとしても、そのときはそのとき!また買えばいい!」ぐらいの割り切った気持ちでやっております。

あと、上の図では、GROVEケーブルの色順が「黒・赤・黄・白」ですが、一般的なGROVEケーブルだと「黒・赤・白・黄」になってますので、注意してくださいー。


前置きが長かったですが、ということで、 ポートBのG26、ポートCの G16 / G17 を使って、MAX7219 LED Dot Matrix Module に繋いでみます!

接続したら、プログラムをピンに合わせて書き換え。

LedControl lc=LedControl(16,26,17,1);

これでコンパイルしてみたところ、「avr/pgmspace.h」が見つからないエラーが出ました。検索してみると事例が。

https://github.com/espressif/arduino-esp32/issues/508

解決方法としては、LedControl.h の

#include <avr\pgmspace.h>

#if (defined(__AVR__))
#include <avr\pgmspace.h>
#else
#include <pgmspace.h>
#endif

に変更。これでコンパイル成功しました。実行!

あっさりと動きましたー。

M5Stack Gray も、同じピンに繋いで動作できました!


コントロールできるようになったので、美咲フォント使って日本語表示してみます。

美咲フォントライブラリも、「avr/pgmspace.h」が見つからないエラーが出ますので、上と同じように修正しておきます。

#include "LedControl.h"
#include <M5Stack.h>
#include <misakiUTF16.h>

LedControl lc=LedControl(16,26,17,1);
byte buf[8];
void drawJPChar(char *pUTF8) {
  uint16_t pUTF16[256];
  int strLength = 0;
  strLength = Utf8ToUtf16(pUTF16, pUTF8);
  for(int index = 0;index < strLength;index++){
    getFontDataByUTF16(buf, utf16_HantoZen(pUTF16[index])); 
    for(int i = 0;i < 8;i++){
      lc.setRow(0, i, buf[i]);
    }
    delay(500);
  }
}
void setup() {
  M5.begin();
  delay(1000);
  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);
  drawJPChar("さらば愛しきルパンよ");
}
void loop() { 
}

♪ちゃららら~ん!テレッテレテレッテレッテッテッテー!