Arduino:Основы/Ввод данных при помощи сдвигового регистра CD4021BE

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 3377 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ввод данных при помощи сдвигового регистра CD4021BE[1]

Иногда вашему проекту нужно больше входных контактов, чем может предложить Arduino. Используя сдвиговый регистр (преобразующий параллельные данные в последовательные), вы можете собирать информацию с 8 (и даже больше) переключателей при помощи всего 3 контактов Arduino.

Одним из таких регистров является CD4021B, который также называют иногда «8-разрядным статическим сдвиговым регистром». Это значит, что вы можете считывать состояния с 8 цифровых линий ввода данных, подключенных к этому регистру. Данный метод называют «асинхронным параллельным вводом данных». «Ввод данных» – потому что вы собираете информацию, «параллельный» – потому что все данные идут одновременно, и «асинхронный» – потому что CD4021B собирает данные в собственном ритме (такте), без какой-либо координации с Arduino.

Данные, идущие от 8 устройств ввода, трансформируются в серию импульсов HIGH и LOW, а затем передаются на контакт сдвигового регистра, предназначенный для последовательного вывода данных (в оригинале – «serial-out» или «serial-output»). Этот контакт нужно подключить к входному контакту на Arduino, который называется «контактом для данных». Передачу данных на этот контакт называют «синхронным последовательным выводом данных», потому что в данном случае сдвиговый регистр поступает не своевольно, а ждет, когда Arduino запросит у него эти данные, а передаваемые данные выстроены в линейную (т.е. последовательную) «цепочку». Синхронная последовательная коммуникация (независимо от того, вводятся данные или выводятся) сильно зависит от так называемого «тактового контакта». Это своеобразный метроном, координирующий «разговор» между сдвиговым регистром и Arduino – благодаря ему коммуникация между двумя устройствами остается «синхронной». Каждый раз, когда Arduino меняет значение на тактовом контакте с LOW на HIGH, сдвиговый регистр меняет состояние на контакте «serial-out», что сообщает Arduino о переходе к значению от следующего переключателя.

Третий контакт Arduino, необходимый для коммуникации со сдвиговым регистром – это «контакт управления параллельно-последовательной коммуникацией». Его также называют «контактом-защелкой». Когда контакт-защелка находится в состоянии HIGH, сдвиговый регистр считывает параллельные данные с 8 устройств ввода. Но когда контакт-защелка переключается в состояние LOW, сдвиговый регистр начинает «слушать» тактовый контакт и передавать последовательные данные через контакт для данных. Это значит, что каждый раз, когда контакт-защелка переключается из HIGH в LOW, сдвиговый регистр начинает передавать Arduino самые последние данные от 8 устройств ввода.

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

  • Сначала нужно убедиться, что регистр обладает самой последней информацией, считанной с устройств ввода (т.е. в том, что контакт-защелка находится в состоянии HIGH)
  • Затем говорим регистру, что Arduino готова к получению последовательных данных (переключаем контакт-защелку в состояние LOW)
  • Даем импульсы на тактовый контакт (по импульсу для каждого устройства ввода) и проверяем, в каком состоянии находится контакт для данных – HIGH или LOW

Вот как это выглядит графически:

Ввод данных ->  |     |
Ввод данных ->  |  C  |
Ввод данных ->  |  D  |
Ввод данных ->  |  4  | -> Передача последовательных данных на Arduino
Ввод данных ->  |  0  |
Ввод данных ->  |  2  |
Ввод данных ->  |  1  | <- Передача тактовых данных от Arduino
Ввод данных ->  |_____| <- Передача «защелкивающих» данных от Arduino

Дополнительно об использовании сдвиговых регистров можно прочесть в этом руководстве.

Перед тем, как вы начнете строить цепь, имеет смысл ознакомиться с распиновкой CD4021 из даташита Texas Instruments:

Shftin cd4021 pins.png
Контакты 1, 4-7, 13-15 P1-P8 (0-7) Контакты для параллельного ввода данных
Контакты 2, 12, 3 Q6, Q7, Q8 Контакты для последовательного вывода данных, предназначенные для разных участков цепочки данных. Q7 – это импульс, идущий за Q8, а Q6 – за Q7. В скетчах используется только Q8.
Контакт 8 Vss Контакт для «земли»
Контакт 9 P/S C Контакт для управления параллельно-последовательной коммуникацией (контакт-защелка)
Контакт 10 CLOCK Тактовый контакт на сдвиговом регистре
Контакт 11 SERIAL-IN Контакт для ввода последовательных данных
Контакт 16 Vdd Контакт для питания постоянным током

