ラズパイとMAX7219でスマートにLチカ!3本の信号線で8個のLEDを自在に操る

「たくさんの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)は、コンパクトなシリアル入力のコモンカソードディスプレイドライバです 。

MAX7219、及びMAX7221のDIPチップのピンアサインの画像

ピンアサイン

MAX7219、及びMAX7221で7segLEDを制御する回路の標準配線例

標準アプリケーション回路

(TOPビューのピンアサインと標準アプリケーション回路は、maxim integrated MAX7219/MAX7221 マニュアルより引用。https://akizukidenshi.com/goodsaffix/max7219_max7221_j.pdf )

MAX7219

MAX7219

LED制御マイコン 本ICは互換品やコピー品が流通しているため、あまりに安いものは注意

広告

主な特徴は以下の通りです:

  • シリアル通信:DIN、CLK、LOAD(またはCS)の3本(+電源・GND)で制御可能です。
  • デコード機能:BCDコードBデコーダを内蔵しており、数字や特定の文字(0-9, E, H, L, P, -)を簡単に表示できます。
  • 個別制御も可能:各桁ごとにデコードの有無を選択できるため、今回のようにLEDを1つずつ制御することも可能です。
  • 明るさ調整:デジタルおよびアナログの両方で輝度を制御できます。
MAX7219とMAX7221のちがい

7セグメントLEDやLEDマトリクスの定番ドライバとして知られる MAX7219MAX7221
型番が違うものの、「何が違うの?」「どちらを選べばいいの?」と迷う人も多い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

MAX7221

ノイズ対策が強いLED制御マイコン。本ICは互換品やコピー品が流通しているため、あまりに安いものは注意

広告

どうやってLEDを制御するのか?(アドレスとデータ)

MAX7219への指示は、16ビットのデータパケットを送ることで行います。

パケットのうち、D8〜D11の4ビットで「どのレジスタ(住所)」に書き込むかを指定し、D0〜D7の8ビットで「どんなデータ」を書き込むかを指定します。

今回、プログラムで操作する主なアドレス(レジスタ)は以下の通りです。

主要レジスタ一覧

レジスタ名アドレス (HEX)説明
Digit 00xX1LEDの状態を指定するレジスタ
Decode Mode0xX9BCDデコードを使うか、個別にセグメントを制御するか選択
Intensity0xXALEDの明るさを16段階で設定
Scan Limit0xXB表示するLEDの桁数を設定(今回は1桁分=LED8個)
Shutdown0xXC通常動作モード(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Ωの抵抗をつないでいます。

配線のポイント

  1. 信号線(DIN, CLK, LOAD):RP2040からの3本の信号線には、すべて4.7kΩのプルアップ抵抗を挿入しました。(+Vと抵抗で接続) これにより、通信の立ち上がりを安定させ、ノイズによる誤動作を防いでいます。
  2. LEDの接続:MAX7219のDIG 0(2番ピン)をLEDのカソード(共通)に、SEG A〜G, DP(14〜17, 20〜23番ピン)を各LEDのアノードに接続します。
  3. 電源周りのノイズ対策:データシートの推奨通り、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でLEDを順次制御する方法を紹介し、特定のLEDを点灯させるために必要なアドレス指定方法を詳しく紹介した記事のサムネ

ラズパイとMAX7219でスマートにLチカ!3本の信号線で8個のLEDを自在に操る-プログラム・アドレス制御編-

MAX7219を使いこなす鍵「16ビットパケット」と「アドレス指定」を徹底解説!ラズパイ(RP2040)を用いたSPI通信の手順、必須となる4つの初期化レジスタ設定、ビット単位でLEDを操作するロジックを詳しく紹介します。CircuitPythonのサンプルコード付きで、マトリクス制御の基礎が身につきます。

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero

このシリーズの記事一覧ページ

MAX7219でLEDを順次制御する方法を紹介した記事のサムネイル 2 記事
シリーズ

ラズパイでLED制御(max7219)

マトリクスLEDや複数行の7セグのLED制御が出来るチップMAX7219をラズパイを用いたSPI通信で制御します。