はじめに
前回はシフトレジスタの練習で、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を制御できるので、スケッチのデバッグ時の動作確認などで利用できそうです。
出来るだけ少ない部品でと考えブレッドボードもケチッてみましたが、ブレッドボードは大きい方が良いですね。