Компоненты · 15 мин чтения

74HC595 и Arduino: сдвиговый регистр для 8+ светодиодов на 3 пинах

74HC595 и Arduino: распиновка, shiftOut() и порядок битов, цепочка микросхем, бегущие огни и 7-сегментный индикатор, быстрый SPI, код для ESP32 и Pico, пределы тока.

74HC595 — дешёвая 16-выводная микросхема сдвигового регистра, которая позволяет управлять 8 отдельными выходами всего через 3 цифровых пина Arduino. У Arduino Uno 20 пинов, и они быстро заканчиваются, если собирать бегущие огни Knight Rider на 16 светодиодах, двухразрядное табло или 8-канальную плату реле. 74HC595 решает это, принимая данные по одному биту по единственной линии: микросхема собирает приходящие биты один за другим и, когда ты сообщаешь, что всё готово, разом копирует их на все восемь выходов. Соедини несколько микросхем цепочкой, и те же 3 пина будут управлять 16, 24 и даже 80 выходами.

В этом руководстве ты разберёшь распиновку 74HC595 (DS, SH_CP, ST_CP, OE, MR и Q7'), внутреннее устройство, которое превращает последовательные данные в параллельные выходы, функцию Arduino shiftOut() и разницу между порядком битов MSBFIRST и LSBFIRST. Затем соберёшь двоичный счётчик, бегущий огонь, цепочку из 16 светодиодов и 7-сегментный индикатор и заставишь ту же схему работать в десятки раз быстрее через аппаратный SPI. В последних разделах — код для ESP32 и Raspberry Pi Pico (MicroPython), пределы тока микросхемы и решения для самых частых ошибок с защёлкой.

Что такое 74HC595 и как он работает?

Внутри микросхемы два 8-битных регистра, соединённых друг за другом. Первый — сдвиговый регистр: на каждом нарастающем фронте на пине SH_CP (тактирование) 0 или 1 с пина DS попадает в первую ячейку, а уже находящиеся внутри биты сдвигаются на одну позицию вперёд. После восьми тактовых импульсов внутри все восемь отправленных битов. Второй — регистр хранения (защёлка): по нарастающему фронту на пине ST_CP восемь битов из сдвигового регистра разом копируются в него и появляются на выходах Q0–Q7. Благодаря такой двухступенчатой схеме светодиоды не мерцают, пока биты сдвигаются; выходы меняются только тогда, когда срабатывает пин защёлки.

Представь железнодорожную станцию: вагоны (биты) один за другим въезжают на платформу по единственному пути, но двери открываются, только когда поезд полностью остановился, и все пассажиры выходят одновременно. Открывать двери — работа пина защёлки. Поскольку данные входят последовательно, а выходят параллельно, 74HC595 называют ещё регистром SIPO (serial-in, parallel-out, последовательный вход — параллельный выход). Его собрат, делающий обратное и позволяющий читать 8 кнопок по одной линии, — 74HC165 (PISO). Оба относятся к логическому семейству серии 74; элементы и номера микросхем этого семейства можно посмотреть в утилите «Логические элементы».

ПараметрЗначение
Тип8-битный сдвиговый регистр с последовательным входом и параллельным выходом (SIPO) + 8-битный регистр хранения
Напряжение питания (VCC)2–6 V (74HCT595: 4,5–5,5 V)
КорпусDIP-16 (подходит для макетной платы), SOIC-16, TSSOP-16
Выходной токОколо 6 mA на выход (тестовое значение из даташита при 4,5 V)
Абсолютные пределы±35 mA на выход; всего ±70 mA через пин VCC или GND
Максимальная тактовая частотаГарантированно до 25 MHz при 4,5 V, 5 MHz при 2 V
Порог HIGH на входе (VIH)Не менее 3,15 V при питании 4,5 V (около 0,7 × VCC)
Тип выходаС тремя состояниями (3-state); при HIGH на OE выходы 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)Светодиоды через резисторы
8GNDGNDЗемляGND
9Q7'QH'Последовательный выход: последний бит сдвигового регистраВывод DS следующего 74HC595 (цепочка)
10MRSRCLRОчищает сдвиговый регистр (активный LOW)VCC
11SH_CPSRCLKТактирование сдвига; принимает 1 бит по нарастающему фронтуArduino D13 (SCK)
12ST_CPRCLKЗащёлка; копирует данные на выходы по нарастающему фронтуArduino D10
13OEOEВключает выходы (активный LOW)GND (или пин PWM для яркости)
14DSSERПоследовательный вход данныхArduino D11 (MOSI)
16VCCVCCПитание5V (3,3 V на ESP32 и Pico)
Выход Q0 не рядом с остальными: он на выводе 15 на противоположной стороне, а Q1–Q7 — на выводах 1–7. Самая частая ошибка новичков — выстроить светодиоды начиная с вывода 1 и забыть Q0 или поставить светодиод с вывода 15 в конец ряда. Тогда бегущий огонь в одном месте перескакивает, и начинаешь искать ошибку в коде, хотя на самом деле проблема в подключении.

