🚨

ドットマトリクスモジュールの使い方

2023/01/13に公開

ドットマトリクスの特徴

https://akizukidenshi.com/catalog/g/gI-05738/

  • 200円
  • 8x8が1単位
  • そのままでも使えるが制御がたいへん
  • MAX7219 と組み合わせると扱いやすくなる

MAX7219 の特徴

https://akizukidenshi.com/catalog/g/gI-15312/

http://www.microtechnica.tv/support/manual/MAX7219_jp.pdf

  • 800円 (単品で買うと高い?)
  • ドットマトリクスとペアにして1個のモジュールになる
    • モジュールは数珠繋ぎにできる
    • モジュール毎に輝度を調整できる
  • 配線は電源とGND除いて3本で済む
  • 7セグメントLEDの制御にも使える?
    • たぶん中の仕組みは同じなのでどちらにも使えるっぽい

モジュール化されたもの

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

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

配線

モジュール側 Arduino側
DIN D2 Data In
CS D3 Chip Select
CLK D4 Clock
VCC 5V
GND GND

これでも動いたけど間違っているかもしれない。

ライブラリ

http://wayoda.github.io/LedControl/

2015年を最後に開発が止まっている。今回はこちらを使わせてもらったが MD_MAX72XX の方がより抽象化されている。

ドキュメント

http://wayoda.github.io/LedControl/pages/software.html

メソッド

共通
メソッド 意味
LedControl(dataPin, clkPin, csPin, numDevices=1) コンストラクタ
getDeviceCount() モジュール数を返す
shutdown(addr, status) 表示するには false にする
setIntensity(addr, intensity) 明るさ調整 0..15
clearDisplay(addr) 消灯
ドットマトリクス用
メソッド 意味
setLed(addr, row, column, state) (column, row) = state
setRow(addr, row, value) 1バイト分を一気に書き込む (横)
setColumn(addr, col, value) 1バイト分を一気に書き込む (縦)
7セグメントLED用
メソッド 意味
setDigit(addr, digit, value, dp) 16進表示
setChar(addr, digit, value, dp) 文字表示
setScanLimit(addr, limit) ? (TODO)

コード

#include <LedControl.h>

LedControl lc = LedControl(2, 4, 3, 1); // DIN, CLK, CS, モジュール数

void setup() {
  for (int i = 0; i < lc.getDeviceCount(); i++) {
    lc.shutdown(i, false);      // 表示する(お約束)
    lc.setIntensity(i, 8);      // 明るさ(0..15)
    lc.clearDisplay(i);         // いったん全消去
  }
}

void loop() {
  lc.setRow(0, 0, millis() / (1000 * 0.25));
}

numDevices と addr の関係

モジュールの個数を numDevices に指定する。個数はあとから getDeviceCount で参照できる。その後 addr にはモジュールのインデックスを指定する。もし numDevices が 1 なら addr は常に 0 になる。

モジュールを跨げる?

跨げない。addr 0 に setRow で16ビット書き込んでも addr 1 に上位8ビットが反映されたりはしない。addr の切り替えは自分で行う。

4連装備なのに2個と偽ったらどうなる?

0, 1 と 2, 3 が同じ表示になる。同様に numDevices = 1 とした場合 0 と 1, 2, 3 は同期する。

数珠繋ぎ方法

数珠繋ぎにできるとはいえ配線が大変なので4連繋ぐなら最初から4つ基板で繋がっているのを買った方がよい。

shutdown とは?

lc.shutdown(i, false)

clearDisplay とは違う。停止するかどうかを決めるメソッドで初期値は停止している。なので使うには「シャットダウンしない」とする。

もしかして接続するピンは決まっている?

http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=539

Arduino Uno(ATmega168/328を搭載するボード): 10(SS)、11(MOSI)、12(MISO)、13(SCK)

モジュール側 Arduino Uno 側
DIN D12 / MISO
CS D11 / MOSI
CLK D10 / SS
LedControl lc = LedControl(12, 10, 11, 1); // DIN, CLK, CS, モジュール数

調べてみると上のように割り当てるのが正しいらしい。てっきり用途は特定のピンに依存していないものと勘違いしていた。しかし間違ったピンのままで動いているのはなぜだろう。

Discussion