Сегодня я постараюсь рассказать вам немного о регистрах сдвига. Это довольно важная часть программирования Arduino, в основном потому, что они увеличивают количество выходов, которые вы можете использовать, в обмен только на 3 управляющих контакта. Вы также можете объединить регистры сдвига гирляндной цепи, чтобы получить еще больше выходов.
Это значительный скачок в сложности из предыдущих уроков, и я настоятельно рекомендую вам действительно хорошо разбираться в предыдущем материале (ссылки в конце этой статьи), а также в понимании основ двоичного кода что я написал в прошлый раз.
Что такое сдвиговый регистр?
Технически говоря, выходной сдвиговый регистр принимает данные последовательно и выводит их параллельно. С практической точки зрения это означает, что мы можем быстро отправить кучу команд вывода на чип, сказать ему активировать, и выводы будут отправлены на соответствующие выводы. Вместо того, чтобы перебирать каждый вывод, мы просто отправляем вывод, необходимый для всех выводов одновременно, в виде одного байта или более информации.
Если это поможет вам понять, вы можете думать о сдвиговом регистре как о «массиве» цифровых выходов, но мы можем пропустить обычные команды digitalWrite и просто отправить серию битов, чтобы включить или выключить их.
Как это работает?
Сдвиговый регистр, который мы будем использовать — 74HC595N, включенный в стартовый комплект Oomlout, — требует только 3 управляющих контакта. Первый — это часы — вам не нужно сильно беспокоиться об этом, поскольку последовательные библиотеки Arduino управляют им, — но часы — это, в основном, электрический импульс включения / выключения, который задает темп сигнала данных.
Защелкивающийся штырь используется, чтобы сообщить сдвиговому регистру, когда он должен включать и выключать свои выходы в соответствии с битами, которые мы только что отправили, т. Е. Зафиксировать их на месте.
Наконец, вывод данных — это то место, куда мы отправили фактические последовательные данные с битами, чтобы определить состояние включения / выключения выходов регистра сдвига.
Весь процесс можно описать в 4 этапа:
- Установите вывод данных на высокий или низкий для первого выходного контакта на сдвиговом регистре.
- Импульсные часы, чтобы «сдвинуть» данные в регистр.
- Продолжайте устанавливать данные и пульсировать часы, пока не установите необходимое состояние для всех выходных контактов.
- Нажмите на фиксатор, чтобы активировать выходную последовательность.
Реализация
Вам нужны следующие компоненты для этого проекта:
- 7HC595N чип сдвигового регистра
- 8 светодиодов и соответствующие резисторы, или все, что вы хотите вывести на
- Обычный макет, разъемы и базовый Arduino
Если у вас есть стартовый комплект Oomlout , вы можете скачать макет отсюда.
Вот видео сборки:
Макет платы:
И мой собранный вариант:
Я изменил исходный код, предоставленный Ooolmout, но если вы хотите попробовать это вместо этого, его можно полностью загрузить здесь . Объяснение кода включено, поэтому скопируйте и вставьте все это снизу или вставьте, чтобы прочитать объяснение кода.
/ * ------------------------------------------------ ---------
* | Учебник Shift Register, основанный на |
* | Экспериментальный комплект Arduino CIRC-05 |
* | .: 8 Больше светодиодов:. (Сдвиговый регистр 74HC595) |
* ------------------------------------------------- --------
* | Модифицировано Джеймсом @ .com |
* ------------------------------------------------- --------
* /
// Pin Pin Definitions
// 7HC595N имеет три контакта
int data = 2; // куда мы отправляем биты на управляющие выходы
int clock = 3; // синхронизируем данные
int latch = 4; // сообщает регистру сдвига, когда активировать выходную последовательность
void setup ()
{
// установить три вывода управления для вывода
pinMode (данные, ВЫХОД);
pinMode (часы, ВЫХОД);
pinMode (защелка, ВЫХОД);
Serial.begin (9600); // чтобы мы могли отправлять отладочные сообщения на последовательный монитор
}
void loop () {
outputBytes (); // наш основной вывод, который записывает 8 бит, чтобы показать, как работает регистр сдвига.
// outputIntegers (); // отправляет целое значение в виде данных вместо байтов, эффективно считая в двоичном виде.
}
void outputIntegers () {
для (int i = 0; i <256; i ++) {
digitalWrite (защелка, LOW);
Serial.println (я); // Отладка, отправка вывода на последовательный монитор
shiftOut (данные, часы, MSBFIRST, i);
digitalWrite (защелка, ВЫСОКАЯ);
задержки (100);
}
}
void outputBytes () {
/ * Байты или 8 битов представлены символом B, за которым следуют 8 0 или 1 с.
В этом случае рассмотрим это как массив, который мы будем использовать для управления
8 светодиодов. Здесь я начал байтовое значение как 00000001
* /
byte dataValues = B00000001; // изменить это, чтобы настроить начальный шаблон
/ * В цикле for мы начинаем тянуть защелку низко,
используя функцию shiftOut Arduino для связи со сдвиговым регистром,
отправив наш байт dataValues, представляющий состояние светодиодов
затем потяните защелку высоко, чтобы зафиксировать их на месте.
Наконец, мы сдвигаем биты на одну позицию влево, что означает следующую итерацию
включит следующий светодиод в серии.
Чтобы увидеть точное двоичное значение, проверьте последовательный монитор.
* /
для (int i = 0; i <8; i ++) {
digitalWrite (защелка, LOW);
Serial.println (dataValues, BIN); // Отладка, отправка вывода на последовательный монитор
shiftOut (данные, часы, MSBFIRST, dataValues);
digitalWrite (защелка, ВЫСОКАЯ);
dataValues = dataValues << 1; // Сдвиньте биты на одну позицию влево - измените на >>, чтобы настроить направление
задержки (100);
}
}
Сдвиг битов (функция OutputBytes)
В первом примере цикла — outputBytes () — код использует 8-битную последовательность (байт), которую затем сдвигает влево на каждую итерацию цикла for. Важно отметить, что если вы сдвигаетесь дальше, чем это возможно, бит просто теряется.
Сдвиг битов выполняется с помощью << или >>, за которым следует число битов, на которое вы хотите сместить.
Посмотрите на следующий пример и убедитесь, что вы понимаете, что происходит:
байт val = B00011010
val = val << 3 // B11010000
val = val << 2 // B01000000, мы потеряли эти другие биты!
val = val >> 5 // B00000010
Отправка целых чисел вместо (функция OutputIntegers)
Если вы отправите целое число в регистр сдвига вместо байта, он просто преобразует число в двоичную последовательность байтов. В этой функции (раскомментируйте в цикле и загрузите, чтобы увидеть эффект), у нас есть цикл for, который отсчитывает от 0 до 255 (самое большое целое число, которое мы можем представить одним байтом), и отправляет его вместо этого. Это в основном считается в двоичном формате, поэтому последовательность может показаться немного случайной, если ваши светодиоды не расположены в длинной строке.
Например, если вы прочитаете статью с пояснениями в двоичном формате, вы будете знать, что число 44 будет представлено как 00101100, поэтому светодиоды 3,5,6 будут светиться в этой точке последовательности.
Последовательность маргариток больше, чем в одну смену
Что примечательно в регистрах сдвига, так это то, что если им дается более 8 бит информации (или как бы велик их реестр), они снова вытесняют другие дополнительные биты. Это означает, что вы можете соединить серию из них вместе, вставить одну длинную цепочку битов и распределить ее по каждому регистру отдельно, и все это без дополнительного кодирования с вашей стороны.
Хотя мы не будем здесь подробно описывать процесс или схемы, если у вас более одного сменного регистра, вы можете попробовать проект с официального сайта Arduino здесь.
Другие статьи в серии:
- Что такое Arduino и что с ним можно делать ?
- Что такое стартовый комплект Arduino и что в нем содержится?
- Более крутые компоненты для покупки с вашим стартовым комплектом
- Начало работы с вашим стартовым комплектом Arduino? Установка драйверов и настройка платы и порта
- Fritzing, бесплатный инструмент для рисования принципиальных схем
- Более пристальный взгляд на структуру приложения Arduino и пример программы Blink
- Проект Arduino Xmas Tree Проект (AKA узнает о массивах)
- Что такое бинарный?
Это так же далеко, как мы сегодня пойдем со сменными регистрами, так как я думаю, что мы многое рассмотрели. Как всегда, я бы посоветовал вам поиграть и настроить код, и не стесняйтесь задавать любые вопросы, которые могут возникнуть в комментариях, или даже делиться ссылкой на ваш удивительный проект на основе регистра сдвига.