Сдвиговый регистр 74HC595 или увеличение выходов Arduino с минимальными затратами

  • Цена: $1,62 за 20 штук

Этот обзор посвящен, собственно, начинающим пользователям Arduino или желающим приобщиться к этому делу. Речь пойдёт об увеличении количества выходов микроконтроллера при помощи сдвигового регистра, причём что это не требует больших затрат (по сравнению с покупкой Arduino Mega, например). Самое простое применение — помигать светодиодами, вот и попробуем это на практике.

Когда начинал знакомство с микроконтроллерами (собственно и сейчас всё ещё продолжаю «начинать знакомиться»), один из первых вопросов был: как же имея всего десяток выходов на контроллере управлять той же сотней, тысячей светодиодов? Да, можно использовать мультиплексирование сигнала, встречное включение и множество других ухищрений, но всё равно максимальное количество подключаемых светодиодов ограничено, и необходимо искать другое решение. И подсказали мне один из вариантов — «возьми одну, две, десяток микросхем сдвиговых регистров и развлекайся». Было решено сразу же их заказать, а в перспективе даже собрать светодиодный куб с их применением. От последнего правда пришлось отказаться, нашёл более простой вариант, но это — тема другого обзора.
Заказал сразу 20 штук 74HC595N, благо стоят сущие копейки. Буква N в конце маркировки обозначает, что микросхема в корпусе DIP-16, очень удобно для экспериментов на макетной плате, ничего даже паять не надо. Выглядит вот так:


Что же собой представляет эта микросхема? Это восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе.
Проще говоря, используя всего 3 выхода контроллера можно управлять 8 выходами сдвигового регистра. А если микросхемы соединить последовательно друг за другом, то количество контролируемых выходов можно наращивать до любого разумного предела (не нашёл предельного количества, но сотнями вроде как объединяются без проблем; если кто знает, от чего зависит предельное количество включенных в каскад микросхем — интересно было бы узнать в комментариях).
Данные к микросхеме передаются последовательно. Биты 0 и 1 передаются в регистр друг за другом, считывание битов происходит при поступлении синхроимпульса. Передал 8 бит — получил 8 выходных состояний на выходах регистра. При каскадном включении 74HC595 (при необходимости получения 16, 24 и т.д. выходов) данные от первого регистра передаются к следующему.
Выход регистра может находиться не только в состоянии логических 0 или 1, но и быть в высокоимпедансном состоянии, когда выход отключен от схемы. В это состояние могут быть переведены только все выходы сразу. Это редко используется, но может быть полезно при переключении управления на другой контроллер, например.

Распиновка входов/выходов

Q0…Q7 – выходы регистра, могут быть в состоянии 0, 1 или высокоимпедансном
GND – земля
Q7′ – выход для последовательного соединения регистров.
MR – сброс значений регистра
SH_CP – вход тактовых импульсов
ST_CP – вход «защёлкивающий» данные
OE – вход переводящий выходы из высокоимпедансного в рабочее состояние
DS – вход данных
VCC – питание 2-6 вольт

Остаётся проверить работу, для этого соберем популярную среди новичков схему. GND (пин 8) подключаем на землю, Vcc (пин 16) к питанию 5В, OE (пин 13) на землю, MR (пин 10) к питанию 5В. Теперь к сдвиговому регистру подключено питание и все выходы активны. Теперь время подключить микросхему к Arduino: вход данных DS (пин 14) подключим к 9-ому цифровому выходу ардуино, вход тактовых импульсов SH_CP (пин 11) к 10-ому цифровому выходу, вход-защелку ST_CP (пин 12) к 8-ому пину ардуино. Между землёй и защелкой рекомендуется поставить конденсатор на 0,1 мкФ для минимизации шумов.
Осталось подключить светодиоды — через резисторы 150-300 Ом подключаем их от выходов регистра к земле. Собственно и всё. Вот нашёл схему, кто любит наглядные материалы (обратите внимание, распиновка реальной микросхемы и схематическое изображение на данной схеме различаются!)

Собрал схему на макетной плате, у меня получилось вот так.
собранная схема




В ардуино удобно воспользоваться функцией shiftOut(), которая выводит байт информации на порт вход/выхода последовательно (побитно). Почитать можно тут. Загружаем тестовый код в Arduino и получаем счётчик от 0 до 255 в двоичном виде:

