74HC595 シフトレジスタ
シフトレジスタは、8つのメモリ位置を保持するICチップであり、それぞれが1または0のいずれかになります。これらの値をそれぞれオンまたはオフに設定するには、チップの「データ」ピンと「クロック」ピンに信号を送って制御します。

クロックピンは、指定されたパルス幅で1つずつデータを受け取ります。各パルスでデータピンがHighの場合は、1がシフトレジスタに設定されます。8個のパルスを受信した後で、Latchピンを有効にすると8個の値がラッチレジスタにコピーされます。
つまりデータピン、クロックピン、ラッチピンの3つのピンの制御で8つの信号ピンを制御することが可能になります。

ピンの仕様は、以下になります。

Q1 | 出力1 | VCC | 5V |
Q2 | 出力2 | Q0 | 出力0 |
Q3 | 出力3 | SER | シリアルデータ入力(Pin12) |
Q4 | 出力4 | OE | Output Enable(LOWで有効なのでLOWにする) |
Q5 | 出力5 | RCLK | ラッチクロック(Pin11) |
Q6 | 出力6 | SCLK | シフトクロック(Pin9) |
Q7 | 出力7 | CLEAR | クリア(LOWでクリアなのでHIGHにする) |
GND | GND | QH’ | カスケード用シリアル出力 |
使用部品
必要な部品は以下になります。
- Elegoo UNO R3 x 1
- 830 tie-points Breadboard x 1
- LED x 8
- 220Ω 抵抗器 x 8
- 74HC595 IC
- M-M Jumper wires x 14
以下のスターターキットに使用部品はすべて同梱されています。
リンク
回路をつくってみる
それでは実際に回路をつないでみます。




プログラムを動かしてみる
チュートリアル付属のコードを動かしてみます。

//www.elegoo.com
//2016.12.9
int tDelay = 100;
int latchPin = 11; // (11) ST_CP [RCK] on 74HC595
int clockPin = 9; // (9) SH_CP [SCK] on 74HC595
int dataPin = 12; // (12) DS [S1] on 74HC595
byte leds = 0;
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop()
{
leds = 0;
updateShiftRegister();
delay(tDelay);
for (int i = 0; i < 8; i++)
{
bitSet(leds, i);
updateShiftRegister();
delay(tDelay);
}
}
C++右から順にLEDが点灯していきます。



シリアルモニタを使って制御してみる
Lesson17では、同じ回路のままシリアルモニタを使って制御します。
このまま次のチュートリアルのプログラムを動かしてみたいと思います。

Arduino IDE のメニューから「ツール」→「シリアルモニタ」を選択すると下側にシリアルモニタが表示されます。(Arduino IDEの右上のアイコンでもシリアルモニタが表示されます。)
//www.elegoo.com
//2018.2.9
int latchPin = 11;
int clockPin = 9;
int dataPin = 12;
byte leds = 0;
void updateShiftRegister()
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);
while (!Serial); // Wait untilSerial is ready - Leonardo
Serial.println("Enter LED Number 0 to 7 or 'x' to clear");
}
void loop()
{
if (Serial.available())
{
char ch = Serial.read();
if (ch >= '0' && ch <= '7')
{
int led = ch - '0';
bitSet(leds, led);
updateShiftRegister();
Serial.print("Turned on LED ");
Serial.println(led);
}
if (ch == 'x')
{
leds = 0;
updateShiftRegister();
Serial.println("Cleared");
}
}
}
C++LEDを制御する基本部分は、Lesson16そのままですが、30行目の「char ch = Serial.read()
」によりシリアル通信でPCから送信された文字を1文字読み取っています。
数字の「0」~「7」を送信すると、対応するLEDが点灯します。アルファベットの「x」を送信するとすべてのLEDが消灯します。

Enter LED Number 0 to 7 or 'x' to clear
Turned on LED 0
Turned on LED 1
Turned on LED 2
Turned on LED 3
Turned on LED 4
Turned on LED 5
Turned on LED 6
Turned on LED 7
Cleared
以上
コメント