LoginSignup
3
1

More than 3 years have passed since last update.

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

Posted at

シフトレジスタとは?

image.png

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

LEDを制御してみる

配線図は下記の通りです. 3線の出力で8個のLEDを制御しています
425CC0A9-1C78-4A7E-A867-30DBED7F4C7C.png

まずは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);
  }
}

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1