Сдвиговый регистр 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 в двоичном виде:
Вот так получилось у меня, всё работает как положено:
Таким образом, при минимальном использовании пинов контроллера можно управлять большим количеством светодиодов (или ещё чем-нибудь). Всё бы хорошо, но расскажу и о недостатках. Как видим, ток для каждого светодиода необходимо ограничивать резистором, и при построении больших светодиодных матриц это становится достаточно трудоёмко. Есть более интересное решение для управления светодиодами — драйвер DM13A, который представляет собой сдвиговый регистр, при этом ещё и ограничивает ток на каждом выходе. Про него расскажу в следующий раз, а в качестве бонуса — тот самый мой первый LED куб, 5x5x5, собранный на упрощенной элементной базе, уже без применения 74HC595.
Когда начинал знакомство с микроконтроллерами (собственно и сейчас всё ещё продолжаю «начинать знакомиться»), один из первых вопросов был: как же имея всего десяток выходов на контроллере управлять той же сотней, тысячей светодиодов? Да, можно использовать мультиплексирование сигнала, встречное включение и множество других ухищрений, но всё равно максимальное количество подключаемых светодиодов ограничено, и необходимо искать другое решение. И подсказали мне один из вариантов — «возьми одну, две, десяток микросхем сдвиговых регистров и развлекайся». Было решено сразу же их заказать, а в перспективе даже собрать светодиодный куб с их применением. От последнего правда пришлось отказаться, нашёл более простой вариант, но это — тема другого обзора.
Заказал сразу 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.
Самые обсуждаемые обзоры
+71 |
3340
133
|
+51 |
3545
66
|
+29 |
2535
48
|
+38 |
2871
41
|
+55 |
2043
37
|
arduino.ru/Tutorial/registr_74HC595
Тогда уж в обзор добавили бы и вариант каскадного подключения, что бы не нужно было искать эту статью в интернете :-)
А кто нам мешает подклить параллельный регистр? :-)
Тот же ИР23 в КМОП исполнении (74hc374). Можно и ИР22 (74hc373) подцепить и его же в качестве буфера использовать ;-)
Если кого смущает нагрузочная способность — буферни выходА :-)
А если LCD к платке подключен — вешай ИР34 (74hc873) на те же выходы сколько угодно, только стробировать не забывай!
А вот со сдвиговым регистром легко наступить на «грабли» с пробеганием битов и ложными срабатываниями, т.е. надо вешать те же «защелки» на «критичные» выходы…
Btw, сдвиговый регистр я еще в прошлом веке :-D подключал к 51-му — на плате с LCD и кнопками по SPI. Для опроса клавиатуры с платы тяенется всего одна веревка и вешается на вход прерывания. На нее вешай сколько угодно кнопок и подтяни к питанию, для ожидания обнули шифтер, а по прерыванию опрашивай через SPI ;-)
Yours sincerely, Dmitry aka wcat
Кстати для управления матрицей светодиодов можно использовать MAX7219 переходите на более высокий уровень.
В данном случае неудобен
Менее эффективен с т.з. кол-ва используемых портов
Ну, если не ставить D-триггер перед каждым светодиодом.
Все зависит от задачи.
… все знают, что 2И-НЕ/2ИЛИ-НЕ — достаточный элемент для реализации логики любой сложности, но мало кто это делает.
То же и тут — надо смотреть, что хочется, и соответственно делать.
Раз и два
А вот что бы вмонтированы прямо при сборке, возле кристалла, в линзе — не встречал…
А быстродействие…
Никто ведь не заставляет делать одну линии на 1024 светодиода — можно сделать 4 по 256, к примеру.
Это если имеется в виду быстродействие именно светодиодов, время распространения сигнала.
Если про контролер — то тут только выбирать контролер пошустрее, оптимизировать программу…
ebay.com/itm/171940438323~XGV
ebay.com/itm/262091817958
А если использовать DM633 — то можно управлять яркостью каждого светодиода отдельно, на них делают подсветку Lightpack.
Увидел обзор, сразу вспомнился этот заказ.
Картинка из серии — ожидание и реальность :)))
Это мне напомнило, как я заказал набор из 10 цанг для дремеля, а получил 10 ватных тампонов для него же…
И фото в вопросе продавцу выглядело примерно так же. :)
и что не так с 595?
Только фото ожидание и реальность надо поменять местами.
Пришло — заказывал. Там вообще на английском подписано.
Заказывал 20 мощных транзисторов, пришло две маломощных микрухи :)))
Причем заметьте, шло с треком.
Кто то обзоры во сне пишет, а кто то комментарии ;)
Оно как бы не то что совсем бесполезное, и то и другое может пригодится, но одно другое не заменяет, потому смысл почти нулевой. Вроде и выкинуть рука не поднимается, и не применяю их в жизни.
Вот еще бы в заголовке возле стоимости написать, что цена — за 10 штук, а то так и до инфаркта не далеко от таких цен. :)
Припоминая старые времена и глядя на графическое обозначение микросхемы я понял, что у меня нормоконтроль такую схему не пропустил бы.
Вот что то вроде этого — пропустил бы.
И когда схема становится достаточно большой, все таки ее читать заметно легче.
Вполне неплохой проект реальной установки, хотя ваш диплом тоже думаю был хорош. Проект он на бумаге, а она как известно «Все стерпит». А подай на микру неправильное напряжение, из нее выйдет волшебный дым и все перестанет работать.
Правда, был этот процессор собран на двух платах 170х220 мм…
https://aliexpress.com/item/item/STM32F103C8T6-ARM-STM32-Minimum-System-Development-Board-Module-For-Arduin0/1568685935.html
Есть и с большим кол-вом ног.
Вот на русском вводная статейка
www.hobbylab.ru/robototechnics/1292/
Но этот Maple IDE никому не сдался и к Arduino IDE была прикручена поддержка этих плат.
Инструкция по установке
github.com/rogerclarkmelbourne/Arduino_STM32/wiki/Installation
Вот форум (на английском)
stm32duino.com/
Что касается куба, то вот пожалуйста проект готовый, разве что на PIC микроконтроллере: picprojects.org.uk/projects/lc/index.htm