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