Arduinoと8ビットシフトレジスタで7セグを制御する


はじめに

表示系の部品としてあらゆるところで使われています。しかし、LEDとは違い単純に電圧をかけても数字は表示されません。さらにどうしても配線が多くなってしまうため、シフトレジスタも活用して使い方をマスターしましょう

7セグメントLEDの回路

下記の図のように、a~g + DP(ドット)までの8ピンがあります。それらのピンに入力があるとその場所が光ます。
また、共通ピン(com)が「+」か「ー」の2種類の回路がありますので使用する場合はよく確認しましょう。

配線図

このように配線を行います。特にプログラムは必要ありません。実行すると全て点灯すると思います。今は3.3VとGNDしか使用していませんので制御らしい動きはできません。
実際にはこれをGPIOピンに挿入&入力を与えることで制御できますが、そうなると8pinも消費してしまい、ちょっと勿体無い。

 シフトレジスタを使って配線を整える

シフトレジスタを加えることによって3線で入力を与えることができます。数字はシリアルで入力できるので簡単なコードで数字を順次に表示するコードも簡単にかけます



#define SRCLK   (5)//シフトレジスタのクロック信号
#define RCLK    (6)//ストレージレジスタのクロック信号
#define SER     (7)//シリアル入力

void setup() {
  pinMode(SRCLK, OUTPUT);
  pinMode(RCLK,  OUTPUT);
  pinMode(SER,   OUTPUT);
}

// 点灯パターン
const uint8_t PATTERNS[] = {
    B01110111,
    B00010001,
    B01101011,
    B00111011,
    B00011101,
    B00111110,
    B01111110,
    B00010111,
    B01111111,
    B00111111
};

void loop() {

  // 点灯パターンの数
  int pattern_num = sizeof(PATTERNS)/sizeof(PATTERNS[0]);

  for (uint8_t i=0; i<pattern_num; i++) {
    // 8ビット分のデータをシフトレジスタへ送る
    shiftOut(SER, SRCLK, LSBFIRST, PATTERNS[i]); 

    // シフトレジスタの状態をストレージレジスタへ反映させる
    digitalWrite(RCLK,  LOW);
    digitalWrite(RCLK,  HIGH);

    delay(500);
  }
}

おわりに&参考文献

7セグやシフトレジスタなどが登場するとちょっと身構えてしまう方も多いと思います。ですが、原理は難しくなくシフトレジスタは関数がハード化されたと思えば気が楽ではないでしょうか? まずは手を動かしてトライしてみましょう!

7セグメントLEDとは?
Arduinoでシフトレジスタ(SN74HC595)を使用して8個のLEDをチカチカさせる