稼働中

マイクロビット(e_14)MAX7219 8x8LEDマトリックスディスプレイ

MAX7219

LED-Driver MAX7219 を搭載した8x8LEDマトリックスディスプレイモジュールを使ってみようと思います。
以下が8x8LEDモジュールの外観です。

8x8LED外観

下図はデータシートのMAX7219の参考例です。7セグメントLEDのドライバーに使うのが一般的なようですが、8x8LEDマトリックスのドライバーとしても使えます。

MAX7219例
※MAXIMのデータシートより抜粋

MAX7219 のデータシートをみると5.0V動作なので、micro:bitから電源供給ができません。別途、DC 5V電源が必要です。そのためレベルコンバータを介しての通信になります。MAX7219はSPI通信に対応しているそうです。(少し違うみたいですが)詳細はデータシートを参照してください。

接続例

micro:bitとの接続は以下のようにしました。外部の5V電源を使用します。MAX7219のCS(Chip-Select)用に、micro:bitのPin6をデジタルモード出力で使います。レベルコンバータを介して、micro:bitのSCK、MOSI、Pin6を各々MAX7219のCLK、DIN、CSと接続します。
※データシートでは、MAX7221がCS、MAX7219はLOADと記載されています。

MAX7219接続図
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。

実体配線の写真です。
「04.9」と表示されている物は5Vの外部電源です。

実体配線

MAX7219の概要

データシートのタイムチャートを見るとCSが’L’でMAX7219を選択し、CS=’L’の間でCLK(Serial-Clock)に合わせてDIN(Serial-Data Input)されるようです。
そのため、CS信号はmicro:bitのPin6からデジタル出力で作成します。※CS:チップセレクト

MAX7291タイムチャート
※MAXIMのデータシートより抜粋

データの送信は以下の形式になっています。ADDRESSと記載されていますがコマンドのアドレスと思った方が分かりやすいです。

コマンド
※MAXIMのデータシートより抜粋

例えば、
ShutdownModeを実行するには、下図のアドレスマップから0x0cのレジスタに’0’を書込みます。’1’を書込むとNormalModeになります。
Digit 0は8x8LED-Matrixの場合は1列目になります。0x01に0x0fを書込むと0b00001111で下4つが点灯します。
各コマンドの詳細はデータシートで確認ください。

レジスタマップ
※MAXIMのデータシートより抜粋

初期化

データシートから初期起動時には、制御レジスタがリセット、シャットダウンモード、1桁(1行)のスキャン、デコードなし、最小の輝度 の状態になるようです。
そのため、「シャットダウンモード>ノーマルモード」「1行スキャン>8行スキャン」にする必要があります。

初期化の送信データは以下のようにしました。


(0x09,0),   # (09)no decode for digit7-0
(0x0b,7),   # (11)scan limit display digits 0~7
(0x0f,0),   # (15)displaytest OFF normal
(0x0c,1),   # (12)normal(0:shutdown)
spi.write(bytearray([command, data])) で送ります。

実行例

一列から順次点灯して全点灯>一列から順次消灯して全消灯>2列目に0xccで点灯するスクリプトを以下のように作成しました。


from microbit import *
# MAX7219 SPI test CS >> LOAD
CS=pin8
CS.write_digital(1)
def dig_init():                         # 初期化
    ini_dat=[
        (0x09,0),   # (09)no decode for digit7-0
        (0x0b,7),   # (11)scan limit display digits 0~7
        (0x0f,0),   # (15)displaytest OFF normal
        (0x0c,1),   # (12)normal(0:shutdown)
        ]
    for i in ini_dat:
        wr_spi(i[0],i[1])
        sleep(5)

def wr_spi(cmd,data):                   # コマンド書込み
    buf=bytearray(2)
    buf[0]=cmd                          # アドレス
    buf[1]=data                         # 書込むデータ
    CS.write_digital(0)                 # CS=’L'にして使用しているMAX7291を有効にする
    spi.write(buf)                      # 書込む
    CS.write_digital(1)                 # CS=’H'にして送信終、シフト
    return

#spi.init(baudrate=1000000, bits=8, mode=0, sclk=pin13, mosi=pin15, miso=pin14)
spi.init()              # SPIの初期化
dig_init()              # MAX7291の初期化を実行


digi=0  
for i in range(8):          # 1列づづ点灯
    digi=digi+1
    wr_spi(digi,0xff)    
    sleep(200)
sleep(1000)
digi=0
for i in range(8):          # 1列づづ消灯
    digi=digi+1
    wr_spi(digi,0x00)
    sleep(200)
sleep(1000)

    wr_spi(2,0xcc)          # 2列目に0b11001100で点灯
    sleep(2000)
wr_spi(2,0x00)              # 2列目を消灯

実行結果


>>> %Run 1206_max7219_spi_tes_0b.py
>>> 

初期化 > 1列点灯
Disp_1 Disp_2

2列点灯 > 4列点灯

Disp_3 Disp_4

全点灯 >(省略)左列から消灯 > 全消灯 > 2列目0Xcc(0b11001100)点灯

Disp_5 Disp_6

まとめ

micro:bitのSPIを用いてLED-Driver MAX7219を搭載した8x8LEDマトリックの点灯ができました。機会があれば8x8LEDの多段なども試して見たいと思います。