Сегодня вы узнаете как сэкономить или умножить порты ардуино с помощью сдвиговых регистров 74HC595. Разберем как подключается сдвиговый регистр, как его использовать в примерах скетчей.
Стандартная проблема с ардуино (и с любыми микроконтроллерами) – это относительно небольшое количество портов ввода-вывода, которые очень быстро расходуются на подключение различной периферии.
Ведь, например, захотим мы поморгать 5ю светодиодами, как в экспериименте Эффект преследования, – уже минус 5 портов. Захотим подключить светодиодный индикатор на одну цифру – минус 8 портов! А 4-хзначный индикатор отнимет уже целых 12 портов, и на подключение датчиков и прочей периферии уже почти ничего не осталось!
Если вы с такой проблемой еще не столкнулись – можете пока переходить к следующему эксперименту. Просто помните, что решение есть! ?
Чтобы решить проблему нехватки портов существует несколько способов. В этом эксперименте мы разберем один из них – применить сдвиговый регистр.
Наиболее популярным сдвиговым регистром в любительской электронике является микросхема 74HC595 (или просто – 595).
Сдвиговый регистр 74HC595
Проще говоря, Сдвиговый регистр – это набор последовательно соединённых триггеров, а в 74HC595 их целых 8 штук, что позволяет управлять 8ю цифровыми портами, используя лишь 3 порта микроконтроллера!
Здесь я не буду подробно останавливаться на том как устроен и как работает сдвиговый регистр.
Вместо этого я просто покажу как его применять!
Подключение сдвигового регистра 595
Распиновка (pinout) сдвигового регистра 595 (74HC595)
Пин | Название | Описание |
Пины 1-7, 15 | Q0-Q7 | Параллельные выходы сдвигового регистра |
Пин 8 | GND | Земля |
Пин 9 | Q7’ | Выход для последовательного соединения регистров |
Пин 10 | MR | Сброс значений регистра |
Пин 11 | SH_CP | Вход для тактовых импульсов (CLOCK) |
Пин 12 | ST_CP | Затвор (LATCH) |
Пин 13 | OE | Вход для переключения состояния выходов |
Пин 14 | DS | Вход для последовательных данных (DATA) |
Пин 16 | Vcc | 5V |
Необходимые компоненты
- 8 x светодиодов
- 8 x резисторов 220Ом
- 1 x сдвиговый регистр 74HC595
- Ардуино (нано, уно или другая), макетная плата, перемычки в ассортименте
Схема подключения сдвигового регистра 74HC595
Соберем такую схему:
Сдвиговый регистр, скетч
Загрузим в ардуино такой скетч:
/**
* Эксперимент № 16.1 Множим выходы с помощью сдвигового регистра 74HC595
*
* https://jarduino.ru
*
* Эксперименты с ардуино.
*/
const byte DATA_PIN = 4; // пин 14 74HC595 - ввод данных SI (DS)
const byte CLOCK_PIN = 2; // пин 11 74hc595 - clock pin SCK (SH_CP)
const byte LATCH_PIN = 3; // пин 12 74hc595 - затвор вывода, latch (ST_CP)
const unsigned long DELAY = 100UL;
// первичная настройка устройства
void setup()
{
pinMode(LATCH_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
}
void setShiftRegister(const byte ledState)
{
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, ledState); // записать сатус пина
// передернуть затвор:
digitalWrite(LATCH_PIN, LOW); // открыть затвор
digitalWrite(LATCH_PIN, HIGH); // закрыть затвор
}
// Пример 1. Бегущая полоса светодиодов
void example1()
{
byte ledsPattern{0};
for (byte i = 0; i < 8; ++i)
{
bitSet(ledsPattern, i);
setShiftRegister(ledsPattern);
delay(DELAY);
}
for (byte i = 0; i < 8; ++i)
{
bitClear(ledsPattern, i);
setShiftRegister(ledsPattern);
delay(DELAY);
}
}
// бесконечный цикл устройства
void loop()
{
// example1();
example2();
}
Результат
Данный скетч создает эффект бегущей полосы: сначала светодиоды по одному зажигаются, а затем по одному гаснут. Давайте разберемся как же это работает.
Как использовать сдвиговый реистр
На вход сдвигового регистра подаётся последовательность из бит (т.е. нолей и единиц). Биты подаются по одному, и каждый следующий бит сдвигает влево все предыдущие биты.
Магия данного процесса скрыта в функции shiftOut.
У сдвигового регистра 74HC595 всего 8 пинов на выходе (ножки Q0-Q7). Каждому пину соответствует 1 разряд вводимого в регистр байта. Функция shiftOut разом выставляет все пины сдвигового регистра.
Чтобы изменения вступили в силу, нужно передернуть затвор сдвигового регистра: подать на пин затвора (LATCH_PIN) сначала низкое, а затем высокое напряжение.
Чтобы отобразить бегущую полоску светодиодов, мы в переменной ledsPattern в цикле выставляем каждому разряду значение = 1, используя незамысловатый макрос bitSet.
0000001
0000011
0000111
…
1111111
Затем, используя аналогичный макрос bitClear, мы обнуляем разряды в цикле. Получаем:
1111110
1111100
1111100
…
0000000
Теперь давайте нарисуем несколько битовых картинок, которые мы будем отображать светодиодами с небольшой задержкой.
Чтобы указывать число в двоичной системе, в языке C++, используется префикс 0b, после которого указывается последовательность нолей и единиц нужной длины.
// массив светодиодных рисунков:
const byte leds_patterns[]{
0b10000001,
0b01000010,
0b00100100,
0b00011000,
0b00100100,
0b01000010,
0b10000001
};
Все что нам остается – это передать в цикле элементы массива в сдвиговый регистр, с небольшой временной задержкой.
// ....
// массив светодиодных рисунков:
const byte leds_patterns[]{
0b10000001,
0b01000010,
0b00100100,
0b00011000,
0b00100100,
0b01000010,
0b10000001
};
// Пример 2. Вывод битового рисунка из массива
void example2()
{
const byte patternsNum = sizeof(leds_patterns) / sizeof(*leds_patterns); // определяем длину массива
for (byte i = 0; i < patternsNum; ++i)
{
setShiftRegister(leds_patterns[i]);
delay(DELAY); // задержка чтобы видеть изменение картинки
}
}
// бесконечный цикл устройства
void loop()
{
// example1();
example2();
}
Поэкспериментируйте, составьте свои битовые рисунки, чтобы получить другой эффект.
Использование 2х и более сдвиговых регистров 74HC595
Используя всё те же 3 пина ардуино, возможно управлять неограниченным числом выходов. Давайте взглянем как это можно сделать с двумя сдвиговыми регистрами.
Схема соединения двух сдвиговых регистров в цепочку выглядит следующим образом:
Я не буду рисовать светодиоды и резисторы. Думаю, принцип вы уже поняли ? выше.
Поскольку теперь у нас 2 байта информации, программу нужно немного модифицировать. И, пожалуй, подготовим ее сразу для работы с любым числом сдвиговых регистров!
Заключение
Теперь вы сможете сэкономить пины, подключая к ардуино семисегментный индикатор, и даже сделать свой первый светодиодный ку б ардуино! ?
Только имейте в виду, что при увеличении потребителей, растет… и потребление, и вам однозначно потребуется хороший внешний источник 5V, и уж во всяком случае не питайте такое количество светодиодов от ардуино!
Для работы со сдвиговыми регистрами существуют и библиотеки.
Одной из таких популярных библиотек является библиотека ShiftRegister74HC595
Однако, будьте уверены, что она тут же отъест изрядный объем памяти и ее работа никогда не будет быстрее, чем самостоятельный вызов функции shiftOut.
Нашли ошибку? С чем-то не согласны? Или просто хотите поблагодарить? Пожалуйста, напишите мне в комментариях ниже ; ?