7セグメントLEDを8ビットのシリアルパラレル変換ICの74HC595とSPIインターフェースを使って点灯させます。ここでは秋月電子通商で購入できる74HC595と7セグメントLEDを実装した基板AE-7SEG-BOARD使います。

74HC595でシリアル・パラレル変換
74HC595の概略ブロック図です。
他に/SRCLR、/OE信号がありますがそれぞれ”H”固定、”L”固定としていて今回は使用しないので省いてます。

8ビットのシフトレジスタは入力されたシリアルデータ(SER)をシフトクロック(SRCLK)の立ち上がりのタイミングでシフトし、ラッチクロック(RCLK)の立ち上がりのタイミングでその時のシフトレジスタの出力状態(Q7′-Q0’)をストレージレジスタに取り込みQ7-Q0に出力します。以下、タイミングチャートです。

ストレージレジスタに保持されたデータは次のRCLKの立ち上がりが来るまで変化しないのでストレージレジスタの出力(Q7-Q0)を7セグメントLEDの各セグメントに接続することで点灯させる事が出来ます。
上記のタイミングを満足するようにRaspberry Pi Zero WのGPIOを制御してシフトクロック、シリアルデータそしてラッチクロックを送出する事になります。
回路図
AE-7SEG-BOARDの回路図です。回路図は秋月電子通商の商品ページにある組み立て説明書から転載しています。
7セグメントLEDはカソードコモンですので、各セグメントはHレベルで点灯します。

シリアルパラレル変換ICの74HC595と7セグメントLEDを回路図のように接続した場合、表示する数字と74HC595の出力との対応は下表のようになります。

例えば数字の3を表示させる場合、シリアルデータは0x4fを上記タイミングに合わせて(MSBファーストで)送出すれば良いです。
spi.xfer2関数を使ってデータ送出
上記タイミングチャートのSRCLK、SERおよびRCLK信号は、SPI通信のモード0におけるSPIクロック(SCLK)、メイン出力/サブノード入力信号(MOSI)そしてチップセレクト信号(/CS)のタイミングと同じなのでSPIの通信用ライブラリを使用してこれらの信号を送出し、シリアルパラレル変換します。
以下のソースは7セグメントLEDを1秒毎に0から9まで繰返し表示させるプログラムです。ファイル名はtest11.pyとしています。
#!/usr/bin/python
import spidev # spidevライブラリの読み込み
import time # timeライブラリの読み込み
seven_seg = [
0x3f, # 0
0x06, # 1
0x5b, # 2
0x4f, # 3
0x66, # 4
0x6d, # 5
0x7d, # 6
0x07, # 7
0x7f, # 8
0x6f # 9
]
spi = spidev.SpiDev() # spidevのインスタンス化
spi.open(0,0) # CE0を指定
spi.max_speed_hz = 500000 # 転送速度を500kHzに設定
spi.mode = 0b00 # SPIモード0
try:
while True:
for i in range(0, 10):
spi.xfer2([seven_seg[i]])
# seven_segリストの1Byteのデータを送信
time.sleep(1)
except KeyboardInterrupt:
spi.close() # SPI通信を終了
ソース中、
spi.mode = 0b000
はSPI通信をモード0で行うことで、SPIモード0はシリアルデータはSPIクロックの立ち上がりでラッチし、未送信の時のSPIクロックはゼロレベルにするモードになります。デフォルトではSPIモード0になっていますので、この行は省略できます。
spi.xfer2([seven_seg[i]])
は要素番号で指定される1byteのデータをSPIクロックと同期して送出します。
spi.xfer2の引数のリストは一つにつきSPIクロックを8回出力します。波形をオシロスコープで観測した画像です。

例えば3byteのデータを連続して送信する場合 はspi.xfer2([0xa5, 0x5a, 0xa5]) とかすればSPIクロックは8 x 3の24回出力されます。

Raspberry Pi Zero WのSPIの有効化
spidevを使うにはRaspberry PiでSPIを有効にする必要があります。初期状態では有効化されていないので有効化します。以下のコマンドを入力して、画面にしたがって操作します。
$ sudo raspi-config
3 Interface Options を選択

I4 SPIを選択

<Yes>を選択

<OK>を選択

raspi-configを終了させます。
以下のコマンドを入力すると有効化されているのが確認できます。
$ lsmod | grep spi spidev 20480 0 spi_bcm2835 20480 0
Raspberry Pi Zero Wとの接続
Raspberry Pi Zero WとAE-7SEG-BOARDとの接続は下表となります。
| Raspberry Pi Zero W | AE-7SEG | |||
| MOSI | GPIO10 | 19 | SDI | CN1-4 |
| SPICLK | GPIO11 | 23 | SCK | CN1-3 |
| CE0 | GPIO8 | 24 | LATCH | CN2-2 |
| 3.3V | 17 | VDD | CN1-1 | |
| GND | 20 | GND | CN1-2 | |
$ python test11.py
として実行して表示させた状態です。