Подключение к Arduino Uno, ESP32 и Pico

Все примеры для Arduino в этом руководстве используют одну схему. Если с самого начала выбрать для линий данных и тактирования пины аппаратного SPI (D11 и D13), при переводе кода на SPI потом не придётся переставлять ни одного провода. Длинная ножка каждого светодиода (анод) идёт к выходу, а короткая (катод) — к GND через резистор. Не забудь керамический конденсатор 100 nF между пинами VCC и GND микросхемы как можно ближе к ней: он сглаживает короткие провалы напряжения, когда разом переключается много светодиодов, и предотвращает случайные сбои. Пины SPI своей платы можно проверить в утилите «Распиновка».

Вывод 74HC595Arduino 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–Q7Светодиод + 470 ΩСветодиод + 220 ΩСветодиод + 220 Ω
74HC595 — не мощный драйвер. По даташиту один выход выдерживает не больше 35 mA, а через пин VCC или GND суммарно может течь не больше 70 mA. С популярными в уроках резисторами 220 Ω каждый светодиод при 5 V потребляет 10–13 mA; если горят все восемь, суммарный ток доходит до 80–100 mA, микросхема греется, выходное напряжение падает, и со временем она может выйти из строя. С 470 Ω при 5 V получается около 6 mA на светодиод и примерно 50 mA, когда горят все восемь, а современные светодиоды при таком токе всё равно хорошо видны. Чтобы посчитать номинал самостоятельно, используй утилиту «Резистор для светодиода».

Функция shiftOut() и порядок битов (MSBFIRST / LSBFIRST)

Самый простой способ отправить данные в 74HC595 на Arduino — встроенная функция shiftOut(dataPin, clockPin, bitOrder, value). Она по очереди записывает восемь битов байта value на пин данных и после каждого бита ставит пин тактирования в HIGH, а затем в LOW; 74HC595 принимает бит ровно на этом нарастающем фронте. shiftOut() не трогает пин защёлки, поэтому перед отправкой нужно поставить ST_CP в LOW, а после — в HIGH. Поскольку функция опирается на нарастающие фронты, перед вызовом пин тактирования тоже должен быть в LOW, иначе первый бит может потеряться.

Параметр bitOrder задаёт, с какого конца отправляются биты. Первый отправленный бит после восьми сдвигов оказывается в дальнем конце, на Q7, а последний остаётся на Q0. С MSBFIRST первым идёт старший бит (бит 7), так что каждый бит байта попадает на выход с тем же номером: бит 0 на Q0, бит 7 на Q7. С LSBFIRST порядок обратный: бит 0 появляется на Q7, а бит 7 — на Q0. Все примеры в этом руководстве используют MSBFIRST, поэтому биты числа в коде один в один совпадают с номерами светодиодов. Освежить двоичные числа и запись 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 (симметричный узор)

