74HC595とArduinoのチュートリアル:シフトレジスタで3ピンから8個以上のLED
74HC595とArduinoのチュートリアル:ピン配置、shiftOut()とビットの順番、チップの縦続接続、流れるLEDと7セグメント、高速なSPI、ESP32とPicoのコード、電流の上限。
74HC595は、Arduinoのわずか3本のデジタルピンで8つの出力を別々に制御できる、安い16ピンのシフトレジスタICです。Arduino Unoで使えるピンは20本で、16個のLEDのナイトライダー、2桁のスコアボード、8チャンネルのリレーボードを作ろうとすると、すぐに足りなくなります。74HC595は、1本の線でデータを1ビットずつ受け取ることでこれを解決します。チップは届いたビットを順番にため、準備ができたと伝えると、8つの出力すべてに一度にコピーします。複数のチップを縦続接続(デイジーチェーン)すれば、同じ3本のピンで16、24、さらには80の出力を制御できます。
このガイドでは、74HC595のピン配置(DS、SH_CP、ST_CP、OE、MR、Q7')、シリアルのデータをパラレルの出力に変える内部構造、ArduinoのshiftOut()関数、MSBFIRSTとLSBFIRSTのビットの順番の違いを学びます。続いて、2進カウンター、流れるLED、16個のLEDのチェーン、7セグメントディスプレイを作り、同じ回路をハードウェアSPIで何十倍も速く動かします。最後の章では、ESP32とRaspberry Pi Pico(MicroPython)のコード、チップの電流の上限、ラッチの最も多い失敗の直し方を紹介します。
74HC595とは?そのしくみ
チップの中には、順番につながった2つの8ビットのレジスタがあります。1つ目はシフトレジスタです。SH_CP(クロック)ピンの立ち上がりのたびに、DSピンにある0か1が最初のセルに入り、すでに中にあるビットは1つずつ前に進みます。8回のクロックパルスのあとには、送った8ビットがすべて中に入っています。2つ目はストレージレジスタ(ラッチ)です。ST_CPピンの立ち上がりで、シフトレジスタの8ビットが一度にコピーされ、出力Q0〜Q7に現れます。この2段の構造のおかげで、ビットがシフトしている間にLEDがちらつくことはありません。出力が変わるのは、ラッチのピンをトリガーしたときだけです。
駅にたとえるとわかりやすいでしょう。車両(ビット)は1本の線路で次々にホームに入ってきますが、ドアが開くのは列車が完全に止まってからで、乗客は全員同時に降ります。ドアを開けるのがラッチのピンの仕事です。データがシリアルで入ってパラレルで出るので、74HC595はSIPO(シリアル入力・パラレル出力)レジスタとも呼ばれます。逆の働きをして、1本の線で8個のボタンを読めるようにする兄弟分が74HC165(PISO)です。どちらも74シリーズのロジックファミリーに属します。このファミリーのゲートとチップの番号は論理ゲートツールで調べられます。
| 項目 | 値 |
|---|---|
| 種類 | 8ビットのシリアル入力・パラレル出力(SIPO)シフトレジスタ+8ビットのストレージレジスタ |
| 電源電圧(VCC) | 2〜6 V(74HCT595:4.5〜5.5 V) |
| パッケージ | DIP-16(ブレッドボードに差せる)、SOIC-16、TSSOP-16 |
| 出力電流 | 1出力あたり約6 mA(データシートの4.5 Vでの試験値) |
| 絶対最大定格 | 1出力あたり±35 mA、VCCかGNDピンの合計で±70 mA |
| 最大クロック周波数 | 4.5 Vで25 MHz、2 Vで5 MHzまで保証 |
| HIGHの入力しきい値(VIH) | 電源4.5 Vで最低3.15 V(約0.7 × VCC) |
| 出力の種類 | 3ステート。OEがHIGHのとき、Q0〜Q7は浮いた状態 |
74HC595のピン配置
チップの半月形の切り欠きか小さな点が1番ピンを示します。切り欠きを上にしてチップを上から見ると、1〜8番ピンは左側を下へ、9〜16番ピンは右側を上へ並んでいます。メーカーによってピンの名前が違い、NXPとほとんどのArduinoの資料はDS、SH_CP、ST_CPを、Texas InstrumentsはSER、SRCLK、RCLKを使います。下の表には両方を載せています。OEとMRはアクティブLOWの入力で、LOWのときに働き、データシートでは名前の上に線が引かれています。
| ピン | NXPの名前 | TIの名前 | 役割 | 接続先 |
|---|---|---|---|---|
| 15、1〜7 | Q0、Q1〜Q7 | QA、QB〜QH | パラレル出力(Q0は15番ピン、Q1〜Q7は1〜7番ピン) | 抵抗を通してLEDへ |
| 8 | GND | GND | グラウンド | GND |
| 9 | Q7' | QH' | シリアル出力:シフトレジスタの最後のビット | 次の74HC595のDSピン(チェーン) |
| 10 | MR | SRCLR | シフトレジスタをクリアする(アクティブLOW) | VCC |
| 11 | SH_CP | SRCLK | シフトクロック。立ち上がりで1ビット取り込む | ArduinoのD13(SCK) |
| 12 | ST_CP | RCLK | ラッチ。立ち上がりでデータを出力にコピーする | ArduinoのD10 |
| 13 | OE | OE | 出力を有効にする(アクティブLOW) | GND(明るさの調整にはPWMピン) |
| 14 | DS | SER | シリアルデータの入力 | ArduinoのD11(MOSI) |
| 16 | VCC | VCC | 電源 | 5V(ESP32とPicoでは3.3 V) |
Arduino Uno、ESP32、Picoへの配線
このガイドのArduinoの例はすべて同じ回路を使います。データとクロックの線に最初からハードウェアSPIのピン(D11とD13)を選んでおけば、あとでコードをSPIに切り替えるときも線を1本も動かさずに済みます。各LEDの長い足(アノード)を出力に、短い足(カソード)を抵抗を通してGNDにつなぎます。チップのVCCとGNDピンの間に、チップのできるだけ近くに100 nFのセラミックコンデンサを入れるのを忘れないでください。多くのLEDが同時に切り替わるときの短い電圧の落ち込みをならし、でたらめな誤動作を防ぎます。ボードのSPIのピンはピン配置ツールでも確認できます。
| 74HC595のピン | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| DS(14) | D11 | GPIO 23 | GP19 |
| SH_CP(11) | D13 | GPIO 18 | GP18 |
| ST_CP(12) | D10 | GPIO 5 | GP17 |
| OE(13) | GND | GND | GND |
| MR(10) | 5V | 3V3 | 3V3(OUT) |
| VCC(16) | 5V | 3V3 | 3V3(OUT) |
| GND(8) | GND | GND | GND |
| Q0〜Q7 | LED + 470 Ω | LED + 220 Ω | LED + 220 Ω |
shiftOut()関数とビットの順番(MSBFIRST / LSBFIRST)
Arduinoで74HC595にデータを送る一番簡単な方法は、組み込みのshiftOut(dataPin, clockPin, bitOrder, value)関数です。値のバイトの8ビットを順番にデータピンに書き、各ビットのあとでクロックピンをHIGHにしてからLOWにします。74HC595はまさにその立ち上がりでビットを取り込みます。shiftOut()はラッチのピンには触れないので、送る前にST_CPをLOWに、送ったあとにHIGHにする必要があります。この関数は立ち上がりを使うので、呼ぶ前にクロックピンもLOWにしておきましょう。そうしないと最初のビットを取りこぼすことがあります。
bitOrderパラメーターは、ビットをどちらの端から送るかを決めます。最初に送ったビットは8回のシフトのあと一番奥のQ7に、最後に送ったビットはQ0に残ります。MSBFIRSTでは最上位ビット(ビット7)が最初に送られるので、バイトの各ビットが同じ番号の出力に入ります。ビット0がQ0、ビット7がQ7です。LSBFIRSTでは順番が逆になり、ビット0がQ7に、ビット7がQ0に現れます。このガイドの例はすべてMSBFIRSTを使っているので、コードの数値のビットとLEDの番号が1対1で対応します。2進数と0bの表記をおさらいしたいなら、数の表し方とビット演算のガイドをご覧ください。
| 送る値 | MSBFIRSTで点く出力 | LSBFIRSTで点く出力 |
|---|---|---|
| 0b00000001(1) | Q0 | Q7 |
| 0b10000000(128) | Q7 | Q0 |
| 0b00001111(15) | Q0、Q1、Q2、Q3 | Q4、Q5、Q6、Q7 |
| 0b10100101(165) | Q0、Q2、Q5、Q7 | Q0、Q2、Q5、Q7(左右対称のパターン) |
ステップごとに:LED 8個で2進カウンター
- 74HC595をブレッドボードの中央の溝をまたぐように置き、2列の足が反対側に来るようにします。ブレッドボードの内部のつながりがよくわからなければ、先にブレッドボードとは?を読みましょう。
- VCC(16番ピン)とMR(10番ピン)を5Vに、GND(8番ピン)とOE(13番ピン)をGNDにつなぎます。VCCとGNDの間に100 nFのコンデンサを入れます。
- DS(14)をD11に、SH_CP(11)をD13に、ST_CP(12)をD10につなぎます。
- 8個のLEDの長い足を出力Q0〜Q7に、短い足を470 Ωの抵抗を通してGNDにつなぎます。Q0は15番ピンであることを忘れないでください。
- 下のコードを書き込みます。LEDが0から255まで2進数で数えるはずです。Q0のLEDが最も速く、Q7のLEDが最もゆっくり点滅します。
1// 74HC595 ile 8 LED'de ikilik sayaç / Binary counter on 8 LEDs with a 74HC595
2const int DATA_PIN = 11; // DS (14)
3const int CLOCK_PIN = 13; // SH_CP (11)
4const int LATCH_PIN = 10; // ST_CP (12)
5
6void write595(byte value) {
7 digitalWrite(LATCH_PIN, LOW); // latch'i indir / pull the latch low
8 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value); // 8 biti kaydır / shift the 8 bits in
9 digitalWrite(LATCH_PIN, HIGH); // yükselen kenar: çıkışlara aktar / rising edge: copy to the outputs
10}
11
12void setup() {
13 pinMode(DATA_PIN, OUTPUT);
14 pinMode(CLOCK_PIN, OUTPUT);
15 pinMode(LATCH_PIN, OUTPUT);
16 digitalWrite(CLOCK_PIN, LOW); // saat LOW başlamalı / the clock must start low
17 write595(0); // açılışta hepsi sönük / all off at startup
18}
19
20void loop() {
21 for (int n = 0; n < 256; n++) {
22 write595(n); // n'in bitleri Q0–Q7'de / the bits of n on Q0–Q7
23 delay(200);
24 }
25}コードの中心はwrite595()関数です。ラッチをLOWにし、shiftOut()で8ビットを送り、ラッチをHIGHにして、すべてを一度に出力にコピーします。LEDがちらつかないのもこのためで、ビットがシフトしている間、出力は前の値を保っています。nが5(0b00000101)のときはQ0とQ2のLEDが、200(0b11001000)のときはQ3、Q6、Q7のLEDが点きます。Unoでは、D13の内蔵LのLEDがクロック信号でかすかにちらつくことがありますが、これは正常で、回路には影響しません。
流れるLEDとナイトライダーの効果