int latchPin = 8; //ST_CP
int clockPin = 10; //SH_CP
int dataPin = 9; //DS

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // установка синхронизации "защелки" на LOW
    digitalWrite(latchPin, LOW);
    // передаем последовательно на вход данных
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay); 
     //"защелкиваем" регистр, устанавливаем значения на выходах
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
}

Вот так получилось у меня, всё работает как положено:

Таким образом, при минимальном использовании пинов контроллера можно управлять большим количеством светодиодов (или ещё чем-нибудь). Всё бы хорошо, но расскажу и о недостатках. Как видим, ток для каждого светодиода необходимо ограничивать резистором, и при построении больших светодиодных матриц это становится достаточно трудоёмко. Есть более интересное решение для управления светодиодами — драйвер DM13A, который представляет собой сдвиговый регистр, при этом ещё и ограничивает ток на каждом выходе. Про него расскажу в следующий раз, а в качестве бонуса — тот самый мой первый LED куб, 5x5x5, собранный на упрощенной элементной базе, уже без применения 74HC595.
Планирую купить +38 Добавить в избранное +35 +61
+
avatar
  • ksiman
  • 22 октября 2015, 10:42
+4
если кто знает, от чего зависит предельное количество включенных в каскад микросхем — интересно было бы узнать в комментариях).
Предельное число регистров ограничивается требуемой скоростью обновления информации и объёмом кода
+
avatar
  • Aloha_
  • 22 октября 2015, 10:47
+1
ВВ55 и на нее уже цеплять регистры — вот это будет бомба один контроллер — управляет сотнями устройств, лишь бы мозгов хватило.
+
avatar
  • ksiman
  • 22 октября 2015, 10:51
0
тоже вариант
+
avatar
  • Last_One
  • 22 октября 2015, 11:54
+4
Я правильно понимаю, что обзор написан на базе вот этой статьи:
arduino.ru/Tutorial/registr_74HC595

Тогда уж в обзор добавили бы и вариант каскадного подключения, что бы не нужно было искать эту статью в интернете :-)
+
avatar
  • lesha_01
  • 22 октября 2015, 12:30
0
соберу вариант каскадного включения — дополню :)
+
avatar
  • lesha_01
  • 22 октября 2015, 11:01
0
то есть расчётным путём получаем максимальное количество для конкретной задачи, других ограничений не имеется?
+
avatar
  • Aloha_
  • 22 октября 2015, 11:09
+1
Если вам надо много а скорости мозгов не хватает, то попробуйте КР1533ИР9 — Аналог SN74ALS165 представляет собой восьмиразрядный сдвиговый регистр с параллельной записью и имеет два режима работы: параллельная загрузка и сдвиг. Те же 16 ног. При необходимости можно динамически переключиться на параллельную запись с экономией по тактам.
+
avatar
0
Клок ведь для каждой следующей ступени нужен отдельный? Выставили на первой ступени восемь бит данных, дрыгнули ногой синхронизации второй ступени — биты ушли во вторую ступень. Значит количество ступеней таки ограничено количеством ног? Или я неправильно понимаю?
+
avatar
  • Serg32
  • 22 октября 2015, 11:30
0
Зачем? Регистры подключаются последовательно, клок идет на все сразу.
+
avatar
0
Действительно, что-то я чрезмерно все усложнил.
+
avatar
  • galaober
  • 22 октября 2015, 16:11
0
И нагрузочной способность выходов контроллера, к которым подключаются регистры (SH_CP, ST_CP), а так же паразитными интуктивностями и ёмкостями, но это уже больше касается скорости обновления дааных.
+
avatar
  • wcat
  • 19 декабря 2015, 00:00
0
Hi!
А кто нам мешает подклить параллельный регистр? :-)
Тот же ИР23 в КМОП исполнении (74hc374). Можно и ИР22 (74hc373) подцепить и его же в качестве буфера использовать ;-)
Если кого смущает нагрузочная способность — буферни выходА :-)
А если LCD к платке подключен — вешай ИР34 (74hc873) на те же выходы сколько угодно, только стробировать не забывай!
А вот со сдвиговым регистром легко наступить на «грабли» с пробеганием битов и ложными срабатываниями, т.е. надо вешать те же «защелки» на «критичные» выходы…

