MAX7219をArduino UNOで使ってみる
MAX7219の使用方法について調べてみました.
電子工作界隈では7セグLEDなどをドライブするために,よくSN74HC595Nという8bitシフトレジスタが使用されるみたいです.これ1つでコントロールできるLEDは8個までですが,入門用のキットについてきたチュートリアルではSN74HC595Nをカスケード接続して片方をセレクタとすることで,見掛け上8x8個のLEDドットマトリクスを制御するという方法が紹介されていました.これはいわゆるダイナミック点灯と呼ばれる手法ですが,これだと常時LED用の表示プログラムを走らせておく必要があります.
この問題をお手軽に解決できるICがMAX7219です.このICは内部のレジスタに記録された値を自動で表示してくれるようになっているため,一度レジスタ値をセットするとあとは勝手に表示し続けてくれます.
MAX7219について
前置きで説明した通り,最大8桁までの7セグLEDや8x8のLEDドットマトリクスを信号線3本で制御できます.またMAX7219自体もカスケード接続可能ですので,LEDドットマトリクスを複数個制御するのに使えそうです.
データシートはAnalog Devicesのサイトから入手できます
以下,データシートの通りですが一応簡単にまとめておきます.
各ピンの配置と仕様
PIN | NAME | FUNCTION |
---|---|---|
1 | DIN | シリアルデータ入力.CLKの立ち上がりでデータを16bitシフトレジスタに取り込む. |
2,3,5-8,10,11 | DIG 0 - DIG 7 | 各7セグLEDのコモンカソードに接続して吸い込みで使う.未使用時はV+に設定される. |
4,9 | GND | どちらもGNDに繋ぐ必要あり. |
12 | LOAD | データをロードする.立ち上がりで直近DINから入力された16bitがラッチされる. |
13 | CLK | 最高10MHzまでのクロック. |
14-17, 20-23 | SEG A - SEG G, DP | 7セグ&DP に繋ぐ.ティピカルな繋ぎ方は後述. |
18 | ISET | 抵抗を通してV+に繋ぐことでピークセグメント電流を設定する. |
19 | V+ | +5V 電源 |
24 | DOUT | シリアルデータ出力.数珠繋ぎにする場合ここにMAX7219のDINを接続する.単体の場合はNCでいいのかな? |
ISETに繋ぐ抵抗値
詳しい計算方法はデータシートに書いてありますのでそちらをご参照ください.実験目的ならとりあえず10kΩつけとけば良さそうです.
7セグLEDへの接続方法
ティピカルな接続方法は以下になります.ただ,デコーダを使用せずに自前で1セグメントごとに制御したい場合は好きに繋いでも好きに繋げば良いかと.
制御方法
このタイミングチャートを見ると,要はLOADがLOWの間に1パケット=16bitを送ることができるようです(*). 16bitの送り方ですが,CLOCKがHIGHになったタイミングのDINのデータを取り込むことようですね.
(*)データシートには,データ取り込み時のLOADの状態はDon't careでLOADの立ち上がりタイミングで1パケット分ラッチすると書かれています.
最初の8bitでレジスタを選択して,後半8bitでレジスタの中身をセットするようです.
初期化処理
使う前にいくつかの前処理が必要になるみたいです.
Normal Operation Modeへ変更
電源投入直後はShutdown ModeになっているのでまずはShutdownレジスタを設定してNormal Operationに変更する必要があります.
Shutdownレジスタのアドレスは0x0C,Normal Operationは0x01となっています.
- レジスタ:0x0C
- データ:0x01
なので,送るデータは 0x0C01 となります.
スキャンリミットの設定
スキャンリミット(接続する7セグLEDの桁数)を設定します.
- レジスタ:0x0B
- データ:0x0X
Nは制御したい7セグの個数になります.0からはじまるので実際には 制御したい7セグの個数-1 を設定します. たとえば6個の7セグLEDを制御したい場合は 0x05 になります.
なので,送るデータは 0x0B05 となります.
輝度の設定
輝度を設定します.0x00 が輝度が一番低く, 0x0F へと増えていくにしたがって明るくなるようです.
- レジスタ:0x0A
- データ:0x0X
なので,とりあえず一番明るくするためには 0x0A0F を送ります.
デコードモードの設定
デコードモードを設定します.no-decodeに設定すると各セグメントを直接制御できるようになります. ドットマトリクスの場合は言うまでもなくno-decodeモードです.7セグLEDを使う場合は使いやすい方を選択すれば良いでしょう.
- レジスタ:0x09
- データ:0x0X
とりあえずno-decodeで動かしてみたかったので 0x0900 を送ります.
Arduinoでドライブするため初期化サンプルコード
shiftoutを使ってアドレス,データの順でMSB FIRSTで送るようにしてみました.あくまでも動かし方を学ぶために書いたコードなので実用ではMAX72xx用のライブラリを使った方が良いのではないかと思います.コードから自明ですが,2番ポートにDINを,3番ポートにLOADを,4番ポートにCLKを接続しています.
#define DIN 2
#define LOAD 3
#define CLK 4
void setup()
{
pinMode(DIN, OUTPUT);
pinMode(LOAD, OUTPUT);
pinMode(CLK, OUTPUT)
}
// Initialize MAX7219
void initMax7219()
{
// Set shutdown register to normal operation
digitalWrite(LOAD, LOW);
shiftOut(DIN, CLK, MSBFIRST, 0x0C);
shiftOut(DIN, CLK, MSBFIRST, 0x01);
digitalWrite(LOAD, HIGH);
// Set ScanLimit
digitalWrite(LOAD, LOW);
shiftOut(DIN, CLK, MSBFIRST, 0x0B);
shiftOut(DIN, CLK, MSBFIRST, 0x05);
digitalWrite(LOAD, HIGH);
// Set brightness
digitalWrite(LOAD, LOW);
shiftOut(DIN, CLK, MSBFIRST, 0x0A);
shiftOut(DIN, CLK, MSBFIRST, 0x0F);
digitalWrite(LOAD, HIGH);
// Set decode register to no-decode mode
digitalWrite(LOAD, LOW);
shiftOut(DIN, CLK, MSBFIRST, 0x09);
shiftOut(DIN, CLK, MSBFIRST, 0x00);
digitalWrite(LOAD, HIGH);
}
void loop()
{
// あとはお好きに...
}
MAX7219の入手方法
おそらくコピー品ですがAliExpressで1個数十円から手に入ります.またAmazonでもDIP品が売られているほか,LEDドットマトリクスとモジュール化して売られているものがあるようです.ICソケットにDIP品が刺さっているモジュールもあるみたいです.こういうモジュールに載っているものもおそらくコピー品でしょう.どうやらMAXIM純正品はひとつ1000円くらいするみたいですので.
AmazonでMAX7219で検索するとたくさん出てきます.
こういうのとか,安すぎですね. (画像クリックでAmazonの商品ページに飛びます)
これはアリエクで買ったMAX7219.刻印はありますがあきらかに薄いです.おそらくコピー品.10個買って幸い全部正常に動くみたいですが1個でも動けば儲けもんと思って買うくらいの気持ちが必要です.