ELEGOO:Lesson 15

Lesson15 MAX7219 LED Dot Matrix Module

8×8の赤色LEDマトリクスモジュール。なかなか使いでのありそうな部品です。

これをコントロールするのが、MAX7219 というLEDドライバーチップ。Arduino側からは、わずか3本のピンで 8×8 = 64 個のLEDの点灯をコントロールできます。64個のLEDがコントロールできるので、7セグメント(ピリオド含めて8つのLED)デジタル表示ディスプレイであれば、8桁までコントロールすることができるチップです。

ピンは5本。電源のVCC(5V) / GNDと、DIN(DATA IN) / CS(LOAD)  / CLK の3本の信号線。信号線3本はデジタル端子に繋ぎます。ここでは D12 / D11 / D10。

やりとりはSPI通信ですね。DINがシリアルデータ入力、CS(LOAD)がデータ入力のロード、CLKがクロック用とのこと。正直よくわかってないです。このへん、きっちり理解しようと思ったらデータシートをちゃんと読む必要ありますね…。

MAX7219 データシート(PDF)
http://www.microtechnica.tv/support/manual/MAX7219_jp.pdf

ひとまず理解は後回しにして!

プログラムからのコントロールには、LedControlライブラリを使います。(説明だと MaxMatrix ライブラリを使うって書いてあったけど、プログラムだと LedControl でした。)

最初に変数定義。

LedControl lc=LedControl(12,10,11,1);

DIN / CLK / CS  のピンと、デバイスの数。ピンの並びと引数順が違ってるので注意!

デバイス数指定があるので、何かと思ったのですが、examples/LCDemoCascadedDevices.ino を見たところ、反対側のピンを使って、複数個を連結できるみたいですね。8個までいけるっぽい。


setup() での処理は以下の通り。

MAX72XX は起動時にはパワーセーブモードなので、シャットダウンしてモードを切り替える。

lc.shutdown(0,false);

一つ目の引数が、対象デバイスのアドレス。(複数接続した場合、1台目が0で、1,2,3…と続きます。)
2つ目の引数が、パワーセーブモードフラグ(falseでノーマルモード)。

明るさを 8 に。

lc.setIntensity(0,8);

一つ目の引数が、対象デバイスのアドレス。2つ目の引数が、明るさ(1~15)指定。

表示を全クリア。

lc.clearDisplay(0);

これも引数で対象デバイスのアドレス指定。


loop() では、いろんな表示を順番に行っています。

void loop() { 
  writeArduinoOnMatrix();
  rows();
  columns();
  single();
}

writeArduinoOnMatrix

LEDに「A」「r」「d」「u」「i」「n」「o」の文字を順に表示します。

byte a[5]={B01111110,B10001000,B10001000,B10001000,B01111110};

バイト配列で表示用データを設定。字は8 x 5 の横向きですね。

lc.setRow(0,0,a[0]);
lc.setRow(0,1,a[1]);
lc.setRow(0,2,a[2]);
lc.setRow(0,3,a[3]);
lc.setRow(0,4,a[4]);

setRow で1行まとめて表示設定。対象デバイスのアドレス、表示位置(x,y)と、表示内容バイトを設定して表示。

あとはdelay 入れて、文字数繰り返しですね。

終わったら全行クリアしてます。

lc.setRow(0,0,0);
lc.setRow(0,1,0);
lc.setRow(0,2,0);
lc.setRow(0,3,0);
lc.setRow(0,4,0);

lc.clearDisplay(0); を1行ずつやってる感じ。


rows

行を移動しつつ、ドット2個表示と、消去を繰り返し。行の位置に応じた回数点滅する処理も入ってます。(表示が速いので見てるだけだとその処理には気が付かないかも。)

「行」っていわれても、パーツ的にどっちが上なんだかわからない感じですけども、VCC/GND…の文字方向と同じと考えてといいみたいです。

lc.setRow(0,row,B10100000);

lc.setRow(0,row,(byte)0);

を繰り返してる感じです。


columns

row と同じことを列で。列の場合は setColumn ですね。

lc.setColumn(0,col,B10100000);

lc.setColumn(0,col,(byte)0);

single

1ドットずつ、点滅→点灯を繰り返し、最後は全部のLEDが点灯します。setLedで、(x, y) と点灯フラグを指定します。

lc.setLed(0,row,col,true);

lc.setLed(0,row,col,false);

明るさは、抑えめに指定してたはずなのですが、それでも実物で見ると結構まぶしいですね。


他の関数として、7セグメントLED用に、数字やアルファベットを表示する関数も用意されていました。