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のプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。