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

74シリーズというロジックICがある

 トランジスタが大量生産され始めると、真空管では発熱が多く保守が大変だったコンピュータもトランジスタで作られ始めました。図のように、論理演算、ANDやORをトランジスタで4回路ぐらい組み1枚のプリント基板に実装(下の図はイメージ)し、これをコネクタ(下の図はボックス・タイプ。当時はカード・エッジ・コネクタ)でつないでいって、コア・メモリという記憶デバイスにプログラムを書き込んで動くコンピュータが作られました。

 ICが発明され、歩留まりがよくなると、ロジックICが出現しました。SN7400は論理デバイスNANDが4個入ったロジックICです。最初はバイポーラ・トランジスタで作られていたので、トランジスタ・トランジスタ・ロジック=TTLと呼ばれました。TTLの前にDTLというロジック・デバイスのシリーズがありましたが、高速なTTLにすぐに置き換わりました。製造方法が進化し、MOSで作られるようになったのが74HC00です。

 写真はロジックICで使われていたDIPの外形見本です。現在はスモール・パッケージのSOタイプが多く使われています。

 このロジックICは百を超える種類が用意され、各社が作ったので入手性もよく、あらゆる分野で使われるようになりました。CQ出版が発行していた規格表もTTLとCMOSロジックは別々でしたが、需要がなくなるにつれ、シュリンクしていきました。

 現在は、FPGAと呼ばれる、1個のICに四つの論理デバイスではなく数万以上のゲートを搭載したデバイスを利用することが一般的になりました。

 74HCシリーズ中に使い勝手の良い回路も多いので、継続して製造されている製品もあります。

74HC595は8ビットのシフトレジスタ

 名前から推測できるように、信号をシリアルに入力して、1クロックごとにシフトしていって、8ビット分シフトすると、パラレル端子にそのデータを出力します。シリアル-パラレル変換ICです。

 タイミングは、次のようになります。

  • クロックSCKの立ち上がりで常にシリアル入力SDIからデータはラッチされている
  • LATCH信号のHigh->LowでQ0にデータがセットされる
  • 次のクロックSCKの立ち上がりで
    • LATCHがLowで Q0がQ1に移動し、新しいデータはQ0にラッチされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ移動し、新しいデータはQ0にセットされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ、Q2がQ3へ移動し、新しいデータはQ0にセットされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ、Q2がQ3へ、Q3がQ4へ移動し、新しいデータはQ0にセットされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ、Q2がQ3へ、Q3がQ4、Q4がQ5へ移動し、新しいデータはQ0にセットされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ、Q2がQ3へ、Q3がQ4、Q4がQ5へ、Q5がQ6へ移動し、新しいデータはQ0にセットされる
  • 次のクロックSCKの立ち上がりでデータはラッチされ
    • LATCHがLowで Q0がQ1へ、Q1がQ2へ、Q2がQ3へ、Q3がQ4、Q4がQ5へ、Q5がQ6へ、Q6がQ7へ移動し、新しいデータはQ0にセットされる
  • OE信号がLowならばQxから出力

(※)2018/10/16 タイミングの説明が間違っていたので、訂正した。

(※)2018/10/16 11番の名称が間違っていたので訂正。11番のSCKと12番のLATCHが逆だったので入れ替えた。

 このICを使うと何がうれしいかというと、データ、クロック、ラッチの三つの信号があれば、8ビット(以上)のデータが送れることです。電源が必要なので、配線は5本必要です。都合の良いことに、このICはSDO端子から次のSDI端子へ数珠つなぎにできるので、どんどんデータをシフトしていけます。

595を実装した小型基板が入手できる

 秋月電子通商から、コンパクトな74HC595を実装した1桁表示の7セグメントLED実装基板が販売されています。製品は基板とピンヘッダが一組になっています。写真には2枚の基板が写っていますが、製品は1枚入りです。製品紹介のページに書かれている7セグメントLEDを購入します。LEDがセットになった製品もあります。

 まず、ピンヘッダをニッパで5ピンずつに切り分けます。ピンヘッダはそれぞれが分離できるようにくぼみがあります。失敗することは少ないと思いますが、1列40ピンのピンヘッダを購入しておくと安心です。

 はんだ付けします。きれいに、垂直にピンヘッダをはんだ付けするには、ブレッドボードを使います。つまり、できあがったときにブレッドボードに挿して利用する状況を想定します。

 2列に並んだピンヘッダ上にプリント基板を載せます。

 基板がピンから浮いていないかを確かめ、はんだ付けをします。最初の1本が済んだら、再度浮いていないかを確認し、残りをはんだ付けするように習慣づけましょう。

 次に7セグメントLEDを表側に載せます。白のシルク印刷でLEDの形が印刷されているので、間違えないで挿入できます。目印はドットの位置です。右下になる向きが正しいです。

 はんだ付けが終わりました。裏側の面です。マニュアルにはLEDの余分なピンの飛び出しているところは切り取るように書かれています。

Raspberry PiのGPIOから接続

 接続に必要な信号は、三つの信号です。

  • SDIの入力信号
  • SCKのクロック
  • LATCHのラッチ

 電源のVDDとGNDはピンの上下に用意されているので、配線しやすいほうを利用します。

(2020/02/08)ピン配置が間違っていたので修正。

 まず、一桁=1個を接続します。GPIO側はマニュアルにもあるようにSPIで接続します。



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

 プログラムをエディタで入力して、ファイル名spi595-0a.pyで保存します。SPI_Speed = 100000の’100000’はクロック周波数で、100kHzを入れていますが、もっと高い数値も可能です。100MHzまで表示されることを確認しました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wiringpi

#pin raspi 74HC595
#MOSI= 19 #SDI
#CLK = 23 #SCK
#CE0 = 24 #LATCH

SPI_Ch= 0 #CE0
SPI_Speed = 100000

# initialization
print("Initialization...")
wiringpi.wiringPiSPISetup (SPI_Ch, SPI_Speed)

#main
data = chr(255)
wiringpi.wiringPiSPIDataRW(SPI_Ch, data)

print("done")

 spi595-0a.pyに実行権を付け、実行します。

 dataは chr(255) つまり、1バイト=8ビットのすべてが '1' のデータです。つまり、LEDのセグメントを全部点灯します。



 255を0に変更・保存し、実行します。全部消灯します。動作確認ができました。

 コラム SPIを有効にする

 ラズパイの初期状態では、シリアル通信のSPI、I2Cは有効になっていません。

 設定メニューから変更します。「Preferences」-「Raspberry Pi Configuration」を選びます。

 表示された設定画面で、Interfacesのタブを選びます。SPIの「Enabled」をチェックしOKを押して有効にします。この後、rebootします。再起動するとSPIが有効になります。