部品 · 読了まで18分

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〜7Q0、Q1〜Q7QA、QB〜QHパラレル出力(Q0は15番ピン、Q1〜Q7は1〜7番ピン)抵抗を通してLEDへ
8GNDGNDグラウンドGND
9Q7'QH'シリアル出力:シフトレジスタの最後のビット次の74HC595のDSピン(チェーン)
10MRSRCLRシフトレジスタをクリアする(アクティブLOW)VCC
11SH_CPSRCLKシフトクロック。立ち上がりで1ビット取り込むArduinoのD13(SCK)
12ST_CPRCLKラッチ。立ち上がりでデータを出力にコピーするArduinoのD10
13OEOE出力を有効にする(アクティブLOW)GND(明るさの調整にはPWMピン)
14DSSERシリアルデータの入力ArduinoのD11(MOSI)
16VCCVCC電源5V(ESP32とPicoでは3.3 V)
出力Q0はほかの出力の横にはなく、反対側の15番ピンにあり、Q1〜Q7が1〜7番ピンにあります。初心者に最も多い失敗は、1番ピンからLEDを並べてQ0を忘れたり、15番ピンのLEDを列の最後に置いたりすることです。すると流れるLEDが1か所で飛び、コードのバグを探し始めてしまいますが、本当の問題は配線にあります。

Arduino Uno、ESP32、Picoへの配線

このガイドのArduinoの例はすべて同じ回路を使います。データとクロックの線に最初からハードウェアSPIのピン(D11とD13)を選んでおけば、あとでコードをSPIに切り替えるときも線を1本も動かさずに済みます。各LEDの長い足(アノード)を出力に、短い足(カソード)を抵抗を通してGNDにつなぎます。チップのVCCとGNDピンの間に、チップのできるだけ近くに100 nFのセラミックコンデンサを入れるのを忘れないでください。多くのLEDが同時に切り替わるときの短い電圧の落ち込みをならし、でたらめな誤動作を防ぎます。ボードのSPIのピンはピン配置ツールでも確認できます。

74HC595のピンArduino UnoESP32Raspberry Pi Pico
DS(14)D11GPIO 23GP19
SH_CP(11)D13GPIO 18GP18
ST_CP(12)D10GPIO 5GP17
OE(13)GNDGNDGND
MR(10)5V3V33V3(OUT)
VCC(16)5V3V33V3(OUT)
GND(8)GNDGNDGND
Q0〜Q7LED + 470 ΩLED + 220 ΩLED + 220 Ω
74HC595は強力なドライバではありません。データシートによると、1つの出力が扱えるのは最大35 mAで、VCCかGNDピンを流れる合計は70 mAを超えてはいけません。チュートリアルでよく使われる220 Ωの抵抗では、5 VでLED 1個あたり10〜13 mAを流し、8個すべてを点けると合計は80〜100 mAに達します。チップは熱くなり、出力電圧が下がり、やがて壊れることもあります。5 Vで470 Ωなら、LED 1個あたり約6 mA、8個すべてで約50 mAになり、最近のLEDならこの電流でもはっきり見えます。値を自分で計算するにはLEDの抵抗ツールを使いましょう。

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)Q0Q7
0b10000000(128)Q7Q0
0b00001111(15)Q0、Q1、Q2、Q3Q4、Q5、Q6、Q7
0b10100101(165)Q0、Q2、Q5、Q7Q0、Q2、Q5、Q7(左右対称のパターン)

