🚨
ドットマトリクスモジュールの使い方
ドットマトリクスの特徴
- 200円
- 8x8が1単位
- そのままでも使えるが制御がたいへん
- MAX7219 と組み合わせると扱いやすくなる
MAX7219 の特徴
- 800円 (単品で買うと高い?)
- ドットマトリクスとペアにして1個のモジュールになる
- モジュールは数珠繋ぎにできる
- モジュール毎に輝度を調整できる
- 配線は電源とGND除いて3本で済む
- 7セグメントLEDの制御にも使える?
- たぶん中の仕組みは同じなのでどちらにも使えるっぽい
モジュール化されたもの
配線
モジュール側 | Arduino側 | |
---|---|---|
DIN | D2 | Data In |
CS | D3 | Chip Select |
CLK | D4 | Clock |
VCC | 5V | |
GND | GND |
これでも動いたけど間違っているかもしれない。
ライブラリ
2015年を最後に開発が止まっている。今回はこちらを使わせてもらったが MD_MAX72XX の方がより抽象化されている。
ドキュメント
メソッド
共通
メソッド | 意味 |
---|---|
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 とは違う。停止するかどうかを決めるメソッドで初期値は停止している。なので使うには「シャットダウンしない」とする。
もしかして接続するピンは決まっている?
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