前回Arduinoで4連8X8 Dot Matrix LEDを点灯させるテストをしました。記事はこちら。
この時は、MD_MAX72xx というライブラリを使いました。今回は、コントローラMAX7219の働きを勉強するために、ライブラリを使わないで8X8 Dot Matrix LEDを動作させてみます。Web上で参考になるサイトを探したら、TronicsBench.comというサイトを見つけ、プログラムを参照させていただきました。
まず、MAX7219の日本語マニュアルをダウンロードして、読み込むことにしました。が、全てを読むことはできないので、とりあえず、簡単なテストからやってみようと思います。
MAX7219のファンクションダイアグラムです。(マニュアルからコピーしました)
ArduinoからMAX7219にSPI通信でコマンドやデータを送ります。(MSBFIRSTでD15から順に送ります)コマンド、データは16bitで次の表のように、D8~D11の値で次のようにコマンドレジスタかDIG0~DIG7が指定されます。
今回は、Lチカ(LED点滅)に相当するDisplay Test(レジスタアドレス0x0F)を指定して、8X8LEDの点灯テストをします。
送信データのD8~D11=0x0Fとし、D0~D7は、下の表に従って、Normal Operationの時0X00、Display Test Modeの時0x01とします。Test ModeでLEDが全点灯し、Normalで全消灯します。
Arduinoと8X8LEDとの接続は次のとおりです。
Arduino 8X8LED
5V VCC
GND GND
D11(MOSI) DIN
D13(SCK) CLK
D10(CS) CS
Arduinoのスケッチです。
--------------------------------------------------------------------------------
/* Arduino 8X8DotMatrix max7219 test
* Example1
* 2022.08.07
* JH7UBC Keiji Hata
*/
#include <SPI.h>
#define CS_PIN 10
#define MAX7219_TEST 0x0f
void maxTransferCMD(uint8_t address, uint8_t value) {
digitalWrite(CS_PIN, LOW);
SPI.transfer(address); // Send address.
SPI.transfer(value); // Send the value.
digitalWrite(CS_PIN, HIGH); // Finish transfer.
}
void setup() {
pinMode(CS_PIN, OUTPUT);
SPI.setBitOrder(MSBFIRST); // Reverse the SPI Data o/p.
SPI.begin(); // Start SPI
}
void loop() {
maxTransferCMD(MAX7219_TEST, 0x01);//全点灯
delay(1000);
maxTransferCMD(MAX7219_TEST, 0x00);//全消灯
delay(1000);
}
--------------------------------------------------------------------------------
最初の8X8LEDユニットに送られたデータは、DOUTから出力され、次のユニットのDINに送られます。従って、右端から順に全点灯、前消灯を1秒ごとに繰り返します。