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用に、数字やアルファベットを表示する関数も用意されていました。