🚨
4連ドットマトリクスの使い方
部品
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 |
しかし今回のライブラリのサンプルをみるとまたピンが違っている。
ライブラリ
以前使った LedControl では縦横の扱いは抽象化されていたが跨げなかった。MD_MAX72XX はより抽象化を進めて全体を1つの画面として扱える。
ドキュメント
ハードウェアタイプを変更する
- #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 以下を全置換しておく。ライブラリのソースを書き換える方法を見かけるがそれは古い情報なので注意する。
作者の記事の要約:
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 が初期値
縦も可変にするには?
多段に並べた上でこちらのライブラリを使うと大きなディスプレイとして扱えるらしい。
点・線・長方形・三角形・円・テキストなどの描画もサポートしているとのこと。
Discussion