Шаг за шагом: двоичный счётчик на 8 светодиодах

  1. Поставь 74HC595 поперёк выемки посередине макетной платы, чтобы два ряда ножек оказались по разные стороны. Если непонятно, как макетная плата соединена внутри, сначала прочитай Что такое макетная плата?
  2. Подключи VCC (вывод 16) и MR (вывод 10) к 5V, а GND (вывод 8) и OE (вывод 13) — к GND. Поставь конденсатор 100 nF между VCC и GND.
  3. Подключи DS (14) к D11, SH_CP (11) к D13 и ST_CP (12) к D10.
  4. Длинные ножки восьми светодиодов подключи к выходам Q0–Q7, а короткие — к GND через резисторы 470 Ω. Помни, что Q0 — это вывод 15.
  5. Загрузи код ниже. Светодиоды должны считать от 0 до 255 в двоичном виде; светодиод на Q0 должен мигать быстрее всех, а на Q7 — медленнее всех.
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() и ставит защёлку в HIGH, чтобы разом скопировать их на выходы. Поэтому светодиоды и не мерцают: пока биты сдвигаются, выходы держат прежнее значение. Когда n равно 5 (0b00000101), горят светодиоды на Q0 и Q2; при 200 (0b11001000) — на Q3, Q6 и Q7. На Uno можно заметить, что встроенный светодиод L на D13 слабо мерцает вместе с тактовым сигналом; это нормально и на схему не влияет.

Бегущий огонь и эффект Knight Rider

Светодиоды для проектов на Arduino
Каждый выход 74HC595 управляет одним светодиодом со своим резистором: длинная ножка (анод) идёт к выходу, короткая — к GND через резистор.

Для бегущего огня на каждом шаге достаточно установить в 1 всего один бит. Макрос Arduino bit(i) даёт число, в котором единица только в бите i: bit(0) равно 1, bit(3) — 8, а bit(7) — 128. Код ниже по очереди показывает три эффекта: один светодиод бежит от Q0 к Q7, огни Knight Rider бегают туда-обратно, а полоса постепенно заполняется. Сравнить с классической версией, где светодиоды подключены прямо к пинам, можно в статье Knight Rider и бегущие огни на Arduino; там каждому светодиоду нужен свой пин, а здесь всего хватает 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}

В части Knight Rider прямой цикл идёт от 0 до 6, а обратный — от 7 до 1, чтобы крайние светодиоды не загорались дважды подряд и движение выглядело плавным. В заполняющейся полосе операция |= (побитовое ИЛИ) добавляет новый светодиод, сохраняя предыдущие горящими; на этом основана светодиодная шкала, показывающая значение потенциометра или датчика. Поскольку в коде есть delay(), пока идёт эффект, Arduino больше ничего не может делать. Если хочешь читать кнопку или менять скорость прямо во время эффекта, отсчитывай время через millis(); как это сделать, описано в руководстве millis() и delay().

Цепочка из нескольких 74HC595 (Q7')

Вывод 9 микросхемы, Q7' (QH'), выдаёт бит, который «выталкивается» из сдвигового регистра. Подключи его к входу DS второго 74HC595, и две микросхемы будут вести себя как один 16-битный регистр. Линии SH_CP и ST_CP общие для всех микросхем, так что будь в цепочке три микросхемы или десять, от Arduino по-прежнему идут только 3 провода. Каждый новый отправленный байт проталкивает предыдущий в следующую микросхему. Поэтому первый отправленный байт оказывается в последней микросхеме цепочки, а последний остаётся в первой, подключённой к Arduino. Когда срабатывает защёлка, выходы всех микросхем обновляются одновременно.

ПодключениеМикросхема 1Микросхема 2
DS (14)Arduino D11Q7' (вывод 9) микросхемы 1
SH_CP (11)Arduino D13Arduino D13 (общий)
ST_CP (12)Arduino D10Arduino D10 (общий)
Q7' (9)К выводу DS микросхемы 2Не подключён или к выводу DS микросхемы 3
OE (13) / MR (10)GND / 5VGND / 5V
ВыходыСветодиоды 0–7Светодиоды 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-битное число на два байта. Старший байт отправляется первым, поэтому уходит в последнюю микросхему цепочки и управляет светодиодами 8–15, а младший остаётся в первой микросхеме. Чтобы добавить третью микросхему, просто отправь ещё один байт, снова начиная с самой дальней микросхемы; при многих микросхемах аккуратнее хранить байты в массиве и отправлять их в цикле. Теоретического предела у цепочки нет, но каждая микросхема удлиняет обновление и нагружает общую линию тактирования. В длинных цепочках ставь каждой микросхеме свой конденсатор 100 nF, делай провода тактирования и защёлки короткими, а если линия очень длинная, усиль тактовый сигнал буферной микросхемой вроде 74HC244.