Btw, сдвиговый регистр я еще в прошлом веке :-D подключал к 51-му — на плате с LCD и кнопками по SPI. Для опроса клавиатуры с платы тяенется всего одна веревка и вешается на вход прерывания. На нее вешай сколько угодно кнопок и подтяни к питанию, для ожидания обнули шифтер, а по прерыванию опрашивай через SPI ;-)
Yours sincerely, Dmitry aka wcat
+
avatar
  • Aloha_
  • 22 октября 2015, 10:45
+2
А почему не дешифратор или не счетчик? Или регистр защелка? Еще столько обзоров можно написать... Жаль большинство аудитории не поймет о чем речь.
Кстати для управления матрицей светодиодов можно использовать MAX7219 переходите на более высокий уровень.
+
avatar
  • ksiman
  • 22 октября 2015, 10:47
0
А почему не дешифратор
В данном случае неприменим
или не счетчик?
В данном случае неудобен
Или регистр защелка?
Менее эффективен с т.з. кол-ва используемых портов
+
avatar
  • Aloha_
  • 22 октября 2015, 10:49
0
и при построении больших светодиодных матриц это — почему бы и нет — динамическую индикацию никто не отменял. У сдвигового регистра уж больно производительность падает при масштабировании.
+
avatar
  • DDimann
  • 22 октября 2015, 10:54
0
динамическую индикацию никто не отменял
Никто, но не следует забывать, что и яркость при этом упадет.
Ну, если не ставить D-триггер перед каждым светодиодом.
+
avatar
  • Aloha_
  • 22 октября 2015, 10:58
0
А если все же использовать регистры защелки, то можно и память нарастить внешнюю прилично с экономией по выводам. я на х51 по крайней мере так и делал. С Arduino к сожалению не сталкивался, организацию внутреннюю не знаю.
+
avatar
  • DDimann
  • 22 октября 2015, 11:58
0
А кто спорит? Можно вообще ПЛИС поставить и зашить в ней любую логику.
Все зависит от задачи.

… все знают, что 2И-НЕ/2ИЛИ-НЕ — достаточный элемент для реализации логики любой сложности, но мало кто это делает.
То же и тут — надо смотреть, что хочется, и соответственно делать.
+
avatar
0
В данном случае неприменим
Два восьми светодиодов вполне себе применим. Те же три ноги потребуются. Для куба 5х5х5 уже да, сложновато.
+
avatar
  • ksiman
  • 22 октября 2015, 10:46
0
Ещё можно добавить, что подобным образом ножно и входы размножать :)
+
avatar
  • lesha_01
  • 22 октября 2015, 10:50
0
ни разу не пользовался этой возможностью, но она имеется, да)
+
avatar
0
Входы-кнопки или входы цифровые? Для цифровых входов нужен P2S, а это же S2P.
+
avatar
  • mooni73
  • 22 октября 2015, 10:47
+1
Мне казалось, что массовое управление (рой) удобнее делать по 2 проводам, с дешифратором на каждом диоде?
+
avatar
  • DDimann
  • 22 октября 2015, 10:56
+1
WS8212 — и ничего делать уже не надо. :)
+
avatar
  • ksiman
  • 22 октября 2015, 10:59
0
Это частный случай, выходы не только «поморгать» используются
+
avatar
+1
Сорвали с языка. Если просто светить лампочками, то лучше WS8211 и т.п. еще ничего не придумали.
+
avatar
  • lesha_01
  • 22 октября 2015, 11:33
0
5-вольтовая лента с ними — очень хорошая штука. А есть ли обычные 3-5 мм светодиоды со встроенными WS8211/WS8212?
+
avatar
  • DDimann
  • 22 октября 2015, 12:12
0
5050 — точно есть, а этих не встречал…
+
avatar
  • DDimann
  • 22 октября 2015, 14:19
0
Ну, я много чего не встречал…
Раз и два
А вот что бы вмонтированы прямо при сборке, возле кристалла, в линзе — не встречал…
+
avatar
  • lesha_01
  • 22 октября 2015, 14:28
0
Такие варианты знаю. Просто было бы удобно паять матрицы какой угодно формы, хотя думаю возникли бы уже проблемы с быстродействием.
+
avatar
  • DDimann
  • 22 октября 2015, 15:10
0
Тогда не пойму — почему не это?
А быстродействие…
Никто ведь не заставляет делать одну линии на 1024 светодиода — можно сделать 4 по 256, к примеру.
Это если имеется в виду быстродействие именно светодиодов, время распространения сигнала.
Если про контролер — то тут только выбирать контролер пошустрее, оптимизировать программу…
+
avatar
  • lesha_01
  • 22 октября 2015, 15:30
