シフトレジスタとは?
一言で説明すると「少ないピンでより多く出力できる」
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);
}
}