🚨

4連ドットマトリクスの使い方

2023/01/15に公開

部品

https://www.amazon.co.jp/dp/B07FFV537V

8x8 と MAX7219 のペアを1モジュールとする。そのモジュールが4つ基板で繋がっている。

配線

モジュール側 Arduino Uno 側
DIN D11
CS D10
CLK D13

ライブラリのサンプルにあった通りにピンを割り当てる。

使用するピンはどれが正しいのか?

わからない。初めて動かしたときは次ので動いた。

モジュール側 Arduino Uno 側
DIN D2
CS D3
CLK D4

しかしネットを見ると次の方が正しいように書かれてある。ELEGOO のマニュアルもこれ。

モジュール側 Arduino Uno 側
DIN D12 / MISO
CS D11 / MOSI
CLK D10 / SS

しかし今回のライブラリのサンプルをみるとまたピンが違っている。

ライブラリ

https://github.com/MajicDesigns/MD_MAX72XX

以前使った LedControl では縦横の扱いは抽象化されていたが跨げなかった。MD_MAX72XX はより抽象化を進めて全体を1つの画面として扱える。

ドキュメント

https://majicdesigns.github.io/MD_MAX72XX/class_m_d___m_a_x72_x_x.html

ハードウェアタイプを変更する

-  #define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
-  #define MAX_DEVICES 11
+  #define HARDWARE_TYPE MD_MAX72XX::FC16_HW
+  #define MAX_DEVICES 4

PAROLA_HW から FC16_HW に変更する。MAX_DEVICES は4連なので 4 に変更する。ライブラリの examples 以下を全置換しておく。ライブラリのソースを書き換える方法を見かけるがそれは古い情報なので注意する。

https://arduinoplusplus.wordpress.com/2020/08/29/parola-a-to-z-frequently-asked-issues/#more-10294

作者の記事の要約:

MD_Parola 3.0 以前では、ライブラリ内の MD_MAX72XX.h ファイルを直接編集してマトリクスタイプを変更する必要がありました。
古いサードパーティのチュートリアルやプロジェクトの多くは、現在も存在しないコードの編集に言及しており一部の人たちを混乱させています。
Version 3 以降はスケッチごとに選択可能で、コンストラクタで指定できます。
テキストが正常に表示されるまで各オプションを順番に試してみてください。

コード

#include <MD_MAX72xx.h>
#include <SPI.h>

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES   4

#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

void setup() {
  mx.begin();
  mx.update(MD_MAX72XX::OFF);
}

void loop() {
  int count = millis() / (1000 * 0.1);
  mx.clear();
  mx.setPoint(0, count % mx.getColumnCount(), true);
  mx.update();
  delay(1000 / 60);
}

ピクセル描画するときに使う主なメソッド

メソッド 意味
setPoint(y, x, status) (y, x) = status
getColumnCount() width 相当
ROW_SIZE height 相当 (定数)

横幅はモジュール数に比例して可変だが縦幅は ROW_SIZE = 8 の固定になっている。

バッファの反映方法

メソッド 意味
update(MD_MAX72XX::OFF) 自動反映 OFF
update(MD_MAX72XX::ON) 自動反映 ON
update() 状況に関係なく強制的に反映する (全体)
update(index) 状況に関係なく強制的に反映する (index番目のモジュールのみ)

スクロールと回り込み

mx.wraparound(MD_MAX72XX::ON);   // 回り込み ON
mx.setPoint(0, 0, true);         // (y, x) = (0, 0) = 1
mx.transform(MD_MAX72XX::TSR);   // 右シフト(TSR)
  • wraparound を有効にすると shift は rotate に変わる
  • 左上のLEDを点灯する
  • 右シフトの結果、右上のLEDが点灯する

輝度調整

mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 2);
  • 0..15 の範囲で指定する
  • MAX_INTENSITY は 15
  • MAX_INTENSITY / 2 が初期値

縦も可変にするには?

多段に並べた上でこちらのライブラリを使うと大きなディスプレイとして扱えるらしい。

https://github.com/MajicDesigns/MD_MAXPanel

点・線・長方形・三角形・円・テキストなどの描画もサポートしているとのこと。

Discussion