流れるLEDでは、各ステップで1つのビットだけを1にすれば十分です。Arduinoのbit(i)マクロは、ビットiだけが1の数値を作ります。bit(0)は1、bit(3)は8、bit(7)は128です。下のコードは3つの効果を続けて再生します。Q0からQ7へ流れる1個のLED、行ったり来たりするナイトライダー、少しずつ満ちていくバーです。ピンに直接つなぐ定番の版と比べるには、Arduinoのナイトライダーと流れるLEDをご覧ください。そちらではLEDごとに専用のピンを使いますが、ここでは合計3本のピンで足ります。
1// Yürüyen LED, karaşimşek ve dolan çubuk / Running light, Knight Rider and filling bar
2const int DATA_PIN = 11; // DS
3const int CLOCK_PIN = 13; // SH_CP
4const int LATCH_PIN = 10; // ST_CP
5const int STEP_MS = 80; // adım süresi (ms) / step time (ms)
6
7void write595(byte value) {
8 digitalWrite(LATCH_PIN, LOW);
9 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
10 digitalWrite(LATCH_PIN, HIGH);
11}
12
13void setup() {
14 pinMode(DATA_PIN, OUTPUT);
15 pinMode(CLOCK_PIN, OUTPUT);
16 pinMode(LATCH_PIN, OUTPUT);
17 digitalWrite(CLOCK_PIN, LOW);
18 write595(0);
19}
20
21void loop() {
22 // 1) Yürüyen LED: Q0'dan Q7'ye / running light: Q0 to Q7
23 for (int i = 0; i < 8; i++) {
24 write595(bit(i)); // yalnızca i. bit 1 / only bit i is 1
25 delay(STEP_MS);
26 }
27
28 // 2) Karaşimşek: git-gel, 3 tur / Knight Rider: back and forth, 3 rounds
29 for (int r = 0; r < 3; r++) {
30 for (int i = 0; i < 7; i++) { write595(bit(i)); delay(STEP_MS); }
31 for (int i = 7; i > 0; i--) { write595(bit(i)); delay(STEP_MS); }
32 }
33
34 // 3) Dolan çubuk / filling bar
35 byte bar = 0;
36 for (int i = 0; i < 8; i++) {
37 bar |= bit(i); // bir LED daha ekle / add one more LED
38 write595(bar);
39 delay(STEP_MS * 2);
40 }
41 write595(0);
42 delay(300);
43}ナイトライダーの部分では、行きのループを0〜6、帰りのループを7〜1にしているので、両端のLEDが2回続けて点くことがなく、動きがなめらかに見えます。満ちていくバーでは、|=(ビットごとのOR)演算で、前のLEDを点けたまま新しいLEDを足します。これは、ポテンショメーターやセンサーの値を表示するLEDのバーグラフの基本です。コードはdelay()を使っているので、効果の再生中、Arduinoはほかのことができません。効果の間にボタンを読んだり速さをその場で変えたりしたいなら、代わりにmillis()でタイミングを取りましょう。方法はmillis()とdelay()のガイドにあります。
複数の74HC595の縦続接続(Q7')
チップの9番ピンQ7'(QH')は、シフトレジスタからあふれたビットを出力します。これを2つ目の74HC595のDS入力につなぐと、2つのチップは1つの16ビットのレジスタのように振る舞います。SH_CPとST_CPの線はすべてのチップで共有するので、チェーンが3個でも10個でも、Arduinoから出る線は3本のままです。新しいバイトを送るたびに、前のバイトは次のチップへ押し出されます。そのため、最初に送ったバイトはチェーンの最後のチップに入り、最後に送ったバイトはArduinoにつながった最初のチップに残ります。ラッチが動くと、すべてのチップの出力が同時に更新されます。
| 接続 | チップ1 | チップ2 |
|---|---|---|
| DS(14) | ArduinoのD11 | チップ1のQ7'(9番ピン) |
| SH_CP(11) | ArduinoのD13 | ArduinoのD13(共有) |
| ST_CP(12) | ArduinoのD10 | ArduinoのD10(共有) |
| Q7'(9) | チップ2のDSピンへ | 何もつながないか、チップ3のDSピンへ |
| OE(13) / MR(10) | GND / 5V | GND / 5V |
| 出力 | LED 0〜7 | LED 8〜15 |
1// İki zincirli 74HC595 ile 16 LED / 16 LEDs on two daisy-chained 74HC595s
2const int DATA_PIN = 11; // 1. entegrenin DS'si / DS of chip 1
3const int CLOCK_PIN = 13; // iki entegrede ortak SH_CP / shared SH_CP
4const int LATCH_PIN = 10; // iki entegrede ortak ST_CP / shared ST_CP
5
6void write16(uint16_t value) {
7 digitalWrite(LATCH_PIN, LOW);
8 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, highByte(value)); // önce uzaktaki entegre (LED 8–15) / far chip first (LEDs 8–15)
9 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, lowByte(value)); // sonra yakındaki (LED 0–7) / then the near chip (LEDs 0–7)
10 digitalWrite(LATCH_PIN, HIGH); // 16 çıkış aynı anda değişir / all 16 outputs change at once
11}
12
13void setup() {
14 pinMode(DATA_PIN, OUTPUT);
15 pinMode(CLOCK_PIN, OUTPUT);
16 pinMode(LATCH_PIN, OUTPUT);
17 digitalWrite(CLOCK_PIN, LOW);
18 write16(0);
19}
20
21void loop() {
22 for (int i = 0; i < 16; i++) { // ileri / forward
23 write16(bit(i));
24 delay(50);
25 }
26 for (int i = 14; i > 0; i--) { // geri / backward
27 write16(bit(i));
28 delay(50);
29 }
30}highByte()とlowByte()は、16ビットの数値を2つのバイトに分けます。上位バイトを先に送るので、それはチェーンの最後のチップまで進んでLED 8〜15を制御し、下位バイトは最初のチップに残ります。3つ目のチップを足すには、もう1バイト送るだけです。ここでも一番遠いチップのバイトから送ります。チップが多いなら、バイトを配列に入れてループで送るとすっきりします。チェーンに理論上の上限はありませんが、チップが増えるほど更新に時間がかかり、共有のクロック線の負荷も増えます。長いチェーンでは、各チップに100 nFのコンデンサを入れ、クロックとラッチの線を短くし、線がとても長くなるなら74HC244のようなバッファICでクロックを強めましょう。
74HC595で7セグメントディスプレイを動かす

