Шкала из восьми светодиодов съела пины со 2 по 9 — я рассказывал это в уроке про бегущие огни. Через месяц на той же Uno родился проект: та же шкала, четыре кнопки, зуммер и дисплей. Пины кончились на середине макетки, и расчёт был беспощаден: на Uno двадцать линий ввода-вывода, из них на выход пригодны шестнадцать, и четыре уже сидели в A4 и A5 под I2C.
В том уроке я обещал отдельную историю про «пинов мало, выходов надо много» — вот она. 74HC595 — сдвиговый регистр с защёлкой: чип за десятки рублей превращает три линии платы в восемь честных цифровых выходов, каждый — как обычный пин: светодиод и резистор, как в уроке про первый светодиод. Второй чип каскадом — шестнадцать выходов, и проводов от платы всё ещё три: данные просто проталкиваются из первого чипа во второй.
План такой: как чип понимает данные — три линии и импульс защёлки, полная распиновка, shiftOut() и перевернутый байт, каскад, токи и две классические грабли, на которых я оставил два вечера. Симулятор линии SER/SRCLK/RCLK не эмулирует — логику сдвига покажу честно: восемь светодиодов сыграют роль выходов Q0-Q7, а байт в мониторе покажет, что именно уехало на выходы.
Три линии и защёлка: как чип принимает байт
Линии три. SER — данные: сюда бит за битом уезжает байт. SRCLK — такт сдвига: каждый импульс проталкивает биты на позицию дальше, восемь импульсов — байт сидит внутри регистра. RCLK — защёлка: один импульс копирует внутреннее состояние разом на выходы Q0-Q7. Пока защёлка закрыта, выходы заморожены, и глаз не видит, как байты ползут внутрь.
Защёлку я сначала считал перестраховкой и вешал RCLK вечно в HIGH — выходы обновлялись на глазах: восемь огней ползли по линейке с рябью, как бегущая волна из плохого кино. Неделю я думал, что так и надо, пока не увидел в чужом проекте ту же схему с рваными импульсами и мгновенной картинкой. Порядок всегда один: LOW на защёлке, сдвиг байта, HIGH на защёлке — выходы меняются одним кадром.
На анимации цена ошибки видна лучше всего. Пока защёлка открыта, каждый такт SRCLK выталкивает промежуточную картинку на выходы: у бегущего огонька восемь положений, и зритель видит все восемь подряд — вместо чистого прыжка на соседний светодиод глаз ловит рябь из полусостояний, и «бегущий огонёк» превращается в мигающую кашу. При кадре в 120 миллисекунд это восемь ложных вспышек на каждый настоящий. С закрытой защёлкой промежуточные положения живут только внутри чипа, и на выходы выходит ровно один кадр за один импульс RCLK.
Две служебные ножки держите в проводе всегда: MR (master reset, ножка 10) активна при нуле, поэтому тянем к 5 В — иначе чип вечно сброшен и молчит при безупречном скетче. OE (output enable, ножка 13) включает выходы при нуле — тянем к земле. Перепутаете MR с землёй — полвечера будете искать граблю в коде, которой там нет.
OE я редко оставляю просто в земле: повесьте ножку 13 на ШИМ-выход платы — и analogWrite станет общим диммером всех восьми светодиодов. Выходы включены при нуле на OE, поэтому значение 0 даёт полную яркость, 200 — шкала едва светится, 255 — всё погасло; один пин вместо восьми отдельных регулировок. MR держу как аварийный гаситель: короткий ноль на ножке 10 стирает регистр целиком, и все выходы падают в ноль быстрее, чем слать нулевой байт через shiftOut. Обе ножки требуют только провода — ни библиотек, ни лишних пинов.
| Ножки | Имя | Куда и зачем |
|---|---|---|
| 16 и 8 | VCC и GND | 5 В и земля платы; ток через GND считайте на все выходы сразу |
| 14 | SER | данные: бит за битом с тактом SRCLK — любой цифровой пин |
| 11 и 12 | SRCLK и RCLK | такт сдвига и такт защёлки — два разных импульса, не путать |
| 15 и 1-7 | Q0-Q7 | восемь выходов: светодиод и резистор 220-330 Ом на каждый |
| 9 | QH* | каскад: бит, вытолкнутый наружу, — на SER следующего чипа |
| 10 и 13 | MR и OE | MR к 5 В (не сбрасывать), OE к GND (выходы включены) |
// Плата — 74HC595: DATA на D11 (SER), CLOCK на D12 (SRCLK),// LATCH на D8 (RCLK). MR чипа — к 5 В, OE — к GND.const int PIN_DATA = 11;const int PIN_CLOCK = 12;const int PIN_LATCH = 8; void vyvestiBait(byte b) { digitalWrite(PIN_LATCH, LOW); // выходы заморожены shiftOut(PIN_DATA, PIN_CLOCK, MSBFIRST, b); // байт уходит внутрь digitalWrite(PIN_LATCH, HIGH); // разом на Q0-Q7} void setup() { pinMode(PIN_DATA, OUTPUT); pinMode(PIN_CLOCK, OUTPUT); pinMode(PIN_LATCH, OUTPUT); Serial.begin(9600);} void loop() { byte ogonek = 0b00000001; for (int i = 0; i < 8; i = i + 1) { vyvestiBait(ogonek); ogonek = ogonek << 1; // сдвиг влево: огонь едет к Q7 delay(120); } for (int i = 0; i < 8; i = i + 1) { ogonek = ogonek >> 1; // обратно к Q0 vyvestiBait(ogonek); delay(120); }}Функция vyvestiBait() — своя, по правилам урока про свои функции: один вход, три строки внутри, ноль копипасты. shiftOut сам ведёт такт и данные: восемь импульсов SRCLK с битами на SER, порядок — MSBFIRST, старший бит уходит первым. Скорость сдвига не важна: такт хоть с delay(1) между импульсами, светодиодам всё равно — защёлка всё равно покажет картинку одним кадром.
Каскад — то, ради чего чип и любят. Ножка QH* — это не девятый выход, а хвост сдвига: бит, который вытолкнули из восьмёрки. Соедините QH* первого чипа с SER второго — и получится шестнадцать выходов на тех же трёх пинах: shiftOut дважды, затем один импульс защёлки, оба чипа обновляются одновременно. Третий и четвёртый чипы едут тем же поездом — проводов по-прежнему три.
В каскаде байты едут поездом, и порядок отправки запоминается просто: первым шлём байт дальнему чипу. Первые восемь тактов проталкивают его сквозь первый регистр, и по пути он целиком переезжает во второй по QH*; вторые восемь — оседают в первом. Перепутаете порядок — картинка поменяется чипами: огонь перелезет с одной шкалы на другую, а вы будете проверять провода, хотя лечится перестановкой двух строк shiftOut. Защёлка при этом одна на оба корпуса: пара shiftOut, один импульс RCLK — и оба чипа показывают новый кадр одновременно, рассинхрон между ними не случается физически.
Когда выходов нужны сотни и каждому положен свой цвет, это уже адресные ленты: первый урок про FastLED — один пин, сотни пикселей. 74HC595 остаётся нишевым, но железным инструментом: копеечный, без библиотек, и каждый выход у него честный токовый. Если же пинов не хватает и на входы — смотрите в сторону PCF8574: расширитель на шине I2C с двусторонними линиями.
Порядок битов — главная путаница этого чипа. При MSBFIRST первым уезжает старший бит, и он приезжает в дальний конец: бит номер 7 садится на Q7, бит номер 0 — на Q0, картинка совпадает с интуицией. При LSBFIRST всё зеркально: байт переворачивается, огонь бежит в обратную сторону, а вы сверяете схему с даташитом. Массив пинов в симуляторе выше — та же привычка, что в уроке про массивы и журнал: данные отдельно от логики.
Байт для выхода собирается сдвигами: единица в позиции i — это 1 сдвинутый на i разрядов, приёмы разобраны в уроке про битовые операции. Если огни побежали не туда — лечится константой в shiftOut, а не паяльником: я меняю MSBFIRST на LSBFIRST за пять секунд и смотрю на линейку, а не перепаиваю провод.
- 1. Сколько проводов от платы к двум каскадированным 74HC595?
- 2. Что делает импульс RCLK?
- 3. Байт выведен с LSBFIRST вместо нужного MSBFIRST. Что увидите на шкале?
- 4. Почему нельзя повесить восемь светодиодов по 20 мА на один 74HC595?
- 5. Зачем защёлку держат LOW на время shiftOut?
- Три линии SER, SRCLK, RCLK дают восемь выходов; два чипа каскадом — шестнадцать, проводов всё ещё три
- Порядок всегда один: LOW на защёлке, shiftOut(data, clock, MSBFIRST, байт), HIGH на защёлке — выходы меняются одним кадром
- MR тянут к 5 В, OE — к GND: без этого чип молчит или сброшен при идеальном скетче
- MSBFIRST и LSBFIRST перепутаны — байт зеркалится и огни бегут задом наперёд; лечится константой, не паяльником
- Ток: 20 мА — абсолютный максимум выхода, комфорт 6-10 мА; через ножку GND считайте все выходы вместе, резистор на каждый светодиод обязателен
Такт, данные, защёлка: протолкни байт по одному биту и поймай разницу MSBFIRST против LSBFIRST.
Подгружаем интерактив…
Частые вопросы по теме урока
- Сколько проводов от платы к двум каскадированным 74HC595?
- SER второго чипа питается от QH* первого, такт и защёлка общие. Сдвинули два байта, щёлкнули защёлкой один раз — оба чипа обновились одновременно. три: DATA, CLOCK и LATCH — данные едут из чипа в чип через QH*
- Что делает импульс RCLK?
- RCLK — защёлка: один импульс выносит собранный байт на выходы одним кадром. Без неё огни ползут по выходам на глазах в момент сдвига. копирует внутреннее состояние регистра разом на выходы Q0-Q7
- Байт выведен с LSBFIRST вместо нужного MSBFIRST. Что увидите на шкале?
- Порядок битов переворачивает байт: то, что должно сесть на Q0, садится на Q7. Лечение — константа в shiftOut, паяльник не нужен. зеркальную картинку: огонь бежит в обратную сторону
- Почему нельзя повесить восемь светодиодов по 20 мА на один 74HC595?
- По отдельности выход держит до 20 мА, но общий ток через GND-ножку — порядка 70 мА. 160 мА через одну ножку греют кристалл до смерти; резисторы 330-470 Ом обязательны. суммарный ток через ножку GND ограничен примерно 70 мА на корпус
- Зачем защёлку держат LOW на время shiftOut?
- Пока защёлка закрыта, выходы заморожены и ползущий по регистру байт на них не попадает. Импульс RCLK после сдвига показывает готовую картинку целиком. чтобы глаз не видел ползущий сдвиг: выходы обновятся одним кадром