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
として実行して表示させた状態です。