つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション31 ~ シフトレジスタによる7セグメントディスプレイ表示

1. 7セグメントディスプレイ

 今回はArduinoとシフトレジスタを用いて7セグメントディスプレイの表示を行う。前回は7セグメントデコーダーを利用して4bitのパラレル入力を変換して7セグメントディスプレイに表示していたが、今回はシフトレジスタに8bitのシリアル入力をパラレル出力することで7セグメントディスプレイに表示を行う。

atatat.hatenablog.com

atatat.hatenablog.com

2. シフトレジスタ、7セグメントディスプレイの接続

上の記事に示してはいるが、シフトレジスタ74HC595のピン配置を下に改めて示す。

74HC595のピン割り当て
74HC595のピン割り当て

また、7セグメントディスプレイの表示位置と7bit出力(abcdefg)の割り当てを下に示す。

7セグメントディスプレイ
7セグメントディスプレイ

7セグメントディスプレイはカソードコモン(入力HIGHに対して点灯)として進める。

シフトレジスタの出力ピンQ1-Q7を7セグメントディスプレイのgfedcbaの順に接続する。7セグメントディスプレイを表示するには、シフトレジスタのQ1-Q7(gfedcba)を以下の入力(10進)と7bit出力の真理表に従ってLOW-HIGHを出力するようにすればよい。Q0は今回使用しないが、DPなどに割り当てることもできる。

入力 a b c d e f g
0 1 1 1 1 1 1 0
1 0 1 1 0 0 0 0
2 1 1 0 1 1 0 1
3 1 1 1 1 0 0 1
4 0 1 1 0 0 1 1
5 1 0 1 1 0 1 1
6 1 0 1 1 1 1 1
7 1 1 1 0 0 0 0
8 1 1 1 1 1 1 1
9 1 1 1 1 0 1 1

3. Arduinoとの接続、スケッチ

 Arduinoとシフトレジスタ、7セグメントディスプレイをすべて接続したTikercad上の図を下に示す。(接続の詳細・説明は上記前回の記事参照)LEDの順次点灯と違い、今回は一度に最大9つのLEDを点灯させるため、過大な電流がシフトレジスタに流れないように1kΩと高めの抵抗を入れている。(シミュレーションのため部品破壊は起こらないが)7セグデコーダーのときは、パラレル入力4bitのためArduinoの出力ピンを4つ使用していたが、シフトレジスタはシリアル入力のため、データ入力とクロック入力で出力ピンは3つで済むというメリットがある。

Arduino,シフトレジスタ,7セグディスプレイ接続
Arduino,シフトレジスタ,7セグディスプレイ接続

スケッチを以下に示す。7セグメントディスプレイで0-9までに対応するビット列をbyte型数値の配列digiset[]として定義しておき、実行時のdigiset[]を読み込んで、シフトレジスタに入力することで7セグメントディスプレイに表示を行う。

int latchPin = 8;  // 74HC595のST_CPへ
int clockPin = 12; // 74HC595のSH_CPへ
int dataPin = 11;  // 74HC595のDSへ

//真理表の通りにビット列を設定
 byte digiset[]={
    0b00111111,//0
    0b00000110,//1
    0b01011011,//2
    0b01001111,//3
    0b01100110,//4
    0b01101101,//5
    0b01111101,//6
    0b00000111,//7
    0b01111111,//8
    0b01101111};//9

void setup() {
  Serial.begin(9600);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

}

void loop() {

  for (int j = 0; j < 10; j++) {
    // 送信中のlatchPinはグランド(LOW)レベル
    digitalWrite(latchPin, LOW);
    // 真理表の通りにLOW-HIGHを出力
    byte t=digiset[j];
    shiftOut(dataPin, clockPin, LSBFIRST,t);
    // 送信終了後latchPinをHIGHにする
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
}

4. アノードコモン端子の7セグメントディスプレイ

 シフトレジスタを利用することで、アノードコモン端子の7セグメントディスプレイに対しても容易に対応できる。アノードコモンの場合は、入力がLOWになることによってコモン端子から電流が流れてLEDが点灯するため、上記digiset[]のビット列を反転させたビット列をシフトレジスタに入力すればよい。一番簡単な方法としては、上のスケッチ内のshiftOut(dataPin, clockPin, LSBFIRST,~t);として、tをビット反転させた~tを入力として割り当てればよい。

Tinkercad上では、7セグメントディスプレイをクリックして"陽極"の戻すことと、コモン端子を5Vに接続すればシミュレーションを実行できる。前回の7セグデコーダーでは、デコーダー内でビット反転させることが直接できないが、シフトレジスタはビット出力をシリアル入力によって任意に設定できるため、カソードコモンおよびアノードコモンの両方に対応できる。

5. まとめ

 今回はシフトレジスタを用いた7セグメントディスプレイの表示について紹介した。シフトレジスタを用いると7セグデコーダーよりもArduinoの出力ピン数を減らせること、カソードコモン・アノードコモンの両方に対応できるというメリットがある。