Arduinoで一つのシフトレジスタ(SN74HC595)を利用して16個のLEDをチカチカさせる

投稿者: | ↻ : 2019年1月28日

はじめに

前回はシフトレジスタの練習で、SN74HC595を利用して8個のLEDをチカチカさせました。

今回は1つのSN74HC595を利用して16個のLEDをチカチカさせます。

例は沢山あるのですが「趣味のこだわり電子工作 – LEDのダイナミック点灯」を参考に実際の回路をArduino UNO Rev3とSN74HC595で組んでみました。(4セグを4桁点灯させるように読み替えてます)

回路図

接続

スペースの都合でパスコンは省いて、OEピンは常にLOW(GND)へ、SRCLRピンは常に(VCC)へ接続しています。

配線を少なくするために、電源とGND向けのライン(上下にある)を通常の信号線として利用しています。

スケッチ

#define SRCLK   (5)
#define RCLK    (6)
#define SER     (7)

static const uint8_t MAX_ROW = 4;
static const uint8_t PATTERNS[][MAX_ROW] = {
  {
    0b10000111,
    0b01001011,
    0b00101101,
    0b00011110
  }, {
    0b10001011,
    0b01001011,
    0b00101101,
    0b00011101
  }, {
    0b10001101,
    0b01001101,
    0b00101011,
    0b00011011
  }, {
    0b10001110,
    0b01001101,
    0b00101011,
    0b00010111
  }, {
    0b10001111,
    0b01001100,
    0b00100011,
    0b00011111
  }, {
    0b10001111,
    0b01000011,
    0b00101100,
    0b00011111
  }
};

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

void loop() {

  static const uint8_t MAX_PATTERN = sizeof(PATTERNS)/sizeof(PATTERNS[0]);
  for (int pno = 0; pno < MAX_PATTERN; pno++) {

    // 次のパターンへ移る時間
    unsigned long next = millis() + 500;

    while (next > millis()) {
      for (int row = 0; row < 4; row++) {
        shiftOut(SER, SRCLK, MSBFIRST, PATTERNS[pno][row]);

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

実行結果

まとめ

シフトレジスタ(SN74HC595)の使い方がやっと分かってきました。電源とGND以外は3つの接続で16個のLEDを制御できるので、スケッチのデバッグ時の動作確認などで利用できそうです。

出来るだけ少ない部品でと考えブレッドボードもケチッてみましたが、ブレッドボードは大きい方が良いですね。