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()
実行結果
上記を実行した後で、他の動作を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()