Управление 7-сегментным индикатором через 74HC595

Одноразрядный 7-сегментный индикатор
Одноразрядный 7-сегментный индикатор: сегменты a–g плюс точка (dp) — ровно 8 светодиодов, идеально под 8 выходов 74HC595.

В одноразрядном 7-сегментном индикаторе ровно восемь светодиодов: семь сегментов от a до g и одна точка (dp). Значит, восемь выходов одного 74HC595 идеально подходят для одного разряда. Подключи 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, оператор ~ инвертирует все биты, и та же таблица продолжает работать. Для двухразрядного счётчика добавь в цепочку второй 74HC595 и отправляй сначала узор для дальнего разряда, а затем для ближнего к Arduino. При таком способе у каждого разряда своя микросхема, поэтому мультиплексирование не нужно, индикатор никогда не мерцает, а delay() в loop() не мешает. Для четырёх и более разрядов можно мультиплексировать с двумя 74HC595 или перейти на драйверы TM1637 или MAX7219, которые сами выполняют сканирование.

Быстрое управление через SPI

shiftOut() медленная, потому что записывает каждый бит отдельно через digitalWrite(): на Arduino Uno отправка одного байта занимает около 100 µs. С несколькими светодиодами этого не заметно, но этого не хватит, если нужно обновлять цепочку из 10 микросхем тысячи раз в секунду, программно управлять яркостью светодиодов или сканировать мультиплексированный светодиодный куб. Хорошая новость: протокол 74HC595 — по сути SPI: DS соответствует MOSI, SH_CP — SCK, а ST_CP — пину выбора микросхемы (CS). Аппаратный блок SPI у Uno отправляет байт примерно за 1 µs на 8 MHz; даже с накладными расходами на вызов функции это в десятки раз быстрее, чем 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 D10 должен быть выходом, чтобы аппаратный SPI оставался в режиме ведущего; SPI.begin() уже настраивает это, и поэтому D10 — лучший пин для защёлки. Если в цепочке больше одной микросхемы, просто вызывай SPI.transfer() по разу на каждую микросхему между LOW и HIGH на защёлке. MISO (D12) в этой схеме не используется и остаётся свободным для другого SPI-устройства.

Яркость через OE и очистка через MR

Пин OE (output enable, разрешение выходов) — выключатель, который разом включает или выключает все выходы. Если подключить его не к GND, а к одному из пинов PWM у Uno, например D9, яркость всех светодиодов можно регулировать вместе через PWM. Поскольку OE — активный LOW, логика инвертирована: analogWrite(9, 0) означает полную яркость, а analogWrite(9, 255) — полное выключение. Упростит дело запись analogWrite(9, 255 - brightness) в коде. Этот способ действует на все светодиоды одинаково; чтобы задавать яркость каждого светодиода отдельно, нужно делать это программно быстрыми обновлениями по SPI или перейти на адресные светодиоды вроде WS2812B.

Когда пин MR (master reset, общий сброс) уходит в LOW, все биты сдвигового регистра очищаются, но выходы гаснут не сразу, ведь регистр хранения держит прежнее значение. Чтобы погасить и выходы, нужно, пока MR в LOW, подать нарастающий фронт на пин защёлки. На практике MR подключают прямо к VCC, а очищают программно через write595(0) — это экономит и пин, и провод. Есть ещё проблема при включении: когда подаётся питание, регистр хранения начинается со случайного значения, и светодиоды могут на мгновение загореться вразнобой. На плате реле это может быть опасно; чтобы этого избежать, подтяни OE к VCC резистором 10 kΩ, первым делом в setup() вызови write595(0), а затем переведи пин OE в LOW.

74HC595 с ESP32: 3,3 V и SPI

Пины ESP32 выдают 3,3 V. Если питать 74HC595 от 5 V, чтобы вход засчитал HIGH, нужно около 0,7 × VCC, то есть 3,5 V; 3,3 V не дотягивают до этого порога, и работа становится ненадёжной. Самое чистое решение — питать микросхему тоже от пина 3V3 ESP32, ведь 74HC595 работает от 2 V. Если микросхему обязательно нужно питать от 5 V, используй 74HCT595, у которого входы считают HIGH всё выше 2 V, или поставь между ними преобразователь логических уровней. При 3,3 V резисторы 220 Ω подходят для красных, жёлтых и зелёных светодиодов, а синие и белые, с прямым напряжением около 3 V, при 3,3 V горят очень тускло.

