稼働中

Raspberry Pi Pico(d_33)MAX7219 8×8 LEDドットマトリックス モジュール

MAX7219 LED-Driver (SPI)

MAX7219は 8-Digit LED Display ドライバーです。SPI通信で制御します。Raspberry Pi PicoでMAX7219搭載の8×8 LEDドットマトリックスモジュールを使ってみました。
下図はデータシートのMAX7219の参考例です。8桁の7セグメントLEDのドライバーに使うのが一般的なようです。
8桁の各桁「数値と小数点」を表示するのに8セグメントあります。
Decode-ModeをNo decode for digits 7–0すれば8×8 LEDドットドライバーとして使えます。※詳細はデータシートなど参照ください。
※micro:bitの記事e_14からRaspberry Pi Picoで使えるように追記、修正等をしました。
MAX7219 フロー図
※ Maxim Integrated のデータシートから抜粋

外観

MAX7219搭載の8×8 LEDドットマトリックスモジュールの外観写真です。(以後はMAX7219と記載します)
MAX7219 外観

接続例

MAX7219の電源電圧は4.0V~5.5Vなので、5.0Vの外部電源が必要です。
レベルコンバータを介してRaspberry Pi Picoと接続します。
Raspberry Pi PicoのSPIには、SPI0、SPI1があり[RX, Csn, SCK, TX]端子があります。
GPIO番号リストは以下になります。
#SPI0 [ 0, 1, 2, 3] [ 4, 5, 6, 7] [16,17,18,19]
#SPI1 [ 8, 9,10,11] [12,13,14,15]
SPI通信にはSPI1のRX(GP12)Csn(GP13)SCK(GP14)TX(GP15)を使いました。
※RX(MISO), TX(MOSI)
MAX7219のDINとTX(GP15)、MAX7219のCLKとSCK(GP14)、MAX7219のCSとCsn(GP13)をレベルコンバータを介して接続しました。
MAX7219 接続例

MAX7219の説明

データシートから抜粋してMAX7219の説明します。
以下はタイミングチャートです。CS(LOAD)が’L’でCLKに合わしてD0~D15(16bit 2bytes)をDIN(データを保持)します。
MAX7219 タイミングチャート
※ Maxim Integrated のデータシートから抜粋

2bytesのデータはD8~D11がアドレス(コマンド)、D0~D7がデータです。
MAX7219 SPIフォーマット
※ Maxim Integrated のデータシートから抜粋

レジスタマップは以下のようになっています。
例えば、2桁目(Digit1 0x02)の3番目のLED(0b_0000_0100)を点灯させるには、(0x02,0b_0000_0100)の2bytesを送ります。
具体的には、CS=’L’の状態で
buf=bytearray(2)
buf[0]=0x02 # address
buf[1]=0b_0000_0100 # data
spi.write(buf)
で送ります。

■Decode Mode(0x09)は、8×8 LEDを使うのでNo decode for digits 7–0 [0x00]にします。
■Intensity(0x0a)はMAX7219の場合、dutyを1/32[0x00]~31/32[0x0f]で設定できます。
■Scan Limit(0x0b)はDisplay digits 0 1 2 3 4 5 6 7[0x07]にします。
■Shutdown(0x0c)は動作停止[0x00]、通常動作[0x01]です。電源投入後は動作停止[0x00]になっています。
■Display Test(0x0f)はduty31/32で全点灯[0x01]します。通常モードは[0x00]です。
※()内がaddress、[]内がデータ
上記と同じbytearray(2)で送ります。

8×8 LEDドットマトリックスで使うにはMAX7219の
Decode Mode[0x00]、Scan Limit[0x07]、Shutdown[0x01]を初期設定が必要になります。
MAX7219 レジスタマップ
※ Maxim Integrated のデータシートから抜粋

スクリプト

MAX7219のスクリプトは以下のようにしました。
以下のデモ動作をしています。
桁列のLED1~8を順次点灯して行きます。
カウントアップしながら対角上のLEDを点灯させて行きます。
点灯するLEDの位置がThonnyのシェルに表示されます。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。
※Raspberry Pi Pico単独で動作させるには’main.py’としてRaspberry Pi Picoにuploadして使います。


pico_max7219_01b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, SPI
import time
# MAX7219 Serially Interfaced, 8-Digit LED Display Drivers
# SPI1 [RX, Csn, SCK, TX]のGPIO番号[12,13,14,15] 
spi = SPI(1, baudrate=1_000_000,sck=Pin(14), mosi=Pin(15), miso=Pin(12))
#Chip Select Pin  GP13
CS_pin=Pin(13, mode=Pin.OUT, value=1)

# Chip Select High(1),Low(0)
def CS(dat):
    CS_pin.value(dat) 
# コマンド書込み(所定のレジスタに書き込み)
def wr_spi(cmd,data):
    buf=bytearray(2)
    buf[0]=cmd        # アドレス
    buf[1]=data       # 書込むデータ
    CS(0)             # CS=’L'にして送信開始
    spi.write(buf)    # 書込む
    CS(1)             # CS=’H'にして送信終、シフト
# MAX7219 初期化 no decode、scan limit 0~7、ope-mode rnormal
def digi_init():
    ini_dat=[
        (0x09,0x00),   # decode mode(0x09)|no decode for digit7-0(0x00)
        (0x0b,0x07),   # scan limit(0x0b)|display digits 0~7(0x07)
        (0x0c,0x01),   # ope mode normal(0x0c)|normal(0x01) shutdown(0x00)
        ]
    for i in ini_dat:
        wr_spi(i[0],i[1])
        time.sleep_ms(10)
# data clear 1列づづ点灯
def d_cls():
    pos=0 
    for i in range(8):
        pos=pos+1
        #print(pos)
        wr_spi(pos,0x00)    #列の全データを0 led off
        #time.sleep_ms(200)
    time.sleep_ms(100)

## example
digi_init()     # 初期化
d_cls()         # クリア

# demo1 tama-tuki
d_cls()
for i in range(8):
    i=i+1
    d=1
    for j in range(8):
        dat= d<< j
        print(i,dat)    #列,データ
        wr_spi(i,dat)
        time.sleep_ms(100)
    wr_spi(i-1,0x00)
    
time.sleep(1)
wr_spi(i,0x00) # last led off
#d_cls()

# demo2  count-up
d_cls()
for i in range(8):
    k=2**i
    i=i+1  
    for j in range(k):
        j=j+1
        print(i,k,j)    #列,2**列,データ
        wr_spi(i,j)
        time.sleep_ms(20)
time.sleep(1)
d_cls()

関数 部分説明

■CS(dat)
CSピンの状態を設定をします。dat=0でLow、dat=0でHighです。
■wr_spi(cmd,data)
cmd:レジスタアドレス
data:送信データ
2byteデータをSPI送信します。
■digi_init()
MAX7219の初期設定をします。
decode modeをno decode for digit7-0
scan limitをdisplay digits 0~7
ope modeを標準動作
に設定します。
※MAX7219電源投入後のope modeはshutdownなので標準設定します。
■d_cls()
データをクリアします。(8x8 LED全消灯)

実行結果

結果は以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
1 1         #demo-1
1 2
1 4
(省略)
8 32
8 64
8 128
1 1 1       #demo-2
2 2 1
2 2 2
(省略)
8 128 126
8 128 127
8 128 128
>>> 

動作状態の動画です。

まとめ

Raspberry Pi PicoのSPI出力でMAX7219の動作を確認しました。