素子:7セグLEDドライバ MAX7219

MAXIMの7セグメントLEDドライバー

PICやAVR等のMPUで直接7セグメントLEDを点灯させようとすると
 ソフトウェア
  ・桁ストローブの割り込み処理プログラムが面倒
  ・数字の点灯パターンの定義が面倒
  ・I/Oピンが多数必要
 ハードウェア
  ・電流増幅のためトランジスタやトランジスタアレーを回路に追加する必要がある
  ・電流制限抵抗が必要になる
これらがプログラムや回路を複雑にしてくれる
MAX7219を使うとこれらが省略できる

特徴
・8桁の7セグメントLEDをドライブできる
・7セグメントLEDはカソードコモンに対応している
 セグメントと桁を逆に繋げばアノードコモンもドライブできるが
  -数値表示をするときにmax7219内蔵のセグメント点灯パターン(フォント)が使えなくなるのでソフトが複雑になってしまう
  -セグメント単位でデータを送り込むことになるのでさらにソフトが複雑になってしまう
  -桁スキャンは常に8桁分必要になり輝度が稼げない
・内蔵フォントは 0123456789-ELHP だけ。これ以外の AbcdF なんかを表示したければ non decodeモードを使う
・non decodeモードが有るので8x8のドットマトリクスLEDもドライブ可能
 8x8はカソードコモンでもありアノードコモンでもある
・輝度はソフトで調整できる(最大輝度は抵抗1本で制限する)
・3線式シリアルインターフェースなので使うI/Oピンが少なくて済む
 SPIもどきプロトコル。SPIはシンプルなプロトコルなのでSPIを使わなくてもそんなにプログラムは複雑にならない
・カスケード接続することで3線だけで複数ドライブ可能
・arduinoはshiftOut命令があるのでSPIを使用してもコードはシンプルにならない
 しかもSPIはデジタル13番ピンを使うのでLEDとぶつかって何かと不便
・ハード/ソフトが単純になる代わりにmax7219を初期化する手順が必要になる
・クロックスピードは最小100nsと十分に速いのでプログラム上速度を気にした物を書かなくて良い

注意点
・MAX7219Cxx:0~70度、 MAX7219Exx:-40~85度 Cxxは他の多くの半導体に比べ最低気温が高め。冬期屋外、車内での使用に注意
・輝度設定抵抗は10kΩ以下にしてはいけない。桁数が少ないときはさらに大きくして電流を抑える。詳しくは日本語データシート8ページ右下と10ページ右側を参照
・LEDは電気大食い。USB経由の場合、表示している値によって電源電圧が大きく変動する。アナログ回路との混在はやならい方が良い


2013-01-06

arduinoでの動作確認の図

R0016152.jpg

数値以外の内蔵フォントはこれだけ。non decodeモードで数値とこれ以外の物を表示することも出来る。

R0016155.jpg

回路図。
・信号線に1kΩが入っているがブレッドボードで配線するときに間違って電源やGNDに繋いで壊さないようにするため。プリント基板にするなら間違えようが無いので抵抗不要。
・LED1だけコモンピンが2本接続されているが特に意味は無い。LED内部で繋がっている。