Пример ниже использует пины VSPI у ESP32 (SCK на GPIO 18, MOSI на GPIO 23), чтобы показать эффект Knight Rider на 16 светодиодах, подключённых к двум 74HC595 в цепочке; защёлкой служит GPIO 5. Скорость SPI выставлена на 4 MHz, потому что предел скорости 74HC595 падает вместе с напряжением питания, а 4 MHz оставляют при 3,3 V большой запас. 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}

74HC595 с Raspberry Pi Pico и MicroPython

На Pico 74HC595 тоже питай от пина 3V3(OUT). В MicroPython нет готового аналога shiftOut() из Arduino, но аппаратный SPI легко справляется: используются пины GP18 (SCK) и GP19 (MOSI) блока SPI0, а защёлкой может быть любой GPIO, здесь GP17. MicroPython резервирует под SPI ещё и пин MISO у SPI0 (GP16), поэтому не подключай к нему ничего другого. Если передать в 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 подходят только для небольших токов светодиодов. Не подключай напрямую такие нагрузки, как катушка реле (70–90 mA), небольшой мотор, несколько зуммеров или светодиодная лента на 12 V. Можно поставить за каждым выходом NPN-транзистор или использовать ULN2803, где в одном корпусе восемь транзисторов Дарлингтона: он коммутирует до 500 mA на канал со стороны GND и имеет встроенные защитные диоды для индуктивных нагрузок; чтобы они работали, подключи его пин COM к питанию нагрузки. Решение поаккуратнее — TPIC6B595, который программируется точно так же, как 74HC595, но имеет мощные выходы с открытым стоком: он постоянно держит 150 mA на выход и может коммутировать нагрузки до 50 V. У него 20 выводов, поэтому распиновка другая, а нагрузки подключаются между плюсом питания и выходом.

74HC595, MAX7219 или TM1637?

Параметр74HC595MAX7219TM1637WS2812B
Управляющие пины3 (DS, SH_CP, ST_CP)3 (DIN, CLK, CS)2 (CLK, DIO)1 (DIN)
Выходы8 на микросхему, можно соединять в цепочку64 светодиода (8 разрядов или матрица 8x8)7-сегментный индикатор на 4–6 разрядовКаждый светодиод адресуется отдельно
Ограничение токаРезистор на каждый светодиодОдин резистор (RSET) на все светодиодыВстроено в модульВнутри светодиода
ЯркостьОбщий PWM через OE16 уровней, программно8 уровней256 уровней на цветовой канал
Лучше всего дляСветодиодных шкал, плат реле, выходов общего назначенияСветодиодных матриц, многоразрядных индикаторовЧасов, счётчиковЦветных эффектов, лент

Если нужна простая светодиодная шкала, 8-канальная плата реле или цифровые выходы, каждый из которых делает своё, 74HC595 — самый дешёвый и гибкий выбор. Для светодиодных матриц 8x8 и многоразрядных индикаторов жизнь сильно облегчает MAX7219, который сам занимается мультиплексированием. Если нужен цветной свет с отдельным управлением, светодиоды WS2812B NeoPixel работают на одном пине данных.

Идеи проектов с 74HC595

  • Knight Rider на 16 светодиодах: сделай эффект туда-обратно на двух микросхемах в цепочке и регулируй скорость потенциометром.
  • Светодиодный индикатор уровня: показывай значение датчика или уровень звука на шкале из 8–16 светодиодов.
  • Парктроник: зажигай всё больше светодиодов, от зелёного к красному, по мере того как сокращается расстояние, измеренное HC-SR04.
  • Двухразрядное табло: собери счётчик без мерцания с кнопками на двух 7-сегментных индикаторах и двух микросхемах в цепочке.
  • Двоичные часы: показывай часы, минуты и секунды двоичными числами в столбцах светодиодов, беря время с модуля часов RTC.
  • Светодиодный куб 3x3x3: создавай 3D-анимации, управляя слоями транзисторами, а столбцами — микросхемами 74HC595; подробности в руководстве Светодиодный куб на Arduino.
  • 8-канальная плата реле: управляй восемью реле с 3 пинов через ULN2803 или TPIC6B595.