ステップごとに:LED 8個で2進カウンター

  1. 74HC595をブレッドボードの中央の溝をまたぐように置き、2列の足が反対側に来るようにします。ブレッドボードの内部のつながりがよくわからなければ、先にブレッドボードとは?を読みましょう。
  2. VCC(16番ピン)とMR(10番ピン)を5Vに、GND(8番ピン)とOE(13番ピン)をGNDにつなぎます。VCCとGNDの間に100 nFのコンデンサを入れます。
  3. DS(14)をD11に、SH_CP(11)をD13に、ST_CP(12)をD10につなぎます。
  4. 8個のLEDの長い足を出力Q0〜Q7に、短い足を470 Ωの抵抗を通してGNDにつなぎます。Q0は15番ピンであることを忘れないでください。
  5. 下のコードを書き込みます。LEDが0から255まで2進数で数えるはずです。Q0のLEDが最も速く、Q7のLEDが最もゆっくり点滅します。
C++ (Arduino IDE)
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とナイトライダーの効果

Arduinoのプロジェクトで使うLED
74HC595の各出力が、専用の抵抗付きでLEDを1個駆動します。長い足(アノード)を出力へ、短い足を抵抗を通してGNDへつなぎます。

流れる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本のピンで足ります。

C++ (Arduino IDE)
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のD13ArduinoのD13(共有)
ST_CP(12)ArduinoのD10ArduinoのD10(共有)
Q7'(9)チップ2のDSピンへ何もつながないか、チップ3のDSピンへ
OE(13) / MR(10)GND / 5VGND / 5V
出力LED 0〜7LED 8〜15
C++ (Arduino IDE)
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セグメントディスプレイ
1桁の7セグメントディスプレイ:a〜gのセグメントと点(dp)でちょうど8個のLEDになり、74HC595の8つの出力にぴったり合います。

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)a7
Q1(1)b6
Q2(2)c4
Q3(3)d2
Q4(4)e1
Q5(5)f9
Q6(6)g10
Q7(7)dp5
C++ (Arduino IDE)
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とは?のガイドで学べます。

C++ (Arduino IDE)
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とは?をご覧ください。

C++ (Arduino IDE)
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とは?をご覧ください。

MicroPython
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のどれを選ぶ?

項目74HC595MAX7219TM1637WS2812B
制御用のピン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で全体をPWM16段階、ソフトウェアで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を使う
回路が動かないときは、コードを基本まで削りましょう。write595(0b10101010)を送り、どのLEDが点くかを見ます。MSBFIRSTでQ1、Q3、Q5、Q7のLEDが点いていれば、配線とビットの順番は正しいです。1つも点かなければ、テスターで16番ピンに電源電圧が、13番ピンに0 Vが、10番ピンにまた電源電圧が来ているかを確認しましょう。この3つのどれかの値が違えば、問題は配線にあります。

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
#5中級

流れるLED

LEDが次々に点灯し、光が走るように進みます。Arduinoが6個のLEDを1個ずつ短く点灯して消灯させることで、光が端から端へと移動し、また最初に戻ります。この簡単なプロジェクトで、1つのパターンで複数の光を制御する方法を学びます。

4.6(85)
207
Knight Rider風LED
#6中級

Knight Rider風LED

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

4.8(106)
202
速度調整できる流れるLED
#7中級

速度調整できる流れるLED

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

4.6(72)
146
速度調整できるKnight Rider風LED
#8中級

速度調整できるKnight Rider風LED

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

4.5(60)
120
ESP32の流れるLED
#108初級

ESP32の流れるLED

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

4.5(19)
32
Raspberry Pi Picoで流れるLED(6個のLED)
#153初級

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を追加できます。

0.0(0)
8
7セグメントディスプレイに0–9を表示
#41中級
プレミアム

7セグメントディスプレイに0–9を表示

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

4.5(30)
43
7セグメントディスプレイで0〜99を表示
#42上級
プレミアム

7セグメントディスプレイで0〜99を表示

電卓のように棒状のセグメントで数字を表示する2桁のディスプレイで、0から99まで数えます。Arduinoが数値を1の位と10の位に分け、各桁の7つのセグメントのうち必要なものを点灯させます。数値は1秒間に5回増え、99の次は再び0から始まります。デジタル時計やスコアボードなどのプロジェクトの基礎になります。

4.5(27)
35