Raspberry Pi 4 + Python3入門 <STEP1> (2) 7セグメントLED 74HC595 その2 4桁
「Raspberry Piで7セグメントLEDを簡単に点灯させよう (4) 配線量を少なくできるシフトレジスタを使った点灯方法 その3」
では、シフトレジスタ74HC595を利用した4桁の7セグメントLEDを利用しました。前回に引き続き、ラズパイ4、Raspbian Buster(2019/09/26)、Python3.7にspidevライブラリを利用します。
●7セグメントLEDボードとの接続
製品によって端子名がいろいろあります。電源線が2本あります。信号線は、SPIバスの3本です。GNDはどのピンを使ってもかまいません。デバイスはebayで入手しました。
GPIOのピン番号と機能 | 7セグメントLEDボードのピン名称 |
---|---|
17 +3.3V | VDD |
19 MOSI | SDI |
20 GND | GND |
23 CLK | SCK |
24 CE0 | LOAD |
●プログラム
表示部分はdisp7seg()関数にしました。マイナスは処理していません。整数2桁、小数点1桁にだけ対応しています。このボードは、前回の7セグメントLEDと論理が逆になっています。'0'を送るとそのセグメントが点灯します。
この関数が呼ばれたら、引数を逆順に並べなおします。これは、
- 8ビットのデータを送ると、最初に一番左のLEDにそのデータが表示される
- 次の8ビット・データを送ると、最初の表示データは2番目に押し出される
- 4回繰り返すと、すべての桁にデータが表示される
という流れだからです。
小数点ドットがあるとdotFlagを'1'にします。dotFlagが'1'のとき、そのときの表示データとドットを同時に表示します。
dotはドット・データ、blankは何も表示しないデータ、dataは0~9の表示データのリストです。
import spidev, time
spi = spidev.SpiDev()
spi.open(0,0) # CE0
spi.max_speed_hz = 1000000 # 1MHz
# gfedcba LED segment
dot = ~0b10000000
blank = ~0b00000000
data = [ 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111 ]
def disp7seg(tempData):
dispTempData = list(str(tempData))[::-1] # reversed
dotFlag =0
for x in dispTempData:
if x != '.':
if dotFlag == 1:
spi.xfer([~data[int(x)] & dot])
dotFlag = 0
continue
spi.xfer([~data[int(x)]])
dotFlag = 0
else: # find dot
dotFlag = 1
spi.xfer([blank]) # +/-
disp7seg(26.3)
print('done')
表示例です。
(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。