Частые ошибки и как их исправить

СимптомВероятная причинаРешение
Не горит ни один светодиодOE висит в воздухе или в HIGH, MR застрял в LOWПодключи OE к GND, а MR к VCC
Светодиоды никогда не меняютсяЗащёлка (ST_CP) не срабатывает или подключена не к тому пинуПосле shiftOut() переведи защёлку из LOW в HIGH и проверь номер пина
Светодиоды мерцают при сдвиге или узор сдвинут на один битSH_CP и ST_CP соединены вместе; тогда сдвиговый регистр всегда на один такт опережает регистр храненияИспользуй для защёлки отдельный пин и ставь его в HIGH только после отправки всех байтов
Светодиоды загораются в обратном порядкеПерепутан порядок битов или Q0 не на местеПоменяй MSBFIRST и LSBFIRST и проверь, что Q0 на выводе 15
Микросхемы в цепочке перепутаны или одна отстаёт на шагБайты отправлены не в том порядке, или DS микросхемы 2 подключён к Q7 (вывод 7) вместо Q7'Отправляй сначала байт для дальней микросхемы и подключи DS к выводу 9
Когда горит много светодиодов, все тускнеют, а микросхема греетсяСуммарный ток превышает предел 70 mAИспользуй резисторы 470 Ω–1 kΩ или ULN2803 / TPIC6B595
Светодиоды случайно вспыхивают и меняются, если тронуть проводаНет конденсатора, длинные провода или висящий входДобавь 100 nF между VCC и GND, укороти провода и никогда не оставляй OE или MR висеть в воздухе
С ESP32 или Pico работает ненадёжноМикросхема питается от 5 V, и сигнал 3,3 V не воспринимается как HIGHПитай микросхему от 3V3 или используй 74HCT595
Если схема не работает, упрости код до основ: отправь write595(0b10101010) и посмотри, какие светодиоды загорятся. Если с MSBFIRST горят светодиоды на Q1, Q3, Q5 и Q7, подключение и порядок битов верны. Если не горит ни один, проверь мультиметром: на выводе 16 напряжение питания, на выводе 13 — 0 V, на выводе 10 — снова напряжение питания; если хоть одно из трёх показаний неверно, проблема в подключении.

74HC595 — самый дешёвый и самый поучительный способ решить проблему нехватки пинов. Когда идея «сдвинуть и защёлкнуть» понятна, ты узнаешь её в SPI-устройствах, драйверах светодиодных матриц и модулях дисплеев, а также при чтении кнопок через 74HC165. Начни со счётчика на 8 светодиодах, затем удлини цепочку и переходи на SPI. В приложении BlueGrays есть проекты бегущего огня, Knight Rider, эффекта с регулировкой скорости и счётчика на 7-сегментном индикаторе для Arduino, ESP32 и Raspberry Pi Pico — пошагово, со схемами и кодом.

Частые вопросы

Для чего нужен 74HC595?

74HC595 — сдвиговый регистр, который превращает последовательные данные от микроконтроллера в 8 параллельных выходов. Он позволяет управлять 8 светодиодами, 7-сегментным индикатором или, через транзисторы, реле всего с 3 пинов Arduino. Соединив микросхемы в цепочку, с тех же 3 пинов можно получить 16, 24 и больше выходов.

Сколько 74HC595 можно соединить в цепочку?

Теоретического предела нет: выход Q7' каждой микросхемы подключается к входу DS следующей, а линии тактирования и защёлки общие. На практике предел задают время обновления и нагрузка на общую линию тактирования; на Uno shiftOut() добавляет около 100 µs на микросхему, а с SPI это сокращается до нескольких микросекунд. В длинных цепочках ставь каждой микросхеме конденсатор 100 nF и делай провода короткими.

Какой ток может отдать выход 74HC595?

Даташит гарантирует выходные напряжения при 6 mA на выход; абсолютный предел — 35 mA на выход и всего 70 mA через пин VCC или GND. Поскольку все восемь светодиодов могут гореть одновременно, безопасно рассчитывать на 6–8 mA на светодиод. При 5 V это соответствует резистору около 470 Ω.

Работает ли 74HC595 с ESP32 на 3,3 V?

Да. 74HC595 работает от 2 до 6 V, поэтому его можно питать от пина 3V3 у ESP32 или Pico, и он без проблем читает сигналы 3,3 V. Если питать микросхему от 5 V, сигналы 3,3 V могут не дотянуть до порога HIGH; в таком случае используй 74HCT595 или преобразователь логических уровней.

Что делает пин защёлки у 74HC595?

Пин защёлки (ST_CP или RCLK) — триггер, который копирует сдвинутые в сдвиговый регистр биты на выходы. Пока биты сдвигаются, выходы держат прежнее значение; когда на пин защёлки приходит нарастающий фронт, все восемь выходов обновляются одновременно. Так светодиоды не мерцают во время отправки данных, а все микросхемы цепочки меняются разом.

Может ли 74HC595 управлять реле или мотором?

Напрямую — нет: его выходы подходят только для токов светодиодов в несколько миллиампер. Для реле, моторов или светодиодных лент добавь к каждому выходу транзистор или используй ULN2803, который коммутирует до 500 mA на канал. TPIC6B595, программируемый так же, — мощная альтернатива, держащая 150 mA на выход.

Все проекты
Бегущие огни на светодиодах
#5Средний

Бегущие огни на светодиодах

Огни, которые загораются друг за другом, будто бегут. Arduino зажигает шесть светодиодов по одному; каждый светится короткое мгновение и гаснет, так что свет проходит от начала до конца и начинает сно

4.6(85)
207
Светодиодный эффект Knight Rider
#6Средний

Светодиодный эффект Knight Rider

Классический бегущий огонь-сканер: светящаяся точка скользит от одного края шести светодиодов к другому и возвращается обратно. Arduino зажигает каждый светодиод на десятую долю секунды и переходит к

4.8(106)
202
Бегущие огни с регулируемой скоростью
#7Средний

Бегущие огни с регулируемой скоростью

Шесть светодиодов загораются друг за другом, и кажется, что свет бежит от одного края к другому. Поверни ручку потенциометра, и скорость этого бега сразу меняется: в одну сторону свет мчится, в другую

4.6(72)
146
Светодиодный эффект Knight Rider с регулируемой скоростью
#8Средний

Светодиодный эффект Knight Rider с регулируемой скоростью

Свет бежит от одного края шести светодиодов к другому, разворачивается и бежит обратно. Поверни ручку потенциометра, и скорость этого бега сразу изменится: в одном крайнем положении свет почти летит,

4.5(60)
120
Светодиоды Knight Rider на ESP32
#108Новичок

Светодиоды Knight Rider на ESP32

6 светодиодов по очереди бегают слева направо и справа налево (в стиле Knight Rider). Базовый пример использования циклов for и массивов. Учит логике смены направления.

4.5(19)
32
Бегущие огни на Pico (6 светодиодов)
#153Новичок

Бегущие огни на Pico (6 светодиодов)

Классическая анимация «бегущие огни» на Pico — версия на 6 светодиодов! 6 светодиодов загораются по очереди слева направо — будто свет идёт по ряду. Изучи список Python, генератор списка ([Pin(p, Pin.OUT) for p in LED_PINS]), цикл for с управлением пинами и enumerate(). 6 светодиодов на GP9–GP14, у каждого токоограничивающий резистор 220Ω. Очень чистый код: вместо объявления 6 светодиодов по одному используется список, и можно добавлять светодиоды по числу свободных пинов GPIO.

0.0(0)
8
Цифры 0–9 на семисегментном индикаторе
#41Средний
Premium

Цифры 0–9 на семисегментном индикаторе

Сам выведи те знакомые цифры, которые видишь в лифтах и электронных часах. На индикаторе из семи маленьких светящихся полосок Arduino каждую секунду показывает цифру от 0 до 9, а затем начинает сначал

4.5(30)
43
Числа 0–99 на семисегментном индикаторе
#42Продвинутый
Premium

Числа 0–99 на семисегментном индикаторе

Двухразрядный индикатор из маленьких полосок, как на калькуляторе, считает от 0 до 99. Arduino делит каждое число на единицы и десятки и зажигает нужные полоски из семи в каждом разряде; число растёт

4.5(27)
35