0
В объёмной матрице 5050 выглядят не столь интересно, а для двухмерной, согласен, самое то. И по цене класс!
+
avatar
+2
Есть
ebay.com/itm/171940438323:g:mGUAAOSw37tV~XGV
ebay.com/itm/262091817958:m:mPR7slAO61AISasHic6yjRA
+
avatar
  • lesha_01
  • 22 октября 2015, 14:44
0
ого, здорово, на пробу десяток можно взять. для большего — цена конечно заоблачная
+
avatar
  • sshumov
  • 23 октября 2015, 15:55
0
Есть WS2801 — а светодиоды уже можете сами подключить какие пожелаете.
+
avatar
  • Yaguar
  • 22 октября 2015, 10:49
+2
В последнее время Mysku как будто следит за моими мыслями. Все угадывает ))). Спасибо обзорщикам ) за обзор конечно +
+
avatar
  • viperet
  • 22 октября 2015, 10:52
0
Чуть более дорогой вариант max7219, но имеет преимущества — 1 микросхема может управлять матрицей 8х8 светодиодов, для нее нужен всего 1 резистор, позволяет управлять общей яркостью. Их тоже можно подключать каскадно и всего 3 управляющих сигнала.
А если использовать DM633 — то можно управлять яркостью каждого светодиода отдельно, на них делают подсветку Lightpack.
+
avatar
  • galaober
  • 22 октября 2015, 16:25
0
Не совсем оно, но тоже 16-канальній PWM с возможностью каскадирования — TLC5940. Библиотеку для работы брал alex.kathack.com/codes/tlc5940arduino/index.html
+
avatar
  • kirich
  • 22 октября 2015, 10:56
+2
Тоже получил такие микрухи, правда весьма оригинальным образом, думал даже обзор запилить, но передумал.
Увидел обзор, сразу вспомнился этот заказ.
Картинка из серии — ожидание и реальность :)))
+
avatar
  • lesha_01
  • 22 октября 2015, 10:57
0
весьма достойная замена :)
+
avatar
  • DDimann
  • 22 октября 2015, 11:00
0
Мдя уж…
Это мне напомнило, как я заказал набор из 10 цанг для дремеля, а получил 10 ватных тампонов для него же…
И фото в вопросе продавцу выглядело примерно так же. :)
+
avatar
  • ksiman
  • 22 октября 2015, 11:01
0
Не очень понял, прислали один вместо 20?
и что не так с 595?
+
avatar
  • kirich
  • 22 октября 2015, 11:02
0
Картинка из спора с продавцом.
Только фото ожидание и реальность надо поменять местами.
Пришло — заказывал. Там вообще на английском подписано.

прислали один вместо 20?
Заказывал 20 мощных транзисторов, пришло две маломощных микрухи :)))
Причем заметьте, шло с треком.

и что не так с 595?
Кто то обзоры во сне пишет, а кто то комментарии ;)
+
avatar
0
А, суть в том, что это «Оригинальный способ» получения товара, теперь понятно :-)
+
avatar
0
Есть какой-то скрытый смысл, а то я не понял?
+
avatar
  • BShadow
  • 22 октября 2015, 11:02
0
Вполне возможно, что кто-то получил наоборот :-)
+
avatar
  • kirich
  • 22 октября 2015, 11:11
0
Причем вполне возможно что в итоге этот заказ тоже валяется в ящике стола.
Оно как бы не то что совсем бесполезное, и то и другое может пригодится, но одно другое не заменяет, потому смысл почти нулевой. Вроде и выкинуть рука не поднимается, и не применяю их в жизни.
+
avatar
0
вы бы в цене написали, что за 20 — меньше икаться будет. В обзоре есть, но лучше сразу народ не пугать.
+
avatar
  • lesha_01
  • 22 октября 2015, 11:09
0
поправил, спасибо!
+
avatar
  • drv
  • 22 октября 2015, 11:11
0
Также какое-то время использовал регистры, но на последних проектах перешел на PCF8574, раз в 5 дороже чем вариант с регистрами, но оказалось намного удобней. И гибкость и масштабируемость на уровне. Может кому пригодится. Но как говорится, всё под свои задачи :)
+
avatar
  • AFCrio
  • 22 октября 2015, 22:36
