Raspberry Pi 4 + Python3入門 <STEP1> (1) 7セグメントLED 74HC595 その1 1桁

 「Raspberry Piで7セグメントLEDを簡単に点灯させよう (2) 配線量を少なくできるシフトレジスタを使った点灯方法 その1

では、ラズパイのSPIライブラリにwiringpiを使いました。ここでは、ラズパイ4、Raspbian Buster(2019/09/26)、Python3.7にspidevライブラリを利用します。

接続

 ラズパイと7セグメントLEDの配線は、上記の記事と同じにします。秋月電子通商で購入した7セグメントLEDは裏にシフトレジスタの74HC595がついています。SPIのプロトコルで'1'もしくは'0'のデータを送ると、セグメントのa~gのLEDがON/OFFができます。

GPIOのピン番号と機能 7セグメントLEDのピン名称
17 +3.3V VDD
19 MOSI SDI
23 CLK SCK
24 CE0 LATCH
25 GND GND

プログラム

 SPIのプロトコルを使うには、「Preferences」-「Raspberry Pi Configuration」で出てくるパネルのInterfacesのタブを選びます。SPIの「Enabled」をチェックしOKを押して有効にします。リブートはRaspbian Busterでは不要になりました。次の画面ではI2Cもいっしょに有効にしています。

 spidevライブラリは、ここ数年安定して利用できるSPI用ライブラリです。OSをインストールした時点で入っています。
 spi.open(0,0)では二つあるSPIバスの0を、チップ・セレクト信号はCE0を使うことを指定しています。spi.max_speed_hz は1MHzにしていますが、100kHzでもよく、指定できるクロックの自由度は高いです。
 ほかにもクロックの位相などの指定もありますが、デフォルトのままにします。クロックは、2年ほど前から明示的に指定しないと動かなくなりました。

 プログラムはMuで入力して実行しています。

import spidev, time
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 1000000

# gfedcba
l1 = [0b00000110]
l2 = [0b01011011]
l3 = [0b01001111]
l4 = [0b01100110]
l5 = [0b01101101]
l6 = [0b01111101]
l7 = [0b00000111]
l8 = [0b01111111]
l9 = [0b01100111]
l0 = [0b00111111]
dot = 0b10000000

data = [ 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111 ]

# spi.xfer([dot])
# print(data[1])
# print(data[1] | dot)

for x in range(0, 10):
time.sleep(0.14)
spi.xfer([data[x]])

time.sleep(2)

for x in range(0, 10):
time.sleep(0.14)
spi.xfer([data[x] | dot])

print('done')

 l1は’1’、I9は’9’と、各セグメントのデータを作りました。このブロック(6~17行)はプログラムでは使っていません。
 LEDは’1’で点灯します。0~9のデータをdataのリストに入れます。それをspi.xfer()でLEDへ送ります。引数のリストは表示したい数字そのものです。ドットとともに表示したいときはデータと論理和 data[1] | dot を取ります。

 a、b、c...のセグメントなどの位置関係はこちらの記事を参照してください。

 for x in range(0, 10): のループは、0~9までを表示します。そのあとのループは、ドットありで0~9までを表示します。

 実行が終わった様子です。

(※) 本Webのプログラム中、インデントなどのスペースもしくは改行は、通常のプログラム内ではごみ文字になるので、コピペした後、エディタでスペース文字などを入れなおしてください。