1桁の7セグメントディスプレイには、ちょうど8個のLEDが入っています。aからgまでの7つのセグメントと、1つの点(dp)です。つまり、1つの74HC595の8つの出力が1桁にぴったり合います。Q0をセグメントaに、Q1をbに、という順につなぐと、Q6がg、Q7がdpになり、バイトのビット0がセグメントa、ビット6がセグメントgを表します。下の表は、一般的な10ピンのカソードコモンのディスプレイの配線です。コモンのピン(3と8)をGNDにつなぎ、各セグメントに専用の470 Ωの抵抗を入れます。セグメントの文字の配置と、アノードコモンとカソードコモンの違いは7セグメントディスプレイのガイドで詳しく紹介しています。
| 74HC595の出力 | セグメント | ディスプレイのピン |
|---|---|---|
| Q0(15) | a | 7 |
| Q1(1) | b | 6 |
| Q2(2) | c | 4 |
| Q3(3) | d | 2 |
| Q4(4) | e | 1 |
| Q5(5) | f | 9 |
| Q6(6) | g | 10 |
| Q7(7) | dp | 5 |
1// 74HC595 ile tek haneli 7 segment: 0–9 sayacı / Single-digit 7-segment 0–9 counter with a 74HC595
2const int DATA_PIN = 11;
3const int CLOCK_PIN = 13;
4const int LATCH_PIN = 10;
5const bool COMMON_ANODE = false; // ortak anotsa true / true for common anode
6
7// bit 0 = a ... bit 6 = g, bit 7 = dp (1 = yanar / 1 = on)
8const byte DIGITS[10] = {
9 0b00111111, // 0
10 0b00000110, // 1
11 0b01011011, // 2
12 0b01001111, // 3
13 0b01100110, // 4
14 0b01101101, // 5
15 0b01111101, // 6
16 0b00000111, // 7
17 0b01111111, // 8
18 0b01101111 // 9
19};
20
21void write595(byte value) {
22 if (COMMON_ANODE) value = ~value; // ortak anotta LOW yakar / LOW lights a common-anode segment
23 digitalWrite(LATCH_PIN, LOW);
24 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
25 digitalWrite(LATCH_PIN, HIGH);
26}
27
28void setup() {
29 pinMode(DATA_PIN, OUTPUT);
30 pinMode(CLOCK_PIN, OUTPUT);
31 pinMode(LATCH_PIN, OUTPUT);
32 digitalWrite(CLOCK_PIN, LOW);
33}
34
35void loop() {
36 for (int n = 0; n < 10; n++) {
37 byte pattern = DIGITS[n];
38 if (n % 2 == 1) pattern |= 0b10000000; // tek sayılarda nokta yanar / dot on for odd numbers
39 write595(pattern);
40 delay(800);
41 }
42}アノードコモンのディスプレイでは、コモンのピンを5Vにつなぎ、出力がLOWのときにセグメントが点きます。コードでCOMMON_ANODEをtrueにすると、~演算子がすべてのビットを反転し、同じ表がそのまま使えます。2桁のカウンターにするには、チェーンに2つ目の74HC595を足し、遠いほうの桁のパターンを先に、Arduinoに近い桁のパターンをあとに送ります。この方法では各桁に専用のチップがあるので、ダイナミック点灯(マルチプレクス)は不要で、表示がちらつくことはなく、loop()でdelay()を使っても問題ありません。4桁以上なら、2つの74HC595でダイナミック点灯するか、自分でスキャンしてくれるTM1637やMAX7219のドライバに切り替えましょう。
SPIで高速に動かす
shiftOut()は各ビットをdigitalWrite()で1つずつ書くので遅く、Arduino Unoでは1バイト送るのに約100 µsかかります。LEDが数個なら気になりませんが、10個のチップのチェーンを1秒に何千回も更新したり、LEDの明るさをソフトウェアで制御したり、ダイナミック点灯のLEDキューブをスキャンしたりするには足りません。よいことに、74HC595の通信は実はただのSPIです。DSがMOSIに、SH_CPがSCKに、ST_CPがチップセレクト(CS)のピンに相当します。UnoのハードウェアSPIは8 MHzで1バイトを約1 µsで送り、関数呼び出しの負担を含めてもshiftOut()より何十倍も速くなります。SPIのしくみはSPIとは?のガイドで学べます。
1// 74HC595'i donanım SPI ile sürmek (Arduino Uno) / Driving a 74HC595 over hardware SPI (Arduino Uno)
2#include <SPI.h>
3
4const int LATCH_PIN = 10; // ST_CP; D11 (MOSI) = DS, D13 (SCK) = SH_CP
5
6void write595(byte value) {
7 SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); // 8 MHz, mod 0 / 8 MHz, mode 0
8 digitalWrite(LATCH_PIN, LOW);
9 SPI.transfer(value); // 8 bit yaklaşık 1 µs'de / 8 bits in about 1 µs
10 digitalWrite(LATCH_PIN, HIGH); // çıkışlara aktar / copy to the outputs
11 SPI.endTransaction();
12}
13
14void setup() {
15 pinMode(LATCH_PIN, OUTPUT);
16 SPI.begin(); // D11 ve D13 SPI'ye geçer / D11 and D13 switch to SPI
17 write595(0);
18}
19
20void loop() {
21 static byte pattern = 0b00000001;
22 write595(pattern);
23 pattern = (pattern << 1) | (pattern >> 7); // sola döndür / rotate left
24 delay(100);
25}SPI_MODE0では、データはクロックの立ち上がりで読み取られ、これはまさに74HC595の動き方と同じです。MSBFIRSTではここでもビット7がQ7に送られるので、前の例のパターンがそのまま使えます。Unoでは、ハードウェアSPIがマスターモードのままでいるために、D10を出力にしておく必要があります。SPI.begin()がこれを設定してくれるので、D10はラッチに最適なピンでもあります。チェーンに複数のチップがあるなら、ラッチのLOWとHIGHの間で、チップの数だけSPI.transfer()を呼ぶだけです。MISO(D12)はこの回路では使わず、ほかのSPIデバイスのために空けておけます。
OEで明るさ、MRでクリア
OE(出力イネーブル)ピンは、すべての出力を一度にオン・オフするスイッチです。GNDの代わりにD9のようなUnoのPWMピンにつなぐと、PWMですべてのLEDの明るさをまとめて調整できます。OEはアクティブLOWなので、ロジックは逆になります。analogWrite(9, 0)が最大の明るさ、analogWrite(9, 255)が完全に消灯です。コードでanalogWrite(9, 255 - brightness)と書くと扱いやすくなります。この方法はすべてのLEDに同じように効きます。LEDごとに明るさを変えるには、高速なSPIの更新でソフトウェア的に行うか、WS2812BのようなアドレスできるLEDに切り替える必要があります。
MR(マスターリセット)ピンがLOWになると、シフトレジスタのすべてのビットがクリアされますが、ストレージレジスタは前の値を保つので、出力はすぐには消えません。出力も消すには、MRがLOWの間にラッチのピンに立ち上がりを送る必要があります。実際には、MRをVCCに直接つなぎ、write595(0)でソフトウェア的にクリアすれば、ピンも線も1本節約できます。電源投入時の問題もあります。電源を入れると、ストレージレジスタはでたらめな値で始まり、LEDが一瞬ばらばらに点くことがあります。リレーボードではこれは危険です。防ぐには、OEを10 kΩでVCCにプルアップし、setup()で最初にwrite595(0)を呼んでから、OEのピンをLOWにします。
ESP32で74HC595を使う:3.3 VとSPI
ESP32のピンは3.3 Vを出力します。74HC595を5 Vで給電すると、入力がHIGHとみなされるには約0.7 × VCC、つまり3.5 Vが必要で、3.3 Vはこのしきい値を下回り、動作が不安定になります。一番すっきりした解決策は、チップもESP32の3V3ピンから給電することです。74HC595は2 Vから動くからです。どうしてもチップを5 Vで給電しなければならないなら、入力が2 Vを超えるとHIGHとみなす74HCT595を使うか、間にレベル変換モジュールを入れましょう。3.3 Vでは、赤、黄、緑のLEDには220 Ωが合いますが、順方向電圧が約3 Vの青や白のLEDは3.3 Vではとても暗くなります。
下の例では、ESP32のVSPIのピン(SCKはGPIO 18、MOSIはGPIO 23)を使い、縦続接続した2つの74HC595につないだ16個のLEDでナイトライダーの効果を再生します。GPIO 5がラッチです。74HC595の速度の上限は電源電圧とともに下がるので、SPIの速度は4 MHzにしています。3.3 Vでも4 MHzなら十分な余裕があります。shiftOut()もESP32で動き、240 MHzのプロセッサのおかげでUnoよりずっと速いですが、SPIを使えばWi-Fiなどの仕事のためにプロセッサを空けられます。ボードの基本と安全なピンの選び方はESP32とは?をご覧ください。
1// ESP32 + iki 74HC595 (SPI) ile 16 LED karaşimşek / 16-LED Knight Rider on ESP32 with two 74HC595s (SPI)
2#include <SPI.h>
3
4const int SCK_PIN = 18; // SH_CP
5const int MOSI_PIN = 23; // DS
6const int LATCH_PIN = 5; // ST_CP
7
8void write16(uint16_t value) {
9 SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); // 3,3 V için 4 MHz yeterli / 4 MHz is plenty at 3.3 V
10 digitalWrite(LATCH_PIN, LOW);
11 SPI.transfer(highByte(value)); // önce uzaktaki entegre / far chip first
12 SPI.transfer(lowByte(value)); // sonra yakındaki / then the near chip
13 digitalWrite(LATCH_PIN, HIGH);
14 SPI.endTransaction();
15}
16
17void setup() {
18 pinMode(LATCH_PIN, OUTPUT);
19 SPI.begin(SCK_PIN, -1, MOSI_PIN, -1); // MISO ve SS kullanılmıyor / MISO and SS unused
20 write16(0);
21}
22
23void loop() {
24 for (int i = 0; i < 16; i++) { write16(bit(i)); delay(40); } // ileri / forward
25 for (int i = 14; i > 0; i--) { write16(bit(i)); delay(40); } // geri / backward
26}Raspberry Pi PicoとMicroPythonで74HC595を使う
Picoでも74HC595は3V3(OUT)ピンから給電します。MicroPythonにはArduinoのshiftOut()に相当する既製の関数はありませんが、ハードウェアSPIで簡単にできます。SPI0のGP18(SCK)とGP19(MOSI)のピンを使い、ラッチにはどのGPIOでも使えます。ここではGP17です。MicroPythonはSPI0のMISOのピン(GP16)もSPI用に確保するので、ほかのものにつながないでください。spi.write()に複数のバイトを渡せば、チェーンのすべてのチップを一度に更新でき、ここでも最初のバイトは一番遠いチップに行きます。セットアップと最初の一歩はRaspberry Pi Picoとは?をご覧ください。
1# Pico + 74HC595: yürüyen LED ve ikilik sayaç (SPI) / Pico + 74HC595: running light and binary counter (SPI)
2from machine import Pin, SPI
3import time
4
5# GP18 = SCK -> SH_CP, GP19 = MOSI -> DS; GP16 (MISO) boş kalır / GP16 (MISO) stays unconnected
6spi = SPI(0, baudrate=4000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
7latch = Pin(17, Pin.OUT, value=1) # ST_CP
8
9def write595(*values):
10 # birden çok bayt = zincirdeki entegreler, ilk bayt en uzaktakine
11 # several bytes = chained chips, the first byte goes to the far chip
12 latch.value(0)
13 spi.write(bytes(values))
14 latch.value(1) # yükselen kenar: çıkışlara aktar / rising edge: copy to the outputs
15
16write595(0)
17while True:
18 for i in range(8): # yürüyen LED / running light
19 write595(1 << i)
20 time.sleep_ms(80)
21 for n in range(256): # ikilik sayaç / binary counter
22 write595(n)
23 time.sleep_ms(20)大きな負荷:トランジスタ、ULN2803、TPIC6B595
74HC595の出力は、LEDの小さな電流にしか向いていません。リレーのコイル(70〜90 mA)、小型モーター、複数のブザー、12 VのLEDテープなどの負荷を直接つながないでください。各出力のあとにNPNのトランジスタを入れるか、8つのダーリントントランジスタを1つのパッケージにまとめたULN2803を使います。ULN2803はGND側で1チャンネルあたり最大500 mAを切り替え、誘導性負荷用の保護ダイオードも内蔵しています。それを働かせるには、COMピンを負荷の電源につなぎます。よりすっきりした解決策はTPIC6B595です。74HC595とまったく同じようにプログラムできますが、強力なオープンドレインの出力を持ち、1出力あたり連続150 mAを流し、最大50 Vの負荷を切り替えられます。20ピンなのでピン配置は違い、負荷は電源のプラスと出力の間につなぎます。
74HC595、MAX7219、TM1637のどれを選ぶ?
| 項目 | 74HC595 | MAX7219 | TM1637 | WS2812B |
|---|---|---|---|---|
| 制御用のピン | 3(DS、SH_CP、ST_CP) | 3(DIN、CLK、CS) | 2(CLK、DIO) | 1(DIN) |
| 出力 | 1チップあたり8、チェーン可 | LED 64個(8桁か8x8マトリクス) | 4〜6桁の7セグメント | LEDを1個ずつアドレス指定 |
| 電流の制限 | LEDごとに抵抗 | 全LEDに抵抗1本(RSET) | モジュールに内蔵 | LEDの中 |
| 明るさ | OEで全体をPWM | 16段階、ソフトウェアで | 8段階 | 色のチャンネルごとに256段階 |
| 向いている用途 | LEDバー、リレーボード、汎用の出力 | LEDマトリクス、多桁のディスプレイ | 時計、カウンター | カラフルな効果、テープ |
シンプルなLEDバー、8チャンネルのリレーボード、それぞれ違う仕事をするデジタル出力が必要なら、74HC595が最も安く柔軟な選択です。8x8のLEDマトリクスや多桁のディスプレイには、ダイナミック点灯を自分で処理するMAX7219のほうがずっと楽です。カラフルで1個ずつ制御できる光がほしいなら、WS2812B NeoPixelのLEDが1本のデータピンで動きます。
74HC595を使ったプロジェクトのアイデア
- LED 16個のナイトライダー:2つのチップをチェーンにして行ったり来たりの効果を作り、ポテンショメーターで速さを調整します。
- LEDバーのレベルメーター:センサーの値や音の大きさを、8〜16個のLEDのバーで表示します。
- 駐車センサー:HC-SR04で測った距離が短くなるにつれて、緑から赤へとLEDを多く点けます。
- 2桁のスコアボード:7セグメントディスプレイ2個とチェーンにした2つのチップで、ボタン付きのちらつかないカウンターを作ります。
- 2進数の時計:RTC時計モジュールから時刻を取り、時、分、秒をLEDの列で2進数として表示します。
- 3x3x3のLEDキューブ:層をトランジスタで、列を74HC595で動かし、3Dのアニメーションを作ります。詳しくはArduinoのLEDキューブのガイドをご覧ください。
- 8チャンネルのリレーボード:ULN2803かTPIC6B595で、3本のピンから8個のリレーを制御します。
よくある失敗と対処法
| 症状 | 考えられる原因 | 対処法 |
|---|---|---|
| LEDが1つも点かない | OEが浮いているかHIGH、MRがLOWのまま | OEをGNDに、MRをVCCにつなぐ |
| LEDが変わらない | ラッチ(ST_CP)がトリガーされていない、または違うピンにある | shiftOut()のあとでラッチをLOWからHIGHにし、ピン番号を確認する |
| シフト中にLEDがちらつく、またはパターンが1ビットずれる | SH_CPとST_CPをつないでいる。するとシフトレジスタがストレージレジスタよりいつも1クロック先に進む | ラッチには別のピンを使い、すべてのバイトを送ってからHIGHにする |
| LEDが逆の順番で点く | ビットの順番の取り違え、またはQ0の位置が違う | MSBFIRSTとLSBFIRSTを入れ替え、Q0が15番ピンにあるか確認する |
| チェーンのチップが入れ替わる、または1つが1段遅れる | バイトを送る順番が違う、またはチップ2のDSをQ7'ではなくQ7(7番ピン)につないだ | 遠いチップのバイトを先に送り、DSを9番ピンにつなぐ |
| 多くのLEDを点けると全部暗くなり、チップが熱くなる | 合計の電流が上限の70 mAを超えている | 470 Ω〜1 kΩの抵抗か、ULN2803 / TPIC6B595を使う |
| LEDがでたらめに光り、線に触れると変わる | コンデンサがない、線が長い、または入力が浮いている | VCCとGNDの間に100 nFを入れ、線を短くし、OEやMRを決して浮かせない |
| ESP32やPicoで不安定 | チップを5 Vで給電していて、3.3 Vの信号がHIGHとみなされない | チップを3V3から給電するか、74HCT595を使う |
74HC595は、ピン不足を解決する最も安く、最も勉強になる方法です。シフトとラッチの考え方がわかれば、SPIのデバイス、LEDマトリクスのドライバ、ディスプレイモジュール、74HC165でのボタンの読み取りでも、同じ考え方に気づけます。LED 8個のカウンターから始めて、チェーンを伸ばし、SPIに進みましょう。BlueGraysアプリには、Arduino、ESP32、Raspberry Pi Pico用の流れるLED、ナイトライダー、速さを調整できる効果、7セグメントのカウンターのプロジェクトが、回路図とコード付きでステップごとに用意されています。
よくある質問
74HC595は何に使いますか?
74HC595は、マイコンからのシリアルのデータを8つのパラレルの出力に変えるシフトレジスタです。Arduinoのわずか3本のピンで、8個のLED、7セグメントディスプレイ、トランジスタを通したリレーを制御できます。チップを縦続接続すれば、同じ3本のピンで16、24、それ以上の出力が得られます。
74HC595は何個まで縦続接続できますか?
理論上の上限はありません。各チップのQ7'出力を次のチップのDS入力につなぎ、クロックとラッチの線は共有します。実際の上限は、更新にかかる時間と共有のクロック線の負荷で決まります。Unoでは、shiftOut()は1チップあたり約100 µsかかりますが、SPIなら数マイクロ秒に下がります。長いチェーンでは、各チップに100 nFのコンデンサを入れ、線を短くしましょう。
74HC595の出力はどのくらいの電流を流せますか?
データシートは1出力あたり6 mAでの出力電圧を保証しています。絶対最大定格は1出力あたり35 mA、VCCかGNDピンの合計で70 mAです。8個のLEDが同時に点くこともあるので、LED 1個あたり6〜8 mAを目安にすると安全です。5 Vでは約470 Ωの抵抗に相当します。
74HC595は3.3 VのESP32で動きますか?
はい。74HC595は2〜6 Vで動くので、ESP32やPicoの3V3ピンから給電でき、3.3 Vの信号も問題なく読めます。チップを5 Vで給電すると、3.3 Vの信号がHIGHのしきい値を下回ることがあります。その場合は74HCT595かレベル変換モジュールを使いましょう。
74HC595のラッチのピンは何をしますか?
ラッチのピン(ST_CPまたはRCLK)は、シフトレジスタに送り込んだビットを出力にコピーするトリガーです。ビットがシフトしている間、出力は前の値を保ち、ラッチのピンに立ち上がりが来ると、8つの出力すべてが同時に更新されます。これにより、データを送っている間にLEDがちらつかず、チェーンのすべてのチップが一斉に変わります。
74HC595でリレーやモーターを動かせますか?
直接はできません。出力は数ミリアンペアのLEDの電流にしか向いていません。リレー、モーター、LEDテープには、各出力にトランジスタを足すか、1チャンネルあたり最大500 mAを切り替えられるULN2803を使いましょう。同じようにプログラムできるTPIC6B595は、1出力あたり150 mAを流せる強力な代わりになります。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
流れるLED
LEDが次々に点灯し、光が走るように進みます。Arduinoが6個のLEDを1個ずつ短く点灯して消灯させることで、光が端から端へと移動し、また最初に戻ります。この簡単なプロジェクトで、1つのパターンで複数の光を制御する方法を学びます。

Knight Rider風LED
Knight Riderでおなじみの、光が左右に往復する動きです。6個のLEDの上を光の点が端から端へ進み、折り返します。Arduinoが各LEDを10分の1秒ずつ点灯させ、端に着くたびに向きを変えて往復し続けます。装飾用の照明や警告灯作りの第一歩にぴったりです。

速度調整できる流れるLED
6個のLEDが順番に点滅し、光が端から端へ走るように見えます。ポテンショメーターのつまみを回すと、その速さがすぐに変わります。一方に回すと光が素早く進み、反対に回すと各LEDが1秒近く点灯します。つまみで動きの速さを調整する仕組みを目で確かめられます。

速度調整できるKnight Rider風LED
6個のLEDの上を光が端から端へ走り、折り返して戻ってきます。ポテンショメーターのつまみを回すと、その速さをすぐに調整できます。つまみを一方の端にすると光が飛ぶように進み、反対の端にするとゆっくり進みます。1つのつまみで動作中のアニメーションを操る楽しさを体験できます。

ESP32の流れるLED
6個のLEDを左から右へ、右から左へ順番に点灯させます(Knight Rider風)。forループと配列を使う基本例で、進む向きを切り替える仕組みを学べます。

Raspberry Pi Picoで流れるLED(6個のLED)
Picoで定番の「流れるLED」アニメーションを、6個のLEDで作ります!6個のLEDが左から右へ順に点灯し、光が列に沿って移動しているように見えます。Pythonのリスト、リスト内包表記([Pin(p, Pin.OUT) for p in LED_PINS])、forループによるピン制御、enumerate()を学びます。GP9-GP14に6個のLEDを接続し、それぞれに220Ωの電流制限抵抗を使います。6個のLEDを1個ずつ定義する代わりにリストを使うため、コードがすっきりします。使用可能な空きGPIOピンの数まで、それぞれに抵抗を付けてLEDを追加できます。

7セグメントディスプレイに0–9を表示
エレベーターやデジタル時計で見慣れた数字を、自分で表示してみます。7本の小さな発光バーでできたディスプレイに、Arduinoが0から9までの数字を1秒に1つずつ表示し、最初から繰り返します。それぞれの数字がどのバーの点灯で作られるかを確かめ、カウンターや時計のプロジェクトに向けた基礎を学べます。

7セグメントディスプレイで0〜99を表示
電卓のように棒状のセグメントで数字を表示する2桁のディスプレイで、0から99まで数えます。Arduinoが数値を1の位と10の位に分け、各桁の7つのセグメントのうち必要なものを点灯させます。数値は1秒間に5回増え、99の次は再び0から始まります。デジタル時計やスコアボードなどのプロジェクトの基礎になります。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

