「たくさんのLEDを光らせたいけれど、マイコンのピンが足りない……」 そんな悩みを解決してくれるのが、シリアル入力対応のLEDドライバMAX7219です。(MAX7221も同様に使えます)
このICには便利な「デコード機能」が備わっており、数値データを送るだけで7セグメントLEDに数字を表示させることができます。
しかし今回は、将来的にグリッド状のLEDを自在に制御するマトリクス表示への挑戦を見据え、あえてデコード機能を使わずに直接アドレスを指定して1つ1つのLEDを制御する方法で「流れるLチカ」に挑戦しました。
Raspberry Pi Zeroなどで、このサイトや自作界隈でおなじみのRP2040(3.3Vロジック)と5V駆動のMAX7219CNGを組み合わせ、8個のLEDを順番に点灯させていきます。
MAX7219ってどんなIC?
MAX7219(およびMAX7221)は、コンパクトなシリアル入力のコモンカソードディスプレイドライバです 。

ピンアサイン

標準アプリケーション回路
(TOPビューのピンアサインと標準アプリケーション回路は、maxim integrated MAX7219/MAX7221 マニュアルより引用。https://akizukidenshi.com/goodsaffix/max7219_max7221_j.pdf )
MAX7219
LED制御マイコン 本ICは互換品やコピー品が流通しているため、あまりに安いものは注意
広告
主な特徴は以下の通りです:
- シリアル通信:DIN、CLK、LOAD(またはCS)の3本(+電源・GND)で制御可能です。
- デコード機能:BCDコードBデコーダを内蔵しており、数字や特定の文字(0-9, E, H, L, P, -)を簡単に表示できます。
- 個別制御も可能:各桁ごとにデコードの有無を選択できるため、今回のようにLEDを1つずつ制御することも可能です。
- 明るさ調整:デジタルおよびアナログの両方で輝度を制御できます。
MAX7219とMAX7221のちがい
7セグメントLEDやLEDマトリクスの定番ドライバとして知られる MAX7219 と MAX7221。
型番が違うものの、「何が違うの?」「どちらを選べばいいの?」と迷う人も多いICです。
結論から言えば、基本機能はほぼ同じで、用途によって使い分けると便利、という関係にあります。
共通点(ほぼ同じところ)
MAX7219 と MAX7221 は、以下の点でほぼ共通です。
- 8桁7セグメント(ドット有り)、または 8×8 LED マトリクスを直接駆動可能
- シリアル通信(3線)で制御できる
- 輝度制御、シャットダウン、テストモードなどの機能は同一
- レジスタ構成・制御方法は共通
- 同じ回路・同じライブラリで動作することが多い
そのため、単体でLED表示を行う用途では体感できる差はほとんどありません。
違い(押さえておきたいポイント)
1. SPI互換性の違い
- MAX7221:SPI仕様に準拠(CSがLOWのときのみ通信)
- MAX7219:SPIに完全準拠していない(CSがHIGHでもクロックに反応)
複数のSPIデバイスを同じバスで使う場合は MAX7221 が安全
単体使用なら MAX7219 でも問題なし、MAX7219でも、DOUTの工夫次第で複数接続できますが、7221よりは制御にコツが必要です。
2. EMI(ノイズ対策)の有無
- MAX7221:出力スルーレート制限あり(ノイズ低減)
- MAX7219:特に対策なし
ノイズが気になる環境(長い配線、業務機器など)では MAX7221 が有利
趣味・実験用途ではほぼ差を感じない
まとめると、使い方も使用感もほぼ同じ、ノイズ対策などの性能は7221の方が良い。どちらを選ぶかは値段と相談といった感じになると思います。
MAX7221
ノイズ対策が強いLED制御マイコン。本ICは互換品やコピー品が流通しているため、あまりに安いものは注意
広告
どうやってLEDを制御するのか?(アドレスとデータ)
MAX7219への指示は、16ビットのデータパケットを送ることで行います。
パケットのうち、D8〜D11の4ビットで「どのレジスタ(住所)」に書き込むかを指定し、D0〜D7の8ビットで「どんなデータ」を書き込むかを指定します。
今回、プログラムで操作する主なアドレス(レジスタ)は以下の通りです。
主要レジスタ一覧
| レジスタ名 | アドレス (HEX) | 説明 |
| Digit 0 | 0xX1 | LEDの状態を指定するレジスタ |
| Decode Mode | 0xX9 | BCDデコードを使うか、個別にセグメントを制御するか選択 |
| Intensity | 0xXA | LEDの明るさを16段階で設定 |
| Scan Limit | 0xXB | 表示するLEDの桁数を設定(今回は1桁分=LED8個) |
| Shutdown | 0xXC | 通常動作モード(1)か、シャットダウンモード(0)か選択 |
今回は「デコードなしモード」に設定することで、1つの桁レジスタ(Digit 0)内の各ビットを、8個のLEDそれぞれのON/OFFに対応させています。
セグメントの指定と書きこみプログラムの一部抜粋
# --- MAX7219 初期化シーケンス ---
print("Initializing MAX7219...")
write_reg(0x0F, 0x00) # ディスプレイテストOFF
write_reg(0x0C, 0x01) # 通常動作モード
write_reg(0x09, 0x00) # デコードモード: 無効
write_reg(0x0B, 0x00) # スキャンリミット: Digit 0 のみ
write_reg(0x0A, 0x03) # 輝度設定 (0x00 - 0x0F)
# 点灯させたいセグメントのリスト (A, B, C, D, E, F, G, DP)
segments = [
0x01, # A
0x02, # B
0x04, # C
0x08, # D
0x10, # E
0x20, # F
0x40, # G
0x80 # DP
]
# --- メインループ ---
try:
while True:
for seg_data in segments:
# 指定したセグメントのみを点灯
write_reg(0x01, seg_data)
time.sleep(0.3) 今回の回路設計
回路構成は非常にシンプルです。RP2040のSPIピン(2から4番に割り当てました)を、MAX7219のシリアル入力端子に接続します。
配線の概略ASCIIアート
[RP2040 (3.3V)] [MAX7219 (5V駆動)]
+---------------+ +-------------------+
| | +5V <---+-----------| 19 (V+) |
| GP4(DIN) |----->[DIN] | | |
| | +--[R_SET]--| 18 (ISET) |
| GP3(CLK) |----->[CLK] | | |
| | | | (DIG 0) 2 --+--[LED カソード共通線]
| GP2(CS) |----->[LOAD] | +--------------+
| | | | (SEG A) 14--|--> LED 1 アノード
| GND |-----> GND | | (SEG B) 16--|--> LED 2 アノード
+---------------+ | | (SEG C) 20--|--> LED 3 アノード
| | (SEG D) 23--|--> LED 4 アノード
[ノイズ対策パーツ] | | (SEG E) 21--|--> LED 5 アノード
・信号線3本に4.7kΩプルアップ | | (SEG F) 15--|--> LED 6 アノード
・V+ ~ GND間にパスコン接続 | | (SEG G) 17--|--> LED 7 アノード
(0.1uF) | | (SEG DP)22--|--> LED 8 アノード
[電流制御抵抗 R_SET] | +-------------------+
R_SETの抵抗でLEDの電流を制御できます +----[ GND (4, 9) ]---- GND
GNDにつなぐなどすると最悪燃えるので注意
今回は10kΩの抵抗をつないでいます。
配線のポイント
- 信号線(DIN, CLK, LOAD):RP2040からの3本の信号線には、すべて4.7kΩのプルアップ抵抗を挿入しました。(+Vと抵抗で接続) これにより、通信の立ち上がりを安定させ、ノイズによる誤動作を防いでいます。
- LEDの接続:MAX7219のDIG 0(2番ピン)をLEDのカソード(共通)に、SEG A〜G, DP(14〜17, 20〜23番ピン)を各LEDのアノードに接続します。
- 電源周りのノイズ対策:データシートの推奨通り、V+とGNDの間に0.1\(mu\)Fのセラミックコンデンサを配置しました。これは、LED駆動時の急激な電流変化による電源リップルを抑えるためです。
動作確認:順次Lチカ成功!
配線が完了し、初期設定とデータを送る準備が整いました。
アドレス操作で点灯を行うプログラムを実行してみると、8個のLEDが端から順番に、点灯していく様子が確認できます。
たった3本の信号線でこれだけの制御ができるのは、MAX7219が内部で複雑なスキャン処理を代行してくれているおかげです。
ブレッドボードでの配線が困難であるため8列1行としていますが、MAX7219では、アドレス指定を変えるだけで最大8×8(計64個)のLEDを制御することができます。
まとめと次回の予告
今回はMAX7219の仕組みを理解し、ハードウェアとしての「Lチカ」環境を整え、簡単なウェーブLチカを行ってみました。
- MAX7219は3本線で制御できる賢いドライバ。
- アドレス(住所)とデータ(中身)を16ビットで送る。
- パスコンやプルアップ抵抗で、通信の安定性を高めるのがコツ。
次回は、今回詳しく説明しなかった「具体的にRP2040からどんなプログラムを書いてデータを送るのか?」というソフトウェア・アドレス制御編をお届けします。
次回
ラズパイとMAX7219でスマートにLチカ!3本の信号線で8個のLEDを自在に操る-プログラム・アドレス制御編-
MAX7219を使いこなす鍵「16ビットパケット」と「アドレス指定」を徹底解説!ラズパイ(RP2040)を用いたSPI通信の手順、必須となる4つの初期化レジスタ設定、ビット単位でLEDを操作するロジックを詳しく紹介します。CircuitPythonのサンプルコード付きで、マトリクス制御の基礎が身につきます。
ここまで読んでいただきありがとうございます。
では、次の記事で。 lumenHero
このシリーズの記事一覧ページ
2 記事
ラズパイでLED制御(max7219)
マトリクスLEDや複数行の7セグのLED制御が出来るチップMAX7219をラズパイを用いたSPI通信で制御します。