Множим выходы Ардуино, сдвиговый регистр 74HC595

Сегодня вы узнаете как сэкономить или умножить порты ардуино с помощью сдвиговых регистров 74HC595. Разберем как подключается сдвиговый регистр, как его использовать в примерах скетчей.

Стандартная проблема с ардуино (и с любыми микроконтроллерами) – это относительно небольшое количество портов ввода-вывода, которые очень быстро расходуются на подключение различной периферии.

Ведь, например, захотим мы поморгать 5ю светодиодами, как в экспериименте Эффект преследования, – уже минус 5 портов.  Захотим подключить светодиодный индикатор на одну цифру – минус 8 портов! А 4-хзначный индикатор отнимет уже целых 12 портов, и на подключение датчиков и прочей периферии уже почти ничего не осталось!

Если вы с такой проблемой еще не столкнулись – можете пока переходить к следующему эксперименту. Просто помните, что решение есть! 😉

Чтобы решить проблему нехватки портов существует несколько способов. В этом эксперименте мы разберем один из них – применить сдвиговый регистр.

Наиболее популярным сдвиговым регистром в любительской электронике является микросхема 74HC595 (или просто – 595).

Сдвиговый регистр 74HC595

Проще говоря, Сдвиговый регистр – это набор последовательно соединённых триггеров, а в 74HC595 их целых 8 штук, что позволяет управлять 8ю цифровыми портами, используя лишь 3 порта микроконтроллера!

Здесь я не буду подробно останавливаться на том как устроен и как работает сдвиговый регистр.

Вместо этого я просто покажу как его применять!

Подключение сдвигового регистра 595

Распиновка (pinout) сдвигового регистра 595 (74HC595)

74HC595 pinout, распиновка, контакты
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

Соберем такую схему:

Сдвиговый регистр 74HC595 схема подключения  к арудино
Ардуино и сдвиговый регистр 595 (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 пина ардуино, возможно управлять неограниченным числом выходов. Давайте взглянем как это можно сделать с двумя сдвиговыми регистрами.

Схема соединения двух сдвиговых регистров в цепочку выглядит следующим образом:

Подключение нескольких сдвиговых регистров 74HC595 к ардуино
Ардуино и несколько сдвиговых регистров 74HC595

Я не буду рисовать светодиоды и резисторы. Думаю, принцип вы уже поняли 😉 выше.

Поскольку теперь у нас 2 байта информации, программу нужно немного модифицировать. И, пожалуй, подготовим ее сразу для работы с любым числом сдвиговых регистров!

Заключение

Теперь вы сможете сэкономить пины, подключая к ардуино семисегментный индикатор, и даже сделать свой первый светодиодный ку б ардуино! 😉

Только имейте в виду, что при увеличении потребителей, растет… и потребление, и вам однозначно потребуется хороший внешний источник 5V, и уж во всяком случае не питайте такое количество светодиодов от ардуино!

Для работы со сдвиговыми регистрами существуют и библиотеки.

Одной из таких популярных библиотек является библиотека ShiftRegister74HC595

Однако, будьте уверены, что она тут же отъест изрядный объем памяти и ее работа никогда не будет быстрее, чем самостоятельный вызов функции shiftOut.

Нашли ошибку? С чем-то не согласны? Или просто хотите поблагодарить? Пожалуйста, напишите мне в комментариях ниже ; 😉

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *