Этот обзор посвящен, собственно, начинающим пользователям 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
Если вам надо много а скорости мозгов не хватает, то попробуйте КР1533ИР9 — Аналог SN74ALS165 представляет собой восьмиразрядный сдвиговый регистр с параллельной записью и имеет два режима работы: параллельная загрузка и сдвиг. Те же 16 ног. При необходимости можно динамически переключиться на параллельную запись с экономией по тактам.
Клок ведь для каждой следующей ступени нужен отдельный? Выставили на первой ступени восемь бит данных, дрыгнули ногой синхронизации второй ступени — биты ушли во вторую ступень. Значит количество ступеней таки ограничено количеством ног? Или я неправильно понимаю?
И нагрузочной способность выходов контроллера, к которым подключаются регистры (SH_CP, ST_CP), а так же паразитными интуктивностями и ёмкостями, но это уже больше касается скорости обновления дааных.
Hi!
А кто нам мешает подклить параллельный регистр? :-)
Тот же ИР23 в КМОП исполнении (74hc374). Можно и ИР22 (74hc373) подцепить и его же в качестве буфера использовать ;-)
Если кого смущает нагрузочная способность — буферни выходА :-)
А если LCD к платке подключен — вешай ИР34 (74hc873) на те же выходы сколько угодно, только стробировать не забывай!
А вот со сдвиговым регистром легко наступить на «грабли» с пробеганием битов и ложными срабатываниями, т.е. надо вешать те же «защелки» на «критичные» выходы…
Btw, сдвиговый регистр я еще в прошлом веке :-D подключал к 51-му — на плате с LCD и кнопками по SPI. Для опроса клавиатуры с платы тяенется всего одна веревка и вешается на вход прерывания. На нее вешай сколько угодно кнопок и подтяни к питанию, для ожидания обнули шифтер, а по прерыванию опрашивай через SPI ;-)
Yours sincerely, Dmitry aka wcat
А почему не дешифратор или не счетчик? Или регистр защелка? Еще столько обзоров можно написать... Жаль большинство аудитории не поймет о чем речь.
Кстати для управления матрицей светодиодов можно использовать MAX7219 переходите на более высокий уровень.
и при построении больших светодиодных матриц это — почему бы и нет — динамическую индикацию никто не отменял. У сдвигового регистра уж больно производительность падает при масштабировании.
А если все же использовать регистры защелки, то можно и память нарастить внешнюю прилично с экономией по выводам. я на х51 по крайней мере так и делал. С Arduino к сожалению не сталкивался, организацию внутреннюю не знаю.
А кто спорит? Можно вообще ПЛИС поставить и зашить в ней любую логику.
Все зависит от задачи.
… все знают, что 2И-НЕ/2ИЛИ-НЕ — достаточный элемент для реализации логики любой сложности, но мало кто это делает.
То же и тут — надо смотреть, что хочется, и соответственно делать.
Тогда не пойму — почему не это?
А быстродействие…
Никто ведь не заставляет делать одну линии на 1024 светодиода — можно сделать 4 по 256, к примеру.
Это если имеется в виду быстродействие именно светодиодов, время распространения сигнала.
Если про контролер — то тут только выбирать контролер пошустрее, оптимизировать программу…
Чуть более дорогой вариант max7219, но имеет преимущества — 1 микросхема может управлять матрицей 8х8 светодиодов, для нее нужен всего 1 резистор, позволяет управлять общей яркостью. Их тоже можно подключать каскадно и всего 3 управляющих сигнала.
А если использовать DM633 — то можно управлять яркостью каждого светодиода отдельно, на них делают подсветку Lightpack.
Тоже получил такие микрухи, правда весьма оригинальным образом, думал даже обзор запилить, но передумал.
Увидел обзор, сразу вспомнился этот заказ.
Картинка из серии — ожидание и реальность :)))
Мдя уж…
Это мне напомнило, как я заказал набор из 10 цанг для дремеля, а получил 10 ватных тампонов для него же…
И фото в вопросе продавцу выглядело примерно так же. :)
Причем вполне возможно что в итоге этот заказ тоже валяется в ящике стола.
Оно как бы не то что совсем бесполезное, и то и другое может пригодится, но одно другое не заменяет, потому смысл почти нулевой. Вроде и выкинуть рука не поднимается, и не применяю их в жизни.
Также какое-то время использовал регистры, но на последних проектах перешел на PCF8574, раз в 5 дороже чем вариант с регистрами, но оказалось намного удобней. И гибкость и масштабируемость на уровне. Может кому пригодится. Но как говорится, всё под свои задачи :)
За обзор плюс.
Вот еще бы в заголовке возле стоимости написать, что цена — за 10 штук, а то так и до инфаркта не далеко от таких цен. :)
Припоминая старые времена и глядя на графическое обозначение микросхемы я понял, что у меня нормоконтроль такую схему не пропустил бы.
Вот что то вроде этого — пропустил бы.
И когда схема становится достаточно большой, все таки ее читать заметно легче.
У меня дипломный проект звучал, как «Проект 9ти этажного многоквартирного жилого дома с двухуровневой подземной стоянкой»… а у вас кубик… странное оно, образование в РФ. =)
Извините, не хочу обидеть проектировщиков, но за свою работу видел столько мерворожденных проектов, которые разбиваются о реальные агрегаты и сооружения.
Вполне неплохой проект реальной установки, хотя ваш диплом тоже думаю был хорош. Проект он на бумаге, а она как известно «Все стерпит». А подай на микру неправильное напряжение, из нее выйдет волшебный дым и все перестанет работать.
74HC595 на всякий случай покупал, теперь благодаря этому обзору стало понятнее на что они годятся. ;) Ещё прикупил вот такой мультиплексор, он вроде бы в обе стороны работает и хоть с цифрой, хоть с аналогом. Но тоже пока не опробованный, хотя идея о его применении есть, как раз на 16 PWM-портов…
Добрый день. Хотелось бы подробнее узнать про драйвер DM13A. И еще больше интереса представляет Ваш LED куб! Как реализовано? Только начал изучать Arduino вопросов много, а ответов не могу найти:(
С драйвером всё просто: он представляет собой сдвиговый регистр с 16 выходами, причём ток на выходе задаётся всего лишь одним резистором. То есть в случае со светодиодами это очень удобно, не нужно на каждый по отдельности ставить токоограничивающий резистор. Более подробная информация есть в даташите: e-neon.ru/user_img/catalog_datasheets/dm13a-a.003.pdf
Что касается куба, то вот пожалуйста проект готовый, разве что на PIC микроконтроллере: picprojects.org.uk/projects/lc/index.htm
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:g:mGUAAOSw37tV~XGV
ebay.com/itm/262091817958:m:mPR7slAO61AISasHic6yjRA
А если использовать DM633 — то можно управлять яркостью каждого светодиода отдельно, на них делают подсветку Lightpack.
Увидел обзор, сразу вспомнился этот заказ.
Картинка из серии — ожидание и реальность :)))
Это мне напомнило, как я заказал набор из 10 цанг для дремеля, а получил 10 ватных тампонов для него же…
И фото в вопросе продавцу выглядело примерно так же. :)
и что не так с 595?
Только фото ожидание и реальность надо поменять местами.
Пришло — заказывал. Там вообще на английском подписано.
Заказывал 20 мощных транзисторов, пришло две маломощных микрухи :)))
Причем заметьте, шло с треком.
Кто то обзоры во сне пишет, а кто то комментарии ;)
Оно как бы не то что совсем бесполезное, и то и другое может пригодится, но одно другое не заменяет, потому смысл почти нулевой. Вроде и выкинуть рука не поднимается, и не применяю их в жизни.
Вот еще бы в заголовке возле стоимости написать, что цена — за 10 штук, а то так и до инфаркта не далеко от таких цен. :)
Припоминая старые времена и глядя на графическое обозначение микросхемы я понял, что у меня нормоконтроль такую схему не пропустил бы.
Вот что то вроде этого — пропустил бы.
И когда схема становится достаточно большой, все таки ее читать заметно легче.
Вполне неплохой проект реальной установки, хотя ваш диплом тоже думаю был хорош. Проект он на бумаге, а она как известно «Все стерпит». А подай на микру неправильное напряжение, из нее выйдет волшебный дым и все перестанет работать.
Правда, был этот процессор собран на двух платах 170х220 мм…
aliexpress.com/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