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


シフトレジスタとは?

一言で説明すると「少ないピンでより多く出力できる」
Arduinoの場合GPIOの数が限られていますので、シフトレジスタを使うことで配線がスッキリすると思います。
動作原理を理解するのは大変ですが、まずは手を動かして確認してみましょう
この記事が大変参考になります。

LEDを制御してみる

配線図は下記の通りです. 3線の出力で8個のLEDを制御しています

まずは1個だけ点灯するコード

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

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

  byte b = B00000001;

  digitalWrite(RCLK, LOW);
  shiftOut(SER, SRCLK, LSBFIRST , b);
  digitalWrite(RCLK, HIGH);

}

void loop() {

}

連続で点灯するコード

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

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

// パターン
const uint8_t PATTERNS[] = {
  0b00000001,
  0b00000010,
  0b00000100,
  0b00001000,
  0b00010000,
  0b00100000,
  0b01000000,
  0b10000000,
};

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);
  }
}