稼働中

Raspberry Pi Pico(s_31)MAX7219 8×8 LEDモジュール (SPI)

MAX7219 MAX7219c.py

MAX7219は 8-Digit LED Display ドライバーです。SPI通信で制御します。※詳細はMAX7219のデータシートを参照ください。
Raspberry Pi PicoでMAX7219搭載の8×8 LEDドットマトリックスモジュールを使う自作の’MAX7219c.py’を作成しました。
記事(d_33)を元に作成しています。’MAX7219c.py’は末尾にあります。使い方だけを記載します。

使い方

■ ファイル転送
Raspberry Pi Picoへ’MAX7219c.py’を送った後でimportして使います。
※MAX7219c.pyの末尾に、使用例(MAX7219_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘MAX7219c’をimportすると「digi_init、wr_spi、d_cls、CS、Test_on、Test_off、p_on、p_off、s_duty、s_pos、s_dat、demo1、demo2、demo3」のメソッドが使えるようになります。

MAX7219(spi_num=1,cs_num=13)で初期化します。
spi_num:使用するSPI0、SPI1の番号(0,1)です。
cs_num:CSに使うGPIO番号です。
デフォルトはSPI1の[RX, Csn, SCK, TX]=[12,13,14,15]

spi_numとcs_numを設定すれば、RX, SCK, TXは指定されます。※RX(MISO), TX(MOSI)
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]

(01)digi_init()
MAX7219のモードを初期設定します。
decode modeをno decode for digit7-0
scan limitをdisplay digits 0~7
ope modeを標準動作(MAX7219電源投入後はshutdown)
(02)wr_spi(cmd,data)
cmd:レジスタアドレス
data:送信データ
2byteデータをSPI送信します。
(03)d_cls()
データをクリアします。(8x8 LED全消灯)
(04)CS(dat)
CSピンの状態を設定をします。dat=0でLow、dat=0でHighです。
(05)Test_on()
テストモードにします。全点灯で明るさduty=31/32です。
(06)Test_off()
テストモードを解除します。テストモードの前の状態に戻ります。
(07)p_on()
通常動作状態にします。
(08)p_off()
シャットダウン状態にします。
(09)s_duty(dat=0x02)
明るさを変更します。dat 0x00~0x0fです。
duty=(datx2)/32になります。デフォルトはduty=5/32です。
(10)s_pos(x,y)
x:列、Y:行のドットLEDを点灯します。
(11)s_dat(x,dat)
x:列のdat値のLEDを点灯します。
(12)demo1()、demo2()、demo3()
demo1、demo2は記事(d_33)の事例と同じ動作です。
demo3はMAX7219c_ex.pyの例と同じ動作です。

使用例

8×8 LEDドットマトリックスの指定場所のLEDを点灯させています。


MAX7219c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from machine import Pin, SPI
import time
from MAX7219c import MAX7219
# MAX7219 Serially Interfaced, 8-Digit LED Display Drivers SPI=10Mhz

##example
#[RX, Csn, SCK, TX]
#SPI0 [ 0, 1, 2, 3] [ 4, 5, 6, 7] [16,17,18,19]
#SPI1 [ 8, 9,10,11] [12,13,14,15]
a=MAX7219(1,13)  #spi_num=1,cs_num=13 

a.d_cls()

# demo-3  set(x,y)  set(x,dat)
a.s_pos(1,1) ;time.sleep(1)
a.s_pos(2,2) ;time.sleep(1)
a.s_pos(3,3) ;time.sleep(1)

a.s_dat(4,128) ;time.sleep(1)
a.s_dat(5,170) ;time.sleep(1)
a.s_dat(6,0xaa) ;time.sleep(1)        #hex(170)'0xaa'
a.s_dat(7,0b1010_1010) ;time.sleep(1) #bin(170)'0b10101010'
a.s_dat(8,255) ;time.sleep(1)

time.sleep(1)
a.d_cls()

実行結果

実行すると以下の写真ようになりました。
MAX7219 demo3

上記を実行した後で、他の動作をThonnyのshellで確認した結果です。