max7219.PNG
arduino+MAX7219 shiftOut命令によるサンプル
0001  /*---------------------- 2012-01-06  written by iizuka -----*/
0002 /* MAX7219 TEST */
0003 /*----------------------------------------------------------*/
0004 #define LOADpin 10
0005 #define DINpin 11
0006 #define CLKpin 13
0007
0008 void setup() {
0009 pinMode(LOADpin,OUTPUT);
0010 pinMode(DINpin, OUTPUT);
0011 pinMode(CLKpin, OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013 digitalWrite(DINpin, LOW );
0014 digitalWrite(CLKpin, LOW );
0015 delay(1);
0016
0017 max7219write( 0x0F, 0x00 ); // display test , normal operation
0018 max7219write( 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0019 max7219write( 0x0A, 0x08 ); // intensity , 0x01=dark .... 0x0F=bright
0020 max7219write( 0x0B, 0x07 ); // scan limit , display 0 to 7
0021 max7219write( 0x0C, 0x01 ); // shutdown mode register , normal operation
0022 }
0023
0024 void loop()
0025 {
0026 max7219write( 0x09, 0xFF ); // DIGIT 0-7 : Code
0027 // display "12345678"
0028 max7219write( 1, 1 );
0029 max7219write( 2, 2 );
0030 max7219write( 3, 3 );
0031 max7219write( 4, 4 );
0032 max7219write( 5, 5 );
0033 max7219write( 6, 6 );
0034 max7219write( 7, 7 );
0035 max7219write( 8, 8 );
0036 delay(2000);
0037
0038 // display "9-EHLP "
0039 max7219write( 1, 9 );
0040 max7219write( 2, 10 );
0041 max7219write( 3, 11 );
0042 max7219write( 4, 12 );
0043 max7219write( 5, 13 );
0044 max7219write( 6, 14 );
0045 max7219write( 7, 15 );
0046 max7219write( 8, 15 );
0047 delay(2000);
0048
0049 // display "1234Abcd"
0050 max7219write( 0x09, 0x0F ); // DIGIT 0-3 : Code DIGIT 4-7 : No decode
0051 max7219write( 1, 1 );
0052 max7219write( 2, 2 );
0053 max7219write( 3, 3 );
0054 max7219write( 4, 4 );
0055 max7219write( 5, B01110111 );
0056 max7219write( 6, B00011111 );
0057 max7219write( 7, B00001101 );
0058 max7219write( 8, B00111101 );
0059 delay(2000);
0060 }
0061
0062
0063 void max7219write( byte high_byte, byte low_byte )
0064 {
0065 digitalWrite( LOADpin, LOW );
0066 shiftOut( DINpin, CLKpin, MSBFIRST, high_byte );
0067 shiftOut( DINpin, CLKpin, MSBFIRST, low_byte );
0068 digitalWrite( LOADpin, HIGH );
0069 delayMicroseconds(1);
0070 }
行番号
解説
9-14行目
I/Oピンの設定
17行目
全灯点灯するテストモードを備えている。これはテストモードでは無い通常モードの設定
18行目
桁単位にデコードするか否かを設定できる 数値で1を送るとセグメントB,Cを点灯させて1の文字パターンを表示させるのがデコード 送った8ビットデータを各セグメントに対応させるのが非デコード。8x8LEDマトリクスはこのモードを使う このサンプルではLoopの中で設定しているのでここに書く意味は無い。初期化命令が5つ有ると言うことを示すために書いてある。
19行目
輝度設定
20行目
LEDは8桁全部繋いであるとは限らない少なければ上位桁のスキャン(=ストローブ)が不要になり輝度を稼げる
21行目
表示のON,OFF切り替え。初期化の一番最後にやる
26-59行目
"12345678" -> "9-EHLP " -> "1234Abcd" の表示を繰り返す
63-70行目
最初にLOADピンをLOWにしてから16ビットのデータをクロックに合わせて送信する。その後LOADピンをHIGHにすると送った16ビットのデータが有効になる。ここで32ビットのデータを送った後にLOADピンをHIGHにすると最後に送った16ビットだけが有効で最初に送った16ビットは捨てられる。

上のプログラムの波形の一部。shiftOut命令はかなり遅い。16ビット送るのに300μ秒かかっている
Probe00:CLK
Probe01:LOAD
Probe02:DIN
Probe03:DOUT カスケード接続の時に使う。DINで入力された物が16クロック遅れて出力される

shiftout.PNG
arduino+MAX7219 SPIによるサンプル
0001  /*---------------------- 2012-01-06  written by iizuka -----*/
0002 /* MAX7219 TEST */
0003 /*----------------------------------------------------------*/
0004 #include <SPI.h>
0005
0006 #define LOADpin 10
0007 // DIN = Digital 11 pin
0008 // CLK = Digital 13 pin
0009
0010 void setup() {
0011 pinMode(LOADpin,OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013
0014 SPI.begin();
0015 SPI.setBitOrder(MSBFIRST);
0016 SPI.setClockDivider(SPI_CLOCK_DIV2);
0017 SPI.setDataMode(SPI_MODE0);
0018
0019 delay(500);
0020 max7219write( 0x0F, 0x00 ); // display test , normal operation
0021 max7219write( 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0022 max7219write( 0x0A, 0x08 ); // intensity , 0x01=dark .... 0x0F=bright
0023 max7219write( 0x0B, 0x07 ); // scan limit , display 0 to 7
0024 max7219write( 0x0C, 0x01 ); // shutdown mode register , normal operation
0025 }
0026
0027 void loop()
0028 {
0029 max7219write( 0x09, 0xFF ); // DIGIT 0-7 : Code
0030 // display "12345678"
0031 max7219write( 1, 1 );
0032 max7219write( 2, 2 );
0033 max7219write( 3, 3 );
0034 max7219write( 4, 4 );
0035 max7219write( 5, 5 );
0036 max7219write( 6, 6 );
0037 max7219write( 7, 7 );
0038 max7219write( 8, 8 );
0039 delay(2000);
0040
0041 // display "9-EHLP "
0042 max7219write( 1, 9 );
0043 max7219write( 2, 10 );
0044 max7219write( 3, 11 );
0045 max7219write( 4, 12 );
0046 max7219write( 5, 13 );
0047 max7219write( 6, 14 );
0048 max7219write( 7, 15 );
0049 max7219write( 8, 15 );
0050 delay(2000);
0051
0052 // display "1234Abcd"
0053 max7219write( 0x09, 0x0F ); // DIGIT 0-3 : Code DIGIT 4-7 : No decode
0054 max7219write( 1, 1 );
0055 max7219write( 2, 2 );
0056 max7219write( 3, 3 );
0057 max7219write( 4, 4 );
0058 max7219write( 5, B01110111 );
0059 max7219write( 6, B00011111 );
0060 max7219write( 7, B00001101 );
0061 max7219write( 8, B00111101 );
0062 delay(2000);
0063 }
0064
0065
0066 void max7219write( byte high_byte, byte low_byte )
0067 {
0068 digitalWrite( LOADpin, LOW );
0069 SPI.transfer( high_byte );
0070 SPI.transfer( low_byte );
0071 digitalWrite( LOADpin, HIGH );
0072 }
行番号
解説
9-14行目
I/Oピンの設定
16行目
arduinoなら目一杯SPIの通信速度を速くしても大丈夫。MAX7219は十分速い
69-70行目
大きく違うのはここだけ

SPIの時の波形。SPIそのものは高速。関数の呼び出しオーバーヘッドの方が大きい。

spimaxspeed.PNG

上の波形の全体図。8桁分のデータ送信に要する時間は0.1msと十分に速い

spimaxspeed8char.PNG

カスケード接続するとデータ送信時間がカスケード段数だけ増えるがMPUのI/Oピンは3本のままでよい。写真は8桁のLEDを作るのが面倒だったので3桁のLEDで代用

R0016160.jpg

カスケード接続の回路図

cascade.PNG
arduino+MAX7219 カスケード接続のサンプル
0001  /*---------------------- 2012-01-06  written by iizuka -----*/
0002 /* MAX7219 TEST CASCADE */
0003 /*----------------------------------------------------------*/
0004 #define LOADpin 10
0005 #define DINpin 11
0006 #define CLKpin 13
0007
0008 void setup() {
0009 pinMode(LOADpin,OUTPUT);
0010 pinMode(DINpin, OUTPUT);
0011 pinMode(CLKpin, OUTPUT);
0012 digitalWrite(LOADpin,HIGH);
0013 digitalWrite(DINpin, LOW );
0014 digitalWrite(CLKpin, LOW );
0015 delay(1);
0016
0017 max7219write( 0x0F, 0x00, 0x0F, 0x00 ); // display test , normal operation
0018 max7219write( 0x09, 0xFF, 0x09, 0xFF ); // decode mode , decode digit 0 to 7
0019 max7219write( 0x0A, 0x06, 0x0A, 0x06 ); // intensity , 0x01=dark .... 0x0F=bright
0020 max7219write( 0x0B, 0x07, 0x0B, 0x02 ); // scan limit , main -> display 0 to 7 sub -> 0 to 2
0021 max7219write( 0x0C, 0x01, 0x0C, 0x01 ); // shutdown mode register , normal operation
0022 }
0023
0024 void loop()
0025 {
0026 // display "01234567" "89-"
0027 max7219write( 1, 0, 1, 8 );
0028 max7219write( 2, 1, 2, 9 );
0029 max7219write( 3, 2, 3, 10 );
0030 max7219write( 4, 3, 0, 0 );
0031 max7219write( 5, 4, 0, 0 );
0032 max7219write( 6, 5, 0, 0 );
0033 max7219write( 7, 6, 0, 0 );
0034 max7219write( 8, 7, 0, 0 );
0035 delay(2000);
0036
0037 // display "-9876543" "210"
0038 max7219write( 1, 10, 1, 2 );
0039 max7219write( 2, 9, 2, 1 );
0040 max7219write( 3, 8, 3, 0 );
0041 max7219write( 4, 7, 0, 0 );
0042 max7219write( 5, 6, 0, 0 );
0043 max7219write( 6, 5, 0, 0 );
0044 max7219write( 7, 4, 0, 0 );
0045 max7219write( 8, 3, 0, 0 );
0046 delay(2000);
0047 }
0048
0049
0050 void max7219write( byte addrmain, byte datamain, byte addrsub, byte datasub )
0051 {
0052 digitalWrite( LOADpin, LOW );
0053 shiftOut( DINpin, CLKpin, MSBFIRST, addrsub );
0054 shiftOut( DINpin, CLKpin, MSBFIRST, datasub );
0055 shiftOut( DINpin, CLKpin, MSBFIRST, addrmain );
0056 shiftOut( DINpin, CLKpin, MSBFIRST, datamain );
0057 digitalWrite( LOADpin, HIGH );
0058 delayMicroseconds(1);
0059 }
行番号
解説
50-59行目
最初に後段用の16ビットを送ってから前段用の16ビットを送る
回路図&スケッチ現物
ファイル ファイルタイプ 添付ファイルの解説
arduino7seg_max7219_KW1.zip EAGLE 8桁版の回路図 基板レイアウトは入っていない(上に貼ってある物と同じ)
arduino7seg_max7219_C552SR.zip EAGLE カスケード接続した16桁版の回路図 基板レイアウトは入っていない(上に貼ってある物と同じ)
ino.zip OTHER 上の3つのarduinoサンプルスケッチ現物