Raspberry Pi Zero WでPython 〜spi.xfer2関数とシリアルパラレル変換ICで7セグLEDを制御〜

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

として実行して表示させた状態です。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク