74HC595: подключение к ESP32 и Arduino

Сдвиговый регистр

Три вывода контроллера превращаются в восемь выходов, а цепочка микросхем — в шестнадцать, двадцать четыре и дальше.

Как работает

Биты вдвигаются по одному: уровень на DS (данные) записывается по фронту SHCP (такт сдвига). Когда все восемь на месте, фронт RCLK (защёлка) переносит их на выходы QA–QH разом — светодиоды не мигают, пока идёт сдвиг.

В Arduino это функция shiftOut(DS, SHCP, MSBFIRST, байт) между digitalWrite(RCLK, LOW) и digitalWrite(RCLK, HIGH). Выход QH' соединяют с DS следующей микросхемы — получается каскад.

Выводы

ВыводНазначение
DSвход данных (SER)
QAвыход 0
QBвыход 1
QCвыход 2
QDвыход 3
QEвыход 4
QFвыход 5
QGвыход 6
QHвыход 7
RCLKзащёлка: переносит биты на выходы
SHCPтакт сдвига (SRCLK)
VCCпитание
GNDобщий провод

Подключение к ESP32

74HC595ESP32
DSGPIO23
QAСветодиод led1, вывод A
QBСветодиод led2, вывод A
QCСветодиод led3, вывод A
QDСветодиод led4, вывод A
QEСветодиод led5, вывод A
QFСветодиод led6, вывод A
QGСветодиод led7, вывод A
QHСветодиод led8, вывод A
RCLKGPIO5
SHCPGPIO18
VCC3V3
GNDGND

Схема из примера «Сдвиговый регистр: восемь выходов из трёх проводов».

Сдвиговый регистр: восемь выходов из трёх проводов

Открыть пример целиком
Код скетча
#include <SPI.h>

// Защёлка (RCLK) — обычный вывод: выбором кристалла здесь
// распоряжается скетч, а не контроллер SPI.
const int LATCH = 5;

void writeByte(uint8_t value) {
  digitalWrite(LATCH, LOW);
  SPI.transfer(value);
  digitalWrite(LATCH, HIGH);   // вот здесь байт и попадает на выходы
}

void setup() {
  pinMode(LATCH, OUTPUT);
  digitalWrite(LATCH, HIGH);
  SPI.begin();                 // SCK=18, MISO=19, MOSI=23
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
}

void loop() {
  // Бегущий огонь: старший разряд уходит первым и попадает на QH.
  for (int i = 0; i < 8; i++) {
    writeByte(1 << i);
    delay(120);
  }
  // И встречная волна — заполнение слева направо.
  uint8_t mask = 0;
  for (int i = 0; i < 8; i++) {
    mask |= (1 << i);
    writeByte(mask);
    delay(120);
  }
}

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

74HC595Arduino Uno
DSD11
QAСветодиод led1, вывод A
QBСветодиод led2, вывод A
QCСветодиод led3, вывод A
QDСветодиод led4, вывод A
QEСветодиод led5, вывод A
QFСветодиод led6, вывод A
QGСветодиод led7, вывод A
QHСветодиод led8, вывод A
RCLKD10
SHCPD13
VCC5V
GNDGND

Схема из примера «Arduino Uno: восемь выходов из трёх проводов».

Arduino Uno: восемь выходов из трёх проводов

Открыть пример целиком
Код скетча
#include <SPI.h>

// Восемь светодиодов на трёх проводах.
//
// Регистр принимает байт последовательно и раскладывает его по восьми
// выходам. Выводов у платы это экономит пять, а регистров можно
// поставить цепочкой сколько угодно — каждый следующий добавляет
// восемь выходов и ни одного вывода платы.
//
// Выводы здесь не выбираются. Аппаратный SPI у Uno разведён жёстко:
// MOSI это 11, SCK это 13, а MISO на 12 — регистру он не нужен, тот
// ничего не отвечает. У ESP32 те же роли лежат на 23 и 18, и схема
// оттуда сюда не переносится.
//
// Защёлка (RCLK) — обычный вывод, здесь 10. Пока она внизу, выходы
// держат прошлое значение, сколько бы байтов ни прошло по шине; импульс
// вверх выставляет их разом. Без неё выходы моргали бы промежуточными
// состояниями при каждом сдвиге.

const int LATCH = 10;

void show(byte bits) {
  digitalWrite(LATCH, LOW);
  SPI.transfer(bits);
  digitalWrite(LATCH, HIGH);
}

void setup() {
  pinMode(LATCH, OUTPUT);
  SPI.begin();
  // Регистр быстрый, но провода на макетке — нет. Восьмая доля от
  // 16 МГц — два мегагерца, и это работает на любой сборке.
  SPI.setClockDivider(SPI_CLOCK_DIV8);
  Serial.begin(9600);
}

void loop() {
  // Бегущий огонь: единица едет по разрядам.
  for (int i = 0; i < 8; i++) {
    show(1 << i);
    delay(120);
  }
  // И обратно.
  for (int i = 6; i > 0; i--) {
    show(1 << i);
    delay(120);
  }

  // Двоичный счёт — то, ради чего регистр обычно и ставят: одно число
  // становится состоянием восьми выходов.
  for (int n = 0; n < 16; n++) {
    show(n);
    delay(150);
  }
}

В железе

У настоящей микросхемы есть ещё OE (разрешение выходов — на GND) и MR (сброс — на VCC). Оставленные в воздухе, они дают случайное поведение. И резистор — на каждый светодиод.

Частые ошибки

Другие детали