Пример 1: Использование одного сдвигового регистра

Сначала сдвиговый регистр нужно обеспечить питанием. Для этого нужно подключить следующие контакты:

  • Vss (контакт 8) на регистре к «земле» на Arduino
  • Vdd (контакт 16) на регистре к 5V на Arduino
ShftInExmp1 1.png

Затем к Arduino нужно подключить 3 «интерфейсных» контакта:

  • Q8 (контакт 3) на регистре к цифровому контакту 9 на Arduino (синий провод)
  • CLOCK (контакт 10) на регистре к цифровому контакту 7 на Arduino (желтый провод)
  • P/S C (контакт 9) на регистре к цифровому контакту 8 на Arduino (зеленый провод)

В скетчах эти контакты будут называться dataPin(контакт для данных), clockPin (тактовый контакт) и latchPin (контакт-защелка) соответственно:

ShftInExmp1 2.png

Далее подключаем 8 переключателей:

ShftInExmp1 3.png

Так будет выглядеть вся схема:

One shift register scheme.jpg

Ниже – скетчи, которые можно использовать вместе с этой цепью:

Пример 2: Использование нескольких сдвиговых регистров

В этом примере к цепи добавляется еще один сдвиговый регистр, удваивающий количество входных контактов. При этом количество контактов, используемых на Arduino (т.е. три), останется неизменным.

Если 8 дополнительных цифровых контактов для вашего проекта недостаточно, вы можете подключить к цепи еще один сдвиговый регистр. Впрочем, он будет передавать данные на Arduino не напрямую, а через первый сдвиговый регистр, т.е. в результате первый регистр будет передавать на Arduino 16-битный (8 бит от одного регистра и 8 бит от другого) поток данных. Если вы хотите использовать в своем проекте несколько сдвиговых регистров, обязательно проверьте, чтобы они поддерживали не только синхронный последовательный вывод данных (т.е. «synchronous serial output»), но и синхронный последовательный ввод данных (т.е. «synchronous serial input»). Синхронный последовательный ввод данных – это функция, которая позволяет первому сдвиговому регистру получать и отправлять выходные последовательные данные от второго регистра. То, как работает эта система, показано на графике ниже. Более того, эту «гирляндную» цепь можно расширить (но в разумных пределах), добавив еще сдвиговых регистров.

Ввод данных ->  |     |
Ввод данных ->  |  C  |
Ввод данных ->  |  D  |
Ввод данных ->  |  4  | -> Передача последовательных данных на Arduino
Ввод данных ->  |  0  |
Ввод данных ->  |  2  | <- Передача тактовых данных от Arduino
Ввод данных ->  |  1  | <- Передача «защелкивающих» данных от Arduino
Ввод данных ->  |_____| <------
                              |
                              |          
                              |
                _______       |  Последовательные данные, передаваемые               
Ввод данных ->  |     |       |  первому сдвиговому регистру
Ввод данных ->  |  C  |       |
Ввод данных ->  |  D  |       |
Ввод данных ->  |  4  | ______|
Ввод данных ->  |  0  |
Ввод данных ->  |  2  | <- Передача тактовых данных от Arduino
Ввод данных ->  |  1  | <- Передача «защелкивающих» данных от Arduino
Ввод данных ->  |_____|

Добавляем второй сдвиговый регистр.

ShftInExmp2 1.png

Соединяем сдвиговые регистры друг с другом. Два «интерфейсных» контакта второго сдвигового регистра (для тактового сигнала и «защелкивания») можно подключить к тем же контактам Arduino, которые использует первый регистр (речь о clockPin и latchPin). Это желтый и зеленый провода. Дополнительный синий провод нужен для того, чтобы передать последовательные данные от второго регистра (они выходят из него через контакт Q8) первому (они поступают в него через контакт SERIAL-IN).

ShftInExmp2 2.png

Подключаем еще 8 переключателей. Обратите внимание, что среди них 7 тумблеров и лишь 1 нажимная кнопка – это сделано для удобства пользователя. Дело в том, что переключатели на втором регистре будут работать чем-то вроде «файла настроек», а не триггерами, запускающими какие-либо события. То есть 7 тумблеров отвечают за различные настройки, а оставшаяся кнопка, добавленная для наглядности, предназначена для включения/выключения режима изменения этих настроек.

ShftInExmp2 3.png

Так будет выглядеть вся схема:

Multiple shift register scheme.jpg

Ниже – скетчи, которые можно использовать вместе с этой цепью:

См.также

Внешние ссылки

  1. www.arduino.cc - Parallel to Serial Shifting-In with a CD4021BE