0
Дороговато, на ali есть $4.20 за те-же 20 шт.
+
avatar
  • drv
  • 22 октября 2015, 22:56
0
К сожалению, когда искал, не видел за такую цену в DIP-корпусе.
+
avatar
  • DDimann
  • 22 октября 2015, 11:15
+1
За обзор плюс.
Вот еще бы в заголовке возле стоимости написать, что цена — за 10 штук, а то так и до инфаркта не далеко от таких цен. :)

Припоминая старые времена и глядя на графическое обозначение микросхемы я понял, что у меня нормоконтроль такую схему не пропустил бы.
Вот что то вроде этого — пропустил бы.
И когда схема становится достаточно большой, все таки ее читать заметно легче.
+
avatar
  • lesha_01
  • 22 октября 2015, 11:21
0
Делал RGB куб в качестве дипломного проекта — тоже мучили по этому поводу :)
+
avatar
  • Zhenya88
  • 22 октября 2015, 11:35
+3
У меня дипломный проект звучал, как «Проект 9ти этажного многоквартирного жилого дома с двухуровневой подземной стоянкой»… а у вас кубик… странное оно, образование в РФ. =)
+
avatar
  • megased
  • 22 октября 2015, 11:56
0
Извините, не хочу обидеть проектировщиков, но за свою работу видел столько мерворожденных проектов, которые разбиваются о реальные агрегаты и сооружения.
Вполне неплохой проект реальной установки, хотя ваш диплом тоже думаю был хорош. Проект он на бумаге, а она как известно «Все стерпит». А подай на микру неправильное напряжение, из нее выйдет волшебный дым и все перестанет работать.
+
avatar
  • DDimann
  • 22 октября 2015, 12:17
0
… а у меня звучало что то вроде «Процессор быстрого преобразования Фурье»
Правда, был этот процессор собран на двух платах 170х220 мм…
+
avatar
  • lesha_01
  • 22 октября 2015, 12:33
0
ну разница наверное в том, что проект проектом, а я всё же ещё по нему собрал полностью рабочий макет, с подробной документацией :)
+
avatar
0
+
avatar
  • Jimrus
  • 23 октября 2015, 21:13
0
они в SOP-16
+
avatar
+1
Альтернатива сдвиговым регистрам и возросшая мощь ). Точно так же работает под ардуино.
aliexpress.com/item/STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-Arduin0/1568685935.html
Есть и с большим кол-вом ног.
+
avatar
  • lesha_01
  • 23 октября 2015, 09:12
0
Может есть ссылка почитать про возможности этой штуковины?
+
avatar
+1
Это копия Maple Mini.
Вот на русском вводная статейка
www.hobbylab.ru/robototechnics/1292/

Но этот Maple IDE никому не сдался и к Arduino IDE была прикручена поддержка этих плат.
Инструкция по установке
github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Installation

Вот форум (на английском)
stm32duino.com/
+
avatar
  • lesha_01
  • 23 октября 2015, 17:15
0
спасибо, почитаем
+
avatar
  • vismyk
  • 23 октября 2015, 09:06
0
74HC595 на всякий случай покупал, теперь благодаря этому обзору стало понятнее на что они годятся. ;) Ещё прикупил вот такой мультиплексор, он вроде бы в обе стороны работает и хоть с цифрой, хоть с аналогом. Но тоже пока не опробованный, хотя идея о его применении есть, как раз на 16 PWM-портов…
+
avatar
  • LLIHYP
  • 24 декабря 2015, 21:34
0
Добрый день. Хотелось бы подробнее узнать про драйвер DM13A. И еще больше интереса представляет Ваш LED куб! Как реализовано? Только начал изучать Arduino вопросов много, а ответов не могу найти:(
+
avatar
  • lesha_01
  • 25 декабря 2015, 09:33
0
С драйвером всё просто: он представляет собой сдвиговый регистр с 16 выходами, причём ток на выходе задаётся всего лишь одним резистором. То есть в случае со светодиодами это очень удобно, не нужно на каждый по отдельности ставить токоограничивающий резистор. Более подробная информация есть в даташите: e-neon.ru/user_img/catalog_datasheets/dm13a-a.003.pdf
Что касается куба, то вот пожалуйста проект готовый, разве что на PIC микроконтроллере: picprojects.org.uk/projects/lc/index.htm
+
avatar
  • LLIHYP
  • 25 декабря 2015, 21:17
0
Спасибо большое!