7セグメントLEDであるNKG141SP-Bは,カソードコモンのLEDです.従って,カソードをLowにし,各セグメントのアノードをHighにすればそのセグメントが発光します.4個の7セグメントLEDにある各セグメントは一つにまとめられておりますので,7セグメントLEDごとに異なる文字を表示するには1個ずつ高速に表示を変えていく必要があります.


回路構成

この7セグメントLEDにあるLEDは8個あり,それぞれのセグメントは下図のようにA~G,DP(デシマルポイント)のように定義されています.

7Segment

 

4個の7セグメントLEDは下図のようにRPiと接続されています.アノード側にはセグメントごとにPNPトランジスタが8個あります.下の図ではPNPトランジスタ7個を省略しています.トランジスタのベースをLowにするとPNPトランジスタはONになりますので,そのセグメントを点灯させる必要条件を満たします.一方,カソード側にはNPNトランジスタのコレクタが接続されており,ベースをHighにするとONになりますので,その7セグメントLEDを点灯させる必要条件を満たします.

DynamicTurnOnOff

 


 動作原理

ではダイナミック点灯をさせる手順を示します.ここでは「1234」という文字を表示させます.まず,下図のように一番左側の7セグメントLEDに「1」を表示させます.それには2つの必要条件があります.1つはアノード側にあるPNPトランジスタのうち,セグメントBとCをLow,それ以外をHighとすることで1を表示させる必要があります.もう1つはカソード側にあるNPNトランジスタのうち,一番左側の7セグメントLEDにつながっているもののベースをHigh,それ以外をLowとすることで1を表示させる必要があります.

DynamicTurnOnOff1

 

少しの時間を空けたのち,すべての7セグメントLEDを消灯させます.この理由は,続けて次のパターンを表示すると残像が映ってしまうためです.次に左から2番目の7セグメントLEDに2を表示します.下図のようにA,B,D,E,Gセグメントに接続されたPNPトランジスタのベースをLow,それ以外をHighにします.そして,左から2番目の7セグメントLEDのカソードコモンに接続されているNPNトランジスタのベースをHigh,それ以外をLowにします.これで2が表示されます.

DynamicTurnOnOff2

 

以降同じように,一旦消灯させたのち,左から3番目の7セグメントLEDを表示するために下図のようにします.

DynamicTurnOnOff3

 

最後に左から4番目の7セグメントLEDに4を表示します.下図のようにします.

DynamicTurnOnOff4

 

以上の動作を高速に動作させることにより,人間の目には各7セグメントLEDにそれぞれ異なる数字が表示されているように見えます.


プログラム

7セグメントLEDとRPiの接続はこちらの表にまとめられていますので参照してください.アノード側が8本,カソード側が4本の合計12本で接続されています.基本的にはLEDの点灯と消灯とほぼ同じで,ただ本数が12本になっているだけです.ではeclipseで新規プロジェクトSevenSegmentを作成してください.さらにPi4JとRemoteVMのライブラリを所定の場所に追加し,さらにビルドバスに追加してください.下の図はプロジェクトを作成した直後の様子です.

SevenSegment01

 

 まずはmain関数を追加し,12本の端子をインスタン化します.この後のプログラムを簡単にするため,アノード8本を配列 _anodesに,カソード4本を配列 _cathodesにまとめます.これらの配列はprivateのフィールドとしますので下のようなものをSevenSegmentクラスに追加します.

package jp.ac.nagano_nct.ashida_lab.seven_segment;

import com.pi4j.io.gpio.GpioPinDigitalOutput;

public class SevenSegment {

	/* アノードにつながる端子の集まり */
	private final static GpioPinDigitalOutput _anodes[] = new GpioPinDigitalOutput[8];
	/* カソードにつながる端子の集まり */
	private final static GpioPinDigitalOutput _cathodes[] = new GpioPinDigitalOutput[4];
	
	public static void main(String []args){
		
	}
}

 

演習

mainメソッドにて, _anodesと _cathodesにピンを定義してください.このとき,アノードは初期状態でHigh,カソードは初期状態でLowを出力してください.ピンの接続状況はこちらの表を参照してください.また,LEDの点灯・消灯プログラムを参考にしてください.

 

アノードとカソードを制御できるフィールドを得ましたら,次にdisplay_value(0~9999)を表示できるようにしていきます.下に示すアクティビティ図はdisplay_valueを表示する手順を表しています.ここでは1桁ずつ表示するためdigit変数を作り,これが0なら千の位,1なら百の位,2なら十の位,そして3なら一の位を表示します.従って,digitを0からインクリメントしていき,4になったら0にします.

「アノードとつながる端子に表示する数字を設定する」は新たにprivateなメソッド _setDisplayDigitを作成し,これを呼び出します.このメソッドにはdigitとdisplay_valueを引数として渡します.そして,残像を出さぬようにするため,digit番目のカソードをHighにします.これによりすべてのカソードはHighとなり,結果として全消灯となります.

Display4Digits

 

 次に,アノードとつながる端子に表示する数字を設定するメソッド _setDisplayDigitについて説明します.まずは表示すべき値であるdisplay_valueのうち,digitで指定される桁の数値を得ます.そのためにdigitを0から3の4個に場合分けし,それに対応した桁のみにしたvalueを求めます.例えば,digitが0のときにはdisplay_valueのうち千の位だけを抜き出し,digitが2のときにはdisplay_valueのうち十の位だけを抜き出しvalueとします.

こののち,valueを表示するためにどのセグメントを点灯させればよいか考えます.例えばvalueが1であれば,セグメントBとCを点灯させればよいですので,_athodes[1]と_athode[2]に対してLowになるようにし,それ以外の_athodesをHighにします.この処理をするとき,switch文を使うとわかりやすいと思います.

Display1Digit

演習

上記のアクティビティ図をもとに _setDisplayDigitメソッドを作成してください.