>>> %Run -c $EDITOR_CONTENT
>>> a.wr_spi(2,0b1011_1011)     #2列目’1011_1011’点灯
>>> a.s_duty(0x0f)              #明るさ duty31/32
>>> a.s_duty(0x02)              #明るさ duty 5/32
>>> a.wr_spi(3,0b1011_1011)     #3列目’1011_1011’ 追加点灯
>>> a.p_off()                   #Shutdown 全消灯
>>> a.p_on()                    #on 元状態に戻る(2,3列目’1011_1011’点灯)
>>> a.Test_on()                 #テストモード 全点灯 duty31/32
>>> a.Test_off()                #テストモード解除 元状態に戻る(2,3列目’1011_1011’点灯)
>>> a.demo1()   #記事(d_33)の事例と同じ
>>> a.demo2()   #記事(d_33)の事例と同じ
>>> a.demo3()   #上記写真と同じ

MAX7219モジュール用


MAX7219c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import Pin, SPI
import time
# MAX7219 Serially Interfaced, 8-Digit LED Display Drivers
class MAX7219:
    def __init__(self,spi_num=1,cs_num=13):
        CS_pin=Pin(cs_num, mode=Pin.OUT, value=1)
        self.spi = SPI(spi_num, baudrate=1_000_000,sck=Pin(cs_num+1),
                       mosi=Pin(cs_num+2), miso=Pin(cs_num-1))
        self.CS_pin=CS_pin

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

    # demo2
    def demo2(self):
        self.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**列,データ
                self.wr_spi(i,j)
                time.sleep_ms(20)
        time.sleep(1)
        self.d_cls()

    # Chip Select High(1),Low(0)
    def CS(self,dat):
        self.CS_pin.value(dat)
        #CS_pin(dat)
    # write registor
    def wr_spi(self,cmd,data):
        buf=bytearray(2)
        buf[0]=cmd            # レジスタアドレス
        buf[1]=data           # 書込むデータ
        self.CS(0)            # CS=’L'にして使用しているMAX7291を有効にする
        self.spi.write(buf)   # 書込む
        self.CS(1)            # CS=’H'にして送信終、シフト

    #max7219 init
    def digi_init(self):                         # 初期化
        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:
            self.wr_spi(i[0],i[1])
            time.sleep_ms(10)

    ## Register mode set
    # display-test on/off
    def Test_on(self):
        self.wr_spi(0x0f,0x01)
    def Test_off(self):
        self.wr_spi(0x0f,0x00)

    # ope-mode shutdown/ normal
    def p_off(self):
        self.wr_spi(0x0c,0x00)
    def p_on(self):
        self.wr_spi(0x0c,0x01)

    # intensity duty 0x00~0x0f (d*2+1)/32
    def s_duty(self,dat=0x02):
        self.wr_spi(0x0a,dat)

    # display data clear 1列づづoff
    def d_cls(self):
        pos=0 
        for i in range(8):
            pos=pos+1
            #print(pos)
            self.wr_spi(pos,0x00)    #列の全データを0 led off
            #time.sleep_ms(200)
        time.sleep_ms(10)
    #--
    # set position x(1~8) y(1~8)
    def s_pos(self,x,y):
        y=2**(y-1)
        self.wr_spi(x,y)
    # set dat x(1~8) y(0~255)
    def s_dat(self,x,dat):
        self.wr_spi(x,dat)

    # demo3  set(x,y)、set(x,dat)
    def demo3(self):
        self.s_pos(1,1) ;time.sleep(1)
        self.s_pos(2,2) ;time.sleep(1)
        self.s_pos(3,3) ;time.sleep(1)

        self.s_dat(4,128) ;time.sleep(1)
        self.s_dat(5,170) ;time.sleep(1)
        self.s_dat(6,0xaa) ;time.sleep(1)        #hex(170)'0xaa'
        self.s_dat(7,0b1010_1010) ;time.sleep(1) #bin(170)'0b10101010'
        self.s_dat(8,255) ;time.sleep(1)